···251251252252# OAUTH_MAX_USER_CLIENTS=1
253253254254+# USER_REPORT_NOTIFICATION_ENDPOINT_CHEATING=
255255+# default if nothing specified for specific type
254256# USER_REPORT_NOTIFICATION_ENDPOINT_MODERATION=
255255-# USER_REPORT_NOTIFICATION_ENDPOINT_CHEATING=
257257+258258+# USER_REPORT_NOTIFICATION_ENDPOINT_BEATMAPSET=
259259+# USER_REPORT_NOTIFICATION_ENDPOINT_BEATMAPSET_DISCUSSION=
260260+# USER_REPORT_NOTIFICATION_ENDPOINT_CHAT=
261261+# USER_REPORT_NOTIFICATION_ENDPOINT_COMMENT=
262262+# USER_REPORT_NOTIFICATION_ENDPOINT_FORUM=
263263+# USER_REPORT_NOTIFICATION_ENDPOINT_USER=
256264257265# LOG_CHANNEL=single
258266
+3-1
.env.testing.example
···11-DB_DATABASE=osu_test
21DB_DATABASE_CHAT=osu_chat_test
32DB_DATABASE_MP=osu_mp_test
43DB_DATABASE_STORE=osu_store_test
54DB_DATABASE_UPDATES=osu_updates_test
65DB_DATABASE_CHARTS=osu_charts_test
7677+# match with docker-compose.yml
88+DB_DATABASE=osu_test
89ES_INDEX_PREFIX=test_
1010+SCHEMA=test
9111012PAYMENT_SANDBOX=true
+4-4
.github/workflows/tests.yml
···152152 run: ./bin/phpunit.sh
153153154154 # TODO: workaround things (beatmaps) being indexed during test above and not cleaned up.
155155- # This results in:
156156- # 1. ranked beatmapset with null approved date being indexed
157157- # 2. ES then returns Long.MIN_VALUE for null dates cursor
158158- # 3. and finally ES parser fails when parsing the Long.MIN_VALUE back when passed as cursor
155155+ # This used to cause beatmap listing returning cursor with Long.MIN_VALUE for null timetamp
156156+ # and errors out when trying to get the next page (es can't parse such value for timestamp)
157157+ # but has since been fixed.
158158+ # Something should still be done regarding es index between tests though.
159159 - name: Clean indexes
160160 run: php artisan es:index-documents --yes
161161
+1-1
README.md
···27272828While we have standards in place, nothing is set in stone. If you have an issue with the way code is structured; with any libraries we are using; with any processes involved with contributing, *please* bring it up. We welcome all feedback so we can make contributing to this project as pain-free as possible.
29293030-For those interested, we love to reward quality contributions via [bounties](https://docs.google.com/spreadsheets/d/1jNXfj_S3Pb5PErA-czDdC9DUu4IgUbe1Lt8E7CYUJuE/view?&rm=minimal#gid=523803337), paid out via paypal or osu! supporter tags. Don't hesitate to [request a bounty](https://docs.google.com/forms/d/e/1FAIpQLSet_8iFAgPMG526pBZ2Kic6HSh7XPM3fE8xPcnWNkMzINDdYg/viewform) for your work on this project.
3030+We love to reward quality contributions. If you have made a large contribution or are a regular contributor, you are welcome to [submit an expense via opencollective](https://opencollective.com/ppy/expenses/new). If you have any questions, feel free to [reach out to peppy](mailto:pe@ppy.sh) before doing so.
31313232## Seeking Help
3333
+1
SETUP.md
···319319or if using Docker:
320320321321```
322322+# `compose exec` doesn't work here due to port conflict with dev instance
322323docker compose run --rm php test browser
323324```
324325
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566-$factory->define(App\Models\Artist::class, function (Faker\Generator $faker) {
77- return [
88- 'name' => function () use ($faker) {
99- return $faker->lastName().' '.$faker->colorName();
1010- },
1111- 'description' => function () use ($faker) {
1212- return $faker->realText();
1313- },
1414- 'website' => function () use ($faker) {
1515- return $faker->safeEmailDomain();
1616- },
1717- 'cover_url' => '/images/headers/generic.jpg',
1818- 'header_url' => '/images/headers/generic.jpg',
1919- 'visible' => 1,
2020- ];
2121-});
66+declare(strict_types=1);
77+88+namespace Database\Factories;
99+1010+use App\Models\Artist;
1111+1212+class ArtistFactory extends Factory
1313+{
1414+ protected $model = Artist::class;
1515+1616+ public function definition(): array
1717+ {
1818+ return [
1919+ 'name' => fn() => "{$this->faker->lastName()} {$this->faker->colorName()}",
2020+ 'description' => fn() => $this->faker->realText(),
2121+ 'website' => fn() => $this->faker->safeEmailDomain(),
2222+ 'cover_url' => '/images/headers/generic.jpg',
2323+ 'header_url' => '/images/headers/generic.jpg',
2424+ 'visible' => 1,
2525+ ];
2626+ }
2727+}
+18-18
database/factories/BanchoStatsFactory.php
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566-/*
77-|--------------------------------------------------------------------------
88-| Model Factories
99-|--------------------------------------------------------------------------
1010-|
1111-| Here you may define all of your model factories. Model factories give
1212-| you a convenient way to create models for testing and seeding your
1313-| database. Just tell the factory how a default model should look.
1414-|
1515-*/
66+declare(strict_types=1);
77+88+namespace Database\Factories;
1691010+use App\Models\BanchoStats;
1711use Carbon\Carbon;
18121919-$factory->define(App\Models\BanchoStats::class, function (Faker\Generator $faker) {
2020- return [
2121- 'users_irc' => 100 + $faker->randomNumber(2),
2222- 'users_osu' => 10000 + $faker->randomNumber(4),
2323- 'multiplayer_games' => 200 + $faker->randomNumber(3),
2424- 'date' => new Carbon(),
2525- ];
2626-});
1313+class BanchoStatsFactory extends Factory
1414+{
1515+ protected $model = BanchoStats::class;
1616+1717+ public function definition(): array
1818+ {
1919+ return [
2020+ 'users_irc' => fn() => 100 + $this->faker->randomNumber(2),
2121+ 'users_osu' => fn() => 10000 + $this->faker->randomNumber(4),
2222+ 'multiplayer_games' => fn() => 200 + $this->faker->randomNumber(3),
2323+ 'date' => fn() => Carbon::now(),
2424+ ];
2525+ }
2626+}
+29-10
database/factories/BeatmapFailtimesFactory.php
···2233// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
55-$factory->define(App\Models\BeatmapFailtimes::class, function (Faker\Generator $faker) {
66- $array = [];
55+66+declare(strict_types=1);
77+88+namespace Database\Factories;
99+1010+use App\Models\BeatmapFailtimes;
1111+1212+class BeatmapFailtimesFactory extends Factory
1313+{
1414+ protected $model = BeatmapFailtimes::class;
1515+1616+ public function definition(): array
1717+ {
1818+ $array = [];
1919+2020+ for ($i = 1; $i <= 100; $i++) {
2121+ $field = 'p'.strval($i);
2222+ $array[$field] = rand(1, 10000);
2323+ }
72488- for ($i = 1; $i <= 100; $i++) {
99- $field = 'p'.strval($i);
1010- $array = array_merge($array, [$field => rand(1, 10000)]);
2525+ return $array;
1126 }
12271313- return $array;
1414-});
2828+ public function fail(): static
2929+ {
3030+ return $this->state(['type' => 'fail']);
3131+ }
15321616-$factory->state(App\Models\BeatmapFailtimes::class, 'fail', ['type' => 'fail']);
1717-1818-$factory->state(App\Models\BeatmapFailtimes::class, 'retry', ['type' => 'exit']);
3333+ public function retry(): static
3434+ {
3535+ return $this->state(['type' => 'exit']);
3636+ }
3737+}
+26-17
database/factories/BeatmapMirrorFactory.php
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566+declare(strict_types=1);
77+88+namespace Database\Factories;
99+610use App\Models\BeatmapMirror;
71188-$factory->define(BeatmapMirror::class, function (Faker\Generator $faker) {
99- return [
1010- 'base_url' => 'http://beatmap-download.test/',
1111- 'traffic_used' => rand(0, pow(2, 32)),
1212- 'secret_key' => function () use ($faker) {
1313- return $faker->password();
1414- },
1515- 'provider_user_id' => 2,
1616- 'enabled' => 1,
1717- 'version' => BeatmapMirror::MIN_VERSION_TO_USE,
1818- ];
1919-});
1212+class BeatmapMirrorFactory extends Factory
1313+{
1414+ protected $model = BeatmapMirror::class;
1515+1616+ public function default(): static
1717+ {
1818+ return $this->state([
1919+ 'mirror_id' => config('osu.beatmap_processor.mirrors_to_use')[0],
2020+ ]);
2121+ }
20222121-$factory->state(BeatmapMirror::class, 'default', function () {
2222- return [
2323- 'mirror_id' => config('osu.beatmap_processor.mirrors_to_use')[0],
2424- ];
2525-});
2323+ public function definition(): array
2424+ {
2525+ return [
2626+ 'base_url' => 'http://beatmap-download.test/',
2727+ 'traffic_used' => rand(0, pow(2, 32)),
2828+ 'secret_key' => fn() => $this->faker->password(),
2929+ 'provider_user_id' => 2,
3030+ 'enabled' => 1,
3131+ 'version' => BeatmapMirror::MIN_VERSION_TO_USE,
3232+ ];
3333+ }
3434+}
+19-23
database/factories/ChangelogFactory.php
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566-/*
77-|--------------------------------------------------------------------------
88-| Model Factories
99-|--------------------------------------------------------------------------
1010-|
1111-| Here you may define all of your model factories. Model factories give
1212-| you a convenient way to create models for testing and seeding your
1313-| database. Just tell the factory how a default model should look.
1414-|
1515-*/
66+declare(strict_types=1);
77+88+namespace Database\Factories;
1691010+use App\Models\Changelog;
1711use App\Models\User;
18121919-$factory->define(App\Models\Changelog::class, function (Faker\Generator $faker) {
2020- return [
2121- 'user_id' => function () {
2222- $u = User::inRandomOrder()->first() ?? User::factory()->create();
1313+class ChangelogFactory extends Factory
1414+{
1515+ protected $model = Changelog::class;
23162424- return $u->getKey();
2525- },
2626- 'prefix' => $faker->randomElement(['*', '+', '?']),
2727- 'category' => $faker->randomElement(['Web', 'Audio', 'Code', 'Editor', 'Gameplay', 'Graphics']),
2828- 'message' => $faker->catchPhrase,
2929- 'checksum' => $faker->md5,
3030- 'date' => $faker->dateTimeBetween('-6 weeks', 'now'),
3131- ];
3232-});
1717+ public function definition(): array
1818+ {
1919+ return [
2020+ 'user_id' => User::factory(),
2121+ 'prefix' => fn() => $this->faker->randomElement(['*', '+', '?']),
2222+ 'category' => fn() => $this->faker->randomElement(['Web', 'Audio', 'Code', 'Editor', 'Gameplay', 'Graphics']),
2323+ 'message' => fn() => $this->faker->catchPhrase(),
2424+ 'checksum' => fn() => $this->faker->md5,
2525+ 'date' => fn() => $this->faker->dateTimeBetween('-6 weeks'),
2626+ ];
2727+ }
2828+}
+18-6
database/factories/ChatFilterFactory.php
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566-$factory->define(App\Models\ChatFilter::class, function (Faker\Generator $faker) {
77- return [
88- 'match' => $faker->unique()->word,
99- 'replacement' => $faker->word,
1010- ];
1111-});
66+declare(strict_types=1);
77+88+namespace Database\Factories;
99+1010+use App\Models\ChatFilter;
1111+1212+class ChatFilterFactory extends Factory
1313+{
1414+ protected $model = ChatFilter::class;
1515+1616+ public function definition(): array
1717+ {
1818+ return [
1919+ 'match' => fn() => $this->faker->unique()->word,
2020+ 'replacement' => fn() => $this->faker->word,
2121+ ];
2222+ }
2323+}
+21-10
database/factories/ContestEntryFactory.php
···33// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
44// See the LICENCE file in the repository root for full licence text.
5566-$factory->define(App\Models\ContestEntry::class, function (Faker\Generator $faker) {
77- return [
88- 'user_id' => function () {
99- return App\Models\User::factory()->create()->user_id;
1010- },
1111- 'entry_url' => '/images/headers/generic.jpg',
1212- 'name' => $faker->words(3, true),
1313- 'masked_name' => $faker->words(3, true),
1414- ];
1515-});
66+declare(strict_types=1);
77+88+namespace Database\Factories;
99+1010+use App\Models\ContestEntry;
1111+use App\Models\User;
1212+1313+class ContestEntryFactory extends Factory
1414+{
1515+ protected $model = ContestEntry::class;
1616+1717+ public function definition(): array
1818+ {
1919+ return [
2020+ 'user_id' => User::factory(),
2121+ 'entry_url' => '/images/headers/generic.jpg',
2222+ 'name' => fn() => $this->faker->words(3, true),
2323+ 'masked_name' => fn() => $this->faker->words(3, true),
2424+ ];
2525+ }
2626+}
···1313{
1414 /**
1515 * Run the database seeds.
1616- *
1717- * @return void
1816 */
1919- public function run()
1717+ public function run(): void
2018 {
2121- $date = new Carbon();
1919+ $timestamp = Carbon::now();
22202323- //Create 500 new data points
2424- factory(BanchoStats::class, 500)->make()->each(function ($stat) use ($date) {
2525- $stat->date = $date;
2626- $stat->save();
2121+ // Create 500 new data points
2222+ for ($i = 0; $i < 500; $i++) {
2323+ BanchoStats::factory()->create(['date' => $timestamp]);
27242828- //Increment the dates by 5 each time
2929- $date->addMinutes(5);
3030- });
2525+ // Increment the timestamp by 5 each time
2626+ $timestamp->addMinutes(5);
2727+ }
3128 }
3229}
···2121 margin: 0;
2222 padding: 0;
2323 border: none;
2424+ // avoid right quote mark from overlapping the content in rare case
2525+ position: relative;
2426 }
25272628 &__quote-mark {
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344-import { BeatmapsetCardSize } from 'components/beatmapset-panel';
44+import { BeatmapsetCardSize } from 'beatmapset-panel';
55import { computed, makeObservable } from 'mobx';
66import { observer } from 'mobx-react';
77import core from 'osu-core-singleton';
+1-1
resources/js/beatmaps/search-content.tsx
···3344import BeatmapsetCardSizeSelector from 'beatmaps/beatmapset-card-size-selector';
55import VirtualListMeta from 'beatmaps/virtual-list-meta';
66-import BeatmapsetPanel, { beatmapsetCardSizes } from 'components/beatmapset-panel';
66+import BeatmapsetPanel, { beatmapsetCardSizes } from 'beatmapset-panel';
77import Img2x from 'components/img2x';
88import StringWithComponent from 'components/string-with-component';
99import { route } from 'laroute';
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344-import BeatmapsPopup from 'beatmapset-panel/beatmaps-popup';
54import BeatmapsetBadge from 'components/beatmapset-badge';
65import BeatmapsetCover from 'components/beatmapset-cover';
76import { CircularProgress } from 'components/circular-progress';
77+import StringWithComponent from 'components/string-with-component';
88+import TimeWithTooltip from 'components/time-with-tooltip';
99+import UserLink from 'components/user-link';
810import BeatmapJson from 'interfaces/beatmap-json';
911import BeatmapsetExtendedJson from 'interfaces/beatmapset-extended-json';
1012import BeatmapsetJson, { BeatmapsetStatus } from 'interfaces/beatmapset-json';
···2224import { formatNumber, formatNumberSuffixed } from 'utils/html';
2325import { trans } from 'utils/lang';
2426import { beatmapsetDownloadDirect } from 'utils/url';
2525-import StringWithComponent from './string-with-component';
2626-import TimeWithTooltip from './time-with-tooltip';
2727-import UserLink from './user-link';
2727+import BeatmapsPopup from './beatmaps-popup';
28282929export const beatmapsetCardSizes = ['normal', 'extra'] as const;
3030export type BeatmapsetCardSize = typeof beatmapsetCardSizes[number];
···100100 <span className='beatmapset-panel__stats-item-icon'>
101101 <i className={`fa-fw ${icon}`} />
102102 </span>
103103- <span>{formatNumberSuffixed(value, undefined, { maximumFractionDigits: 1, minimumFractionDigits: 0 })}</span>
103103+ <span>{formatNumberSuffixed(value)}</span>
104104 </div>
105105);
106106
-196
resources/js/components/comment-editor.coffee
···11-# Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22-# See the LICENCE file in the repository root for full licence text.
33-44-import BigButton from './big-button'
55-import { Spinner } from './spinner'
66-import UserAvatar from './user-avatar'
77-import { route } from 'laroute'
88-import core from 'osu-core-singleton'
99-import * as React from 'react'
1010-import TextareaAutosize from 'react-autosize-textarea'
1111-import { button, div, span } from 'react-dom-factories'
1212-import { onErrorWithCallback } from 'utils/ajax'
1313-import { classWithModifiers } from 'utils/css'
1414-import { InputEventType, makeTextAreaHandler } from 'utils/input-handler'
1515-import { trans } from 'utils/lang'
1616-1717-el = React.createElement
1818-1919-bn = 'comment-editor'
2020-2121-export class CommentEditor extends React.PureComponent
2222- constructor: (props) ->
2323- super props
2424-2525- @textarea = React.createRef()
2626-2727- @handleKeyDown = makeTextAreaHandler @handleKeyDownCallback
2828-2929- @state =
3030- message: @props.message ? ''
3131- posting: false
3232-3333-3434- componentDidMount: =>
3535- if @props.focus ? true
3636- @textarea.current?.selectionStart = -1
3737- @textarea.current?.focus()
3838-3939-4040- componentWillUnmount: =>
4141- @xhr?.abort()
4242-4343-4444- render: =>
4545- mode = @mode()
4646- canComment = @canComment()
4747-4848- placeholder =
4949- if mode in ['new', 'reply'] && !canComment
5050- @props.commentableMeta.current_user_attributes?.can_new_comment_reason ? trans('authorization.comment.store.disabled')
5151- else
5252- trans("comments.placeholder.#{mode}")
5353-5454- blockClass = classWithModifiers bn, @props.modifiers, fancy: mode == 'new'
5555-5656- div className: blockClass,
5757- if mode == 'new'
5858- div className: "#{bn}__avatar",
5959- el UserAvatar, user: currentUser, modifiers: ['full-circle']
6060-6161- el TextareaAutosize,
6262- className: "#{bn}__message"
6363- ref: @textarea
6464- value: @state.message
6565- placeholder: placeholder
6666- onChange: @onChange
6767- onKeyDown: @handleKeyDown
6868- disabled: !canComment || @state.posting
6969- div
7070- className: "#{bn}__footer"
7171- div className: "#{bn}__footer-item #{bn}__footer-item--notice hidden-xs",
7272- if canComment
7373- trans 'comments.editor.textarea_hint._',
7474- action: trans("comments.editor.textarea_hint.#{mode}")
7575-7676- if @props.close?
7777- div className: "#{bn}__footer-item",
7878- el BigButton,
7979- disabled: @state.posting
8080- modifiers: 'comment-editor'
8181- props:
8282- onClick: @props.close
8383- text: trans('common.buttons.cancel')
8484-8585- if currentUser.id?
8686- div className: "#{bn}__footer-item",
8787- el BigButton,
8888- disabled: @state.posting || !@isValid()
8989- isBusy: @state.posting
9090- modifiers: 'comment-editor'
9191- props:
9292- onClick: @post
9393- text:
9494- top:
9595- if @state.posting
9696- el Spinner, modifiers: 'center-inline'
9797- else
9898- @buttonText()
9999- else
100100- div className: "#{bn}__footer-item",
101101- el BigButton,
102102- extraClasses: ['js-user-link']
103103- modifiers: 'comment-editor'
104104- text: trans("comments.guest_button.#{mode}")
105105-106106-107107- buttonText: =>
108108- key =
109109- switch @mode()
110110- when 'reply' then 'reply'
111111- when 'edit' then 'save'
112112- when 'new' then 'post'
113113-114114- trans("common.buttons.#{key}")
115115-116116-117117- canComment: =>
118118- return false if !core.currentUser?
119119-120120- if @mode() in ['new', 'reply']
121121- @props.commentableMeta.current_user_attributes? && !@props.commentableMeta.current_user_attributes?.can_new_comment_reason?
122122- else
123123- true
124124-125125-126126- close: =>
127127- return unless @props.close?
128128-129129- initialMessage = @props.message ? ''
130130-131131- return if initialMessage != @state.message && !confirm(trans('common.confirmation_unsaved'))
132132-133133- @props.close()
134134-135135-136136- handleKeyDownCallback: (type, event) =>
137137- switch type
138138- when InputEventType.Cancel
139139- @close()
140140- when InputEventType.Submit
141141- @post()
142142-143143-144144- isValid: =>
145145- @state.message? && @state.message.length > 0
146146-147147-148148- mode: =>
149149- if @props.parent?
150150- 'reply'
151151- else if @props.id?
152152- 'edit'
153153- else
154154- 'new'
155155-156156-157157- onChange: (e) =>
158158- @setState message: e.target.value
159159-160160-161161- post: =>
162162- return if @xhr?
163163- return @props.close?() if @mode() == 'edit' && @state.message == @props.message
164164-165165- @setState posting: true
166166-167167- data = comment: message: @state.message
168168-169169- switch @mode()
170170- when 'reply', 'new'
171171- url = route 'comments.store'
172172- method = 'POST'
173173- data.comment.commentable_type = @props.commentableMeta.type
174174- data.comment.commentable_id = @props.commentableMeta.id
175175- data.comment.parent_id = @props.parent?.id
176176-177177- onDone = (data) =>
178178- @setState message: ''
179179- $.publish 'comments:new', data
180180- when 'edit'
181181- url = route 'comments.update', comment: @props.id
182182- method = 'PUT'
183183-184184- onDone = (data) ->
185185- $.publish 'comment:updated', data
186186-187187- @xhr = $.ajax url, {method, data}
188188- .always =>
189189- @setState posting: false
190190- .done (data) =>
191191- onDone(data)
192192- @props.onPosted?(@mode())
193193- @props.close?()
194194- .fail onErrorWithCallback(@post)
195195- .always =>
196196- @xhr = null
···1212import { createClickCallback, formatNumberSuffixed } from 'utils/html'
1313import { trans, transChoice } from 'utils/lang'
1414import ClickToCopy from './click-to-copy'
1515-import { CommentEditor } from './comment-editor'
1515+import CommentEditor from './comment-editor'
1616import CommentShowMore from './comment-show-more'
1717import DeletedCommentsCount from './deleted-comments-count'
1818import { ReportReportable } from './report-reportable'
···443443 onClick: @voteToggle
444444 disabled: @state.postingVote || !@props.comment.canVote
445445 span className: 'comment-vote__text',
446446- "+#{formatNumberSuffixed(@props.comment.votesCount, null, maximumFractionDigits: 1)}"
446446+ "+#{formatNumberSuffixed(@props.comment.votesCount)}"
447447 if @state.postingVote
448448 span className: 'comment-vote__spinner', el Spinner
449449 hover
+1-1
resources/js/components/comments.coffee
···99import { formatNumber } from 'utils/html'
1010import { trans } from 'utils/lang'
1111import { Comment } from './comment'
1212-import { CommentEditor } from './comment-editor'
1212+import CommentEditor from './comment-editor'
1313import CommentShowMore from './comment-show-more'
1414import { CommentsSort } from './comments-sort'
1515import DeletedCommentsCount from './deleted-comments-count'
···7171 $input = @$input()
72727373 currentInput = $input.val()
7474- data = "#{currentInput}\n\n#{data}" if currentInput
7474+ data = "#{currentInput}\n#{data}" if currentInput
75757676 $input.val(data).trigger('input')
7777 $input[0].selectionStart = data.length
+1-1
resources/js/interfaces/user-preferences-json.ts
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344-import { BeatmapsetCardSize } from 'components/beatmapset-panel';
44+import { BeatmapsetCardSize } from 'beatmapset-panel';
55import { ViewMode } from 'components/user-card';
66import { Filter, SortMode } from 'components/user-list';
77
···6666 componentDidMount: =>
6767 $.subscribe "user:update.#{@eventId}", @userUpdate
6868 $.subscribe "profile:page:jump.#{@eventId}", @pageJump
6969- $.subscribe "beatmapsetDiscussions:update.#{@eventId}", @discussionUpdate
7070- $(document).on "ajax:success.#{@eventId}", '.js-beatmapset-discussion-update', @ujsDiscussionUpdate
7169 $(window).on "scroll.#{@eventId}", @pageScan
72707371 pageChange()
···8482 componentWillUnmount: =>
8583 $.unsubscribe ".#{@eventId}"
8684 $(window).off ".#{@eventId}"
8787- $(document).off ".#{@eventId}"
88858986 $(window).stop()
9087 Timeout.clear @modeScrollTimeout
9188 @disposers.forEach (disposer) => disposer?()
9292-9393-9494- discussionUpdate: (_e, options) =>
9595- {beatmapset} = options
9696- return unless beatmapset?
9797-9898- discussions = @state.discussions
9999- posts = @state.posts
100100- users = @state.users
101101-102102- discussionIds = _.map discussions, 'id'
103103- postIds = _.map posts, 'id'
104104- userIds = _.map users, 'id'
105105-106106- # Due to the entire hierarchy of discussions being sent back when a post is updated (instead of just the modified post),
107107- # we need to iterate over each discussion and their posts to extract the updates we want.
108108- _.each beatmapset.discussions, (newDiscussion) ->
109109- if discussionIds.includes(newDiscussion.id)
110110- discussion = _.find discussions, id: newDiscussion.id
111111- discussions = _.reject discussions, id: newDiscussion.id
112112- newDiscussion = _.merge(discussion, newDiscussion)
113113-114114- newDiscussion.starting_post = newDiscussion.posts[0]
115115- discussions.push(newDiscussion)
116116-117117- _.each newDiscussion.posts, (newPost) ->
118118- if postIds.includes(newPost.id)
119119- post = _.find posts, id: newPost.id
120120- posts = _.reject posts, id: newPost.id
121121- posts.push(_.merge(post, newPost))
122122-123123- _.each beatmapset.related_users, (newUser) ->
124124- if userIds.includes(newUser.id)
125125- users = _.reject users, id: newUser.id
126126-127127- users.push(newUser)
128128-129129- @cache.users = @cache.discussions = @cache.userDiscussions = @cache.beatmaps = @cache.beatmapsets = null
130130- @setState
131131- discussions: _.reverse(_.sortBy(discussions, (d) -> Date.parse(d.starting_post.created_at)))
132132- posts: _.reverse(_.sortBy(posts, (p) -> Date.parse(p.created_at)))
133133- users: users
134891359013691 discussions: =>
···354309 @cache.userDiscussions = _.filter @state.discussions, (d) => d.user_id == @state.user.id
355310356311 @cache.userDiscussions
357357-358358-359359- ujsDiscussionUpdate: (_e, data) =>
360360- # to allow ajax:complete to be run
361361- Timeout.set 0, => @discussionUpdate(null, beatmapset: data)
+1-5
resources/js/modding-profile/posts.coffee
···5858 users: @props.users
5959 user: @props.users[post.user_id]
6060 read: true
6161+ readonly: true
6162 lastEditor: @props.users[post.last_editor_id] ? @props.users[null] if post.last_editor_id?
6262- # FIXME: These permissions are more restrictive than the correct ones in discussion
6363- # because they don't have the right data to check.
6464- canBeEdited: currentUser.is_admin
6565- canBeDeleted: canModerate
6666- canBeRestored: canModerate
6763 currentUser: currentUser
6864 a
6965 key: 'show-more'
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344-import BeatmapsetPanel from 'components/beatmapset-panel';
44+import BeatmapsetPanel from 'beatmapset-panel';
55import LazyLoad from 'components/lazy-load';
66import ProfilePageExtraSectionTitle from 'components/profile-page-extra-section-title';
77import ShowMoreLink from 'components/show-more-link';
+20-16
resources/js/profile-page/detail-bar.tsx
···3434 userId={this.props.user.id}
3535 />
36363737- {this.renderNonBotButtons()}
3737+ {this.props.user.is_bot ? this.renderMessageButton() : this.renderNonBotButtons()}
3838 </div>
3939 );
4040 }
41414242- private renderNonBotButtons() {
4343- if (this.props.user.is_bot) return null;
4242+ private renderMessageButton() {
4343+ if (!this.showMessageButton) return null;
44444545 return (
4646+ // extra div to allow using same user-action-button--profile-page
4747+ // like other buttons without resorting to additional styling
4848+ <div>
4949+ <a
5050+ className='user-action-button user-action-button--profile-page'
5151+ href={route('messages.users.show', { user: this.props.user.id })}
5252+ title={trans('users.card.send_message')}
5353+ >
5454+ <i className='fas fa-envelope' />
5555+ </a>
5656+ </div>
5757+ );
5858+ }
5959+6060+ private renderNonBotButtons() {
6161+ return (
4662 <>
4763 <FollowUserMappingButton
4864 alwaysVisible
···5268 userId={this.props.user.id}
5369 />
54705555- {this.showMessageButton &&
5656- // extra div to allow using same user-action-button--profile-page
5757- // like other buttons without resorting to additional styling
5858- <div>
5959- <a
6060- className='user-action-button user-action-button--profile-page'
6161- href={route('messages.users.show', { user: this.props.user.id })}
6262- title={trans('users.card.send_message')}
6363- >
6464- <i className='fas fa-envelope' />
6565- </a>
6666- </div>
6767- }
7171+ {this.renderMessageButton()}
68726973 {showExtraMenu(this.props.user) && <ExtraMenu user={this.props.user} />}
7074
···22// See the LICENCE file in the repository root for full licence text.
3344import EventJson from 'interfaces/event-json';
55+import core from 'osu-core-singleton';
56import * as React from 'react';
67import { Modifiers } from 'utils/css';
78import { trans } from 'utils/lang';
···4748 },
4849 };
49505050- case 'beatmapsetDelete':
5151+ case 'beatmapsetDelete': {
5252+ const canView = core.currentUser != null && (core.currentUser.is_bng || core.currentUser.is_moderator);
5353+5154 return {
5255 badge: <span className='far fa-trash-alt' />,
5356 iconModifiers: 'danger',
5457 mappings: {
5555- beatmapset: event.beatmapset.title,
5858+ beatmapset: canView
5959+ ? <a href={event.beatmapset.url}>{event.beatmapset.title}</a>
6060+ : event.beatmapset.title,
5661 },
5762 };
6363+ }
58645965 case 'beatmapsetRevive':
6066 return {
+1-1
resources/js/register-components.tsx
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344+import BeatmapsetPanel, { Props as BeatmapsetPanelProps } from 'beatmapset-panel';
45import BeatmapsetEvents, { Props as BeatmapsetEventsProps } from 'components/beatmapset-events';
55-import BeatmapsetPanel, { Props as BeatmapsetPanelProps } from 'components/beatmapset-panel';
66import BlockButton from 'components/block-button';
77import ChatIcon from 'components/chat-icon';
88import { Comments } from 'components/comments';
···199199200200 'rank_estimate' => [
201201 '_' => 'هذه الخريطة مقدرة بأن تصبح Ranked في :date إذا لم يتم العثور على أي مشاكل. انها#:position في :queue.',
202202+ 'on' => '',
202203 'queue' => 'قائمة انتظار الترتيب',
203204 'soon' => 'قريبًا',
204205 ],
···199199200200 'rank_estimate' => [
201201 '_' => 'Гэтая карта cможа маць рэйтынг :date, калі праблем не знойдзена. Гэта #:position у :queue.',
202202+ 'on' => '',
202203 'queue' => 'чаргу ў рэйтынг',
203204 'soon' => 'хутка',
204205 ],
+1-1
resources/lang/bg/authorization.php
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Този бийтмап е заключен за дискусии.',
57575858 'metadata' => [
5959 'nominated' => 'Не може да се променят метаданните на номиниран бийтмап. Свържете се с номинатор или NAT член ако смятате, че са зададени грешно.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Този бийтмап ще бъде класиран на :date ако не открием проблеми. Той е #:position на :queue.',
202202+ 'on' => '',
202203 'queue' => 'опашката',
203204 'soon' => 'скоро',
204205 ],
+2-2
resources/lang/bg/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Форуми',
2929 'latest_post' => 'Последна публикация',
30303131 'index' => [
···4848 'confirm_restore' => 'Наистина ли искате да възстановите публикацията?',
4949 'edited' => 'Последно редактирано от :user :when, общо :count_delimited път.|Последно редактирано от :user :when, общо :count_delimited пъти.',
5050 'posted_at' => 'публикувано :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'публикувано от :username в :forum',
52525353 'actions' => [
5454 'destroy' => 'Изтриване на публикация',
···200200201201 'rank_estimate' => [
202202 '_' => 'S\'estima que aquest mapa es classificarà en :date si no es troben problemes. És el número :position a la :queue.',
203203+ 'on' => '',
203204 'queue' => 'cua de classificació',
204205 'soon' => 'aviat',
205206 ],
···199199200200 'rank_estimate' => [
201201 '_' => 'Odhaduje se, že tato mapa bude schválena :date, pokud nejsou nalezeny žádné problémy. Aktuálně je #:position ve :queue.',
202202+ 'on' => '',
202203 'queue' => 'frontě schválení',
203204 'soon' => 'brzy',
204205 ],
···66return [
77 'index' => [
88 'description' => 'Færdigpakkede samlinger af beatmaps bygget op omkring et fælles tema.',
99+ 'empty' => '',
910 'nav_title' => 'katalog',
1011 'title' => 'Beatmap Pakker',
1112
+1
resources/lang/da/beatmaps.php
···199199200200 'rank_estimate' => [
201201 '_' => 'Dette kort anslås at være rangeret :date , hvis ingen problemer findes. Det er #:position i :queue.',
202202+ 'on' => '',
202203 'queue' => 'rangering kø',
203204 'soon' => 'snart',
204205 ],
···1818 ],
19192020 'index' => [
2121- 'description' => 'Featured Artists sind Künstler, mit denen wir zusammenarbeiten, um neue und einzigartige Musik für osu! zur Verfügung zu stellen. Ihrer Lieder wurden vom osu!-Team handverlesen, weil sie großartige Werke sind und sich wunderbar für das Mapping eignen. Einige dieser Lieder wurden sogar exklusiv für osu! geschaffen.<br><br>Für alle Lieder steht eine Vorlage mit fertigem Timing als .osz Datei zum Download bereit. Außerdem sind sie offiziell für die Verwendung in osu! und für dazu in Bezug stehenden Inhalten lizenziert.',
2121+ 'description' => 'Featured Artists sind Künstler, mit denen wir zusammenarbeiten, um neue und einzigartige Musik für osu! zur Verfügung zu stellen. Ihre Lieder wurden vom osu!-Team handverlesen, weil sie großartige Werke sind und sich wunderbar für das Mapping eignen. Einige dieser Lieder wurden sogar exklusiv für osu! geschaffen.<br><br>Für alle Lieder steht eine Vorlage mit fertigem Timing als .osz-Datei zum Download bereit. Außerdem sind sie offiziell für die Verwendung in osu! und für dazu in Bezug stehenden Inhalten lizenziert.',
2222 ],
23232424 'links' => [
···29293030 'songs' => [
3131 '_' => 'Songs',
3232- 'count' => ':count_delimited Songs|:count_delimited Songs',
3232+ 'count' => ':count_delimited Song|:count_delimited Songs',
3333 'original' => 'osu! original',
3434 'original_badge' => 'ORIGINAL',
3535 ],
+2-2
resources/lang/de/authorization.php
···2020 'exhausted' => 'Dein Nominierungslimit für heute wurde erreicht, bitte versuche es morgen erneut.',
2121 'incorrect_state' => 'Beim Ausführen dieser Aktion ist ein Fehler aufgetreten. Bitte Seite neu laden.',
2222 'owner' => "Eigene Beatmaps können nicht nominiert werden.",
2323- 'set_metadata' => 'Du musst den Genre und die Sprache einstellen, bevor nominiert werden kann.',
2323+ 'set_metadata' => 'Vor der Nominierung müssen Genre und Sprache festgelegt werden.',
2424 ],
2525 'resolve' => [
2626 'not_owner' => 'Nur der Thread- oder Beatmapersteller kann die Diskussion für gelöst erklären.',
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Diese Beatmap-Diskussion ist gesperrt.',
57575858 'metadata' => [
5959 'nominated' => 'Du kannst die Metadaten einer nominierten Map nicht ändern. Wenn du glaubst, dass sie falsch sind, wende dich an ein BN- oder NAT-Mitglied.',
···66return [
77 'event' => [
88 'approve' => 'Approved.',
99- 'beatmap_owner_change' => 'Besitzer der Schwierigkeit :beatmap wurde auf :new_user geändert.',
99+ 'beatmap_owner_change' => 'Besitzer der Difficulty :beatmap wurde zu :new_user geändert.',
1010 'discussion_delete' => 'Ein Moderator hat die Diskussion :discussion gelöscht.',
1111 'discussion_lock' => 'Die Diskussion für diese Beatmap wurde deaktiviert. (:text)',
1212 'discussion_post_delete' => 'Ein Moderator hat einen Beitrag der Diskussion :discussion gelöscht.',
1313 'discussion_post_restore' => 'Ein Moderator hat einen Beitrag der Diskussion :discussion wiederhergestellt.',
1414 'discussion_restore' => 'Ein Moderator hat die Diskussion :discussion wiederhergestellt.',
1515 'discussion_unlock' => 'Die Diskussion für diese Beatmap wurde aktiviert.',
1616- 'disqualify' => 'Von :user disqualifiziert mit der Begründung: :discussion (:text).',
1717- 'disqualify_legacy' => 'Von :user disqualifiziert mit der Begründung: :text.',
1616+ 'disqualify' => 'Von :user disqualifiziert. Grund: :discussion (:text).',
1717+ 'disqualify_legacy' => 'Von :user disqualifiziert. Grund: :text.',
1818 'genre_edit' => 'Genre wurde von :old zu :new geändert.',
1919- 'issue_reopen' => 'Gelöstes Problem :discussion von :discussion_user durch :user wiedereröffnet.',
2020- 'issue_resolve' => 'Vorschlag/Problem :discussion als gelöst gekennzeichnet.',
2121- 'kudosu_allow' => 'Das kudosu-Verbot für Diskussion :discussion wurde entfernt.',
2222- 'kudosu_deny' => 'Diskussion :discussion wurde das kudosu verwehrt.',
1919+ 'issue_reopen' => 'Gelöstes Problem :discussion von :discussion_user wurde durch :user wiedereröffnet.',
2020+ 'issue_resolve' => 'Problem :discussion von :discussion_user wurde durch :user als gelöst gekennzeichnet.',
2121+ 'kudosu_allow' => 'Kudosu-Ablehnung für die Diskussion :discussion wurde entfernt.',
2222+ 'kudosu_deny' => 'Kudosu werden in der Diskussion :discussion abgelehnt.',
2323 'kudosu_gain' => 'Die Diskussion :discussion von :user hat genug Stimmen für Kudosu erhalten.',
2424- 'kudosu_lost' => 'Die Diskussion :discussion von :user hat an Stimmen verloren und kudosu wurde entfernt.',
2525- 'kudosu_recalculate' => 'Das verteilte kudosu der Diskussion :discussion wurde neu berechnet.',
2424+ 'kudosu_lost' => 'Die Diskussion :discussion von :user hat an Stimmen verloren und erteilte Kudosu wurden abgelehnt.',
2525+ 'kudosu_recalculate' => 'Erteilte Kudosu der Diskussion :discussion wurden neu berechnet.',
2626 'language_edit' => 'Sprache wurde von :old zu :new geändert.',
2727- 'love' => 'Nominiert von :user',
2727+ 'love' => 'Loved von :user.',
2828 'nominate' => 'Von :user nominiert.',
2929 'nominate_modes' => 'Nominiert von :user (:modes).',
3030- 'nomination_reset' => 'Neues Problem :discussion hat die Nominierung zurückgesetzt.',
3030+ 'nomination_reset' => 'Ein neues Problem :discussion hat die Nominierung zurückgesetzt (:text).',
3131 'nomination_reset_received' => 'Nominierung von :user wurde von :source_user zurückgesetzt (:text)',
3232 'nomination_reset_received_profile' => 'Nominierung wurde von :user zurückgesetzt (:text)',
3333 'offset_edit' => 'Online-Offset wurde von :old zu :new geändert.',
···58585959 'type' => [
6060 'approve' => 'Approval',
6161- 'beatmap_owner_change' => 'Schwierigkeitsstufenbesitzeränderung',
6161+ 'beatmap_owner_change' => 'Besitzerwechsel der Difficulty',
6262 'discussion_delete' => 'Diskussion löschen',
6363- 'discussion_post_delete' => 'Löschen der Diskussionsantwort',
6464- 'discussion_post_restore' => 'Diskussionsantwort wiederherstellen',
6363+ 'discussion_post_delete' => 'Antwort in der Diskussion entfernen',
6464+ 'discussion_post_restore' => 'Antwort in der Diskussion wiederherstellen',
6565 'discussion_restore' => 'Diskussion wiederherstellen',
6666 'disqualify' => 'Disqualifikation',
6767 'genre_edit' => 'Genre-Änderung',
6868- 'issue_reopen' => 'Diskussion wieder öffnen',
6868+ 'issue_reopen' => 'Diskussion wiedereröffnen',
6969 'issue_resolve' => 'Diskussion lösen',
7070 'kudosu_allow' => 'Kudosu erlauben',
7171- 'kudosu_deny' => 'Kudosu-Verweigerung',
7272- 'kudosu_gain' => 'Kudosu-Erhalt',
7171+ 'kudosu_deny' => 'Kudosu ablehnen',
7272+ 'kudosu_gain' => 'Kudosu erhalten',
7373 'kudosu_lost' => 'Kudosu-Verlust',
7474 'kudosu_recalculate' => 'Kudosu-Neuberechnung',
7575 'language_edit' => 'Sprachänderung',
7676 'love' => 'Love',
7777 'nominate' => 'Nominierung',
7878 'nomination_reset' => 'Nominierung zurücksetzten',
7979- 'nomination_reset_received' => 'Nomination Reset erhalten',
7979+ 'nomination_reset_received' => 'Nomination-Reset erhalten',
8080 'nsfw_toggle' => 'Explizit-Markierung',
8181 'offset_edit' => 'Offset bearbeiten',
8282 'qualify' => 'Qualifikation',
8383 'rank' => 'Rangliste',
8484- 'remove_from_loved' => 'Loved-Entfernung',
8484+ 'remove_from_loved' => 'Loved entfernen',
8585 ],
8686];
+5-5
resources/lang/de/beatmapset_watches.php
···5566return [
77 'index' => [
88- 'description' => 'Dies sind deine beobachteten Diskussionen. Du wirst über neue Beiträge und Updates informiert.',
99- 'title_compact' => 'beobachtete moddingthreads',
88+ 'description' => 'Dies sind deine gefolgten Beatmap-Diskussionen. Du wirst über neue Posts und Aktualisierungen benachrichtigt.',
99+ 'title_compact' => 'Merkliste von Beatmap-Diskussionen',
10101111 'counts' => [
1212- 'total' => 'Beobachtete Beatmaps',
1212+ 'total' => 'Gefolgte Beatmaps',
1313 'unread' => 'Beatmaps mit neuer Aktivität',
1414 ],
15151616 'table' => [
1717- 'empty' => 'Du beobachtest keine Diskussionen.',
1717+ 'empty' => 'Du folgst keiner Beatmap-Diskussion.',
1818 'last_update' => 'Letzte Aktualisierung',
1919- 'open_issues' => 'Offene Vorschläge/Probleme',
1919+ 'open_issues' => 'Offene Probleme',
2020 'state' => 'Status',
2121 'title' => 'Titel',
2222 ],
+43-43
resources/lang/de/beatmapsets.php
···2424 ],
25252626 'index' => [
2727- 'title' => 'Beatmaps: Liste',
2727+ 'title' => 'Beatmap-Auflistung',
2828 'guest_title' => 'Beatmaps',
2929 ],
30303131 'panel' => [
3232- 'empty' => 'keine beatmaps',
3232+ 'empty' => 'keine Beatmaps',
33333434 'download' => [
3535 'all' => 'herunterladen',
···4040 ],
41414242 'nominate' => [
4343- 'hybrid_requires_modes' => 'Für ein Hybrid-Beatmapset musst du mindestens einen Spielmodus auswählen, für den du nominieren möchtest.',
4444- 'incorrect_mode' => 'Du hast keine Berechtigung, für diesen Modus zu nominieren: :mode',
4545- 'full_bn_required' => 'Du musst ein vollwertiger Nominator sein, um diese qualifizierende Nominierung durchzuführen.',
4343+ 'hybrid_requires_modes' => 'Für ein Hybrid-Beatmapset musst du mindestens einen Spielmodus auswählen, den du nominieren möchtest.',
4444+ 'incorrect_mode' => 'Du hast keine Berechtigung diesen Modus zu nominieren: :mode',
4545+ 'full_bn_required' => 'Du musst ein vollständiger Nominator sein, um diese qualifizierende Nominierung durchzuführen.',
4646 'too_many' => 'Nominierungsvoraussetzung bereits erfüllt.',
47474848 'dialog' => [
4949 'confirmation' => 'Bist du sicher, dass du diese Beatmap nominieren möchtest?',
5050 'header' => 'Beatmap nominieren',
5151- 'hybrid_warning' => 'hinweis: du kannst nur einmal nominieren, also stelle bitte sicher, dass du für alle spielmodi nominierst, die du beabsichtigst',
5252- 'which_modes' => 'Für welche Modi nominieren?',
5151+ 'hybrid_warning' => 'Hinweis: du kannst nur einmalig nominieren, also stelle bitte sicher, dass du für alle Spielmodi nominierst, die du beabsichtigst',
5252+ 'which_modes' => 'Für welche Modi willst du nominieren?',
5353 ],
5454 ],
5555···67676868 'details' => [
6969 'by_artist' => 'von :artist',
7070- 'favourite' => 'Dieses Beatmapset zu deinen Favoriten hinzufügen',
7070+ 'favourite' => 'Diese Beatmap zu deinen Favoriten hinzufügen',
7171 'favourite_login' => 'Melde dich an, um diese Beatmap zu favorisieren',
7272- 'logged-out' => 'Zum Herunterladen von Beatmaps muss man eingeloggt sein!',
7272+ 'logged-out' => 'Du musst eingeloggt sein, bevor du Beatmaps herunterladen kannst!',
7373 'mapped_by' => 'erstellt von :mapper',
7474- 'mapped_by_guest' => 'Gastschwierigkeit von :mapper',
7575- 'unfavourite' => 'Dieses Beatmapset von deinen Favoriten entfernen',
7676- 'updated_timeago' => 'zuletzt aktualisiert :timeago',
7474+ 'mapped_by_guest' => 'Guest-Difficulty von :mapper',
7575+ 'unfavourite' => 'Diese Beatmap von deinen Favoriten entfernen',
7676+ 'updated_timeago' => 'zuletzt aktualisiert vor :timeago',
77777878 'download' => [
7979 '_' => 'Herunterladen',
···8383 ],
84848585 'login_required' => [
8686- 'bottom' => 'für mehr Features',
8686+ 'bottom' => 'für Zugriff auf mehr Features',
8787 'top' => 'Einloggen',
8888 ],
8989 ],
90909191 'details_date' => [
9292- 'approved' => 'approved :timeago',
9393- 'loved' => 'loved :timeago',
9494- 'qualified' => 'qualifiziert :timeago',
9595- 'ranked' => 'ranked :timeago',
9696- 'submitted' => 'hochgeladen :timeago',
9797- 'updated' => 'zuletzt aktualisiert :timeago',
9292+ 'approved' => 'vor :timeago approved',
9393+ 'loved' => 'vor :timeago loved',
9494+ 'qualified' => 'vor :timeago qualifiziert',
9595+ 'ranked' => 'vor :timeago ranked',
9696+ 'submitted' => 'vor :timeago hochgeladen',
9797+ 'updated' => 'vor :timeago zuletzt aktualisiert',
9898 ],
9999100100 'favourites' => [
101101- 'limit_reached' => 'Du hast zu viele favorisierte Beatmaps! Bitte entferne welche, bevor du es nochmal versuchst.',
101101+ 'limit_reached' => 'Du hast zu viele Beatmaps favorisiert! Bitte entferne welche, bevor du es nochmal versuchst.',
102102 ],
103103104104 'hype' => [
105105- 'action' => 'Wenn es dir Spaß gemacht hat, diese Map zu spielen, dann hype sie, um bei ihrem Fortschritt zum <strong>Ranked</strong>-Status zu helfen.',
105105+ 'action' => 'Hat dir die Map Spaß gemacht? Hype sie, um bei ihrem Fortschritt zum <strong>Ranked</strong>-Status zu helfen.',
106106107107 'current' => [
108108 '_' => 'Die Map ist zurzeit :status.',
···110110 'status' => [
111111 'pending' => 'ausstehend',
112112 'qualified' => 'qualifiziert',
113113- 'wip' => 'work-in-progress',
113113+ 'wip' => 'Work-in-Progress',
114114 ],
115115 ],
116116117117 'disqualify' => [
118118- '_' => 'Wenn du ein Problem mit dieser Beatmap findest, disqualifiziere diese bitte :link.',
118118+ '_' => 'Bitte disqualifizieren, falls du ein Problem in dieser Beatmap findest :link.',
119119 ],
120120121121 'report' => [
122122- '_' => 'Wenn du ein Problem mit dieser Beatmap findest, melde es bitte :link, um das Team zu informieren.',
122122+ '_' => 'Wenn du ein Problem in dieser Beatmap findest, melde es bitte :link, um das Team zu informieren.',
123123 'button' => 'Problem melden',
124124 'link' => 'hier',
125125 ],
···154154155155 'scoreboard' => [
156156 'achieved' => 'erreicht :when',
157157- 'country' => 'Landesrangliste',
157157+ 'country' => 'Länder-Rangliste',
158158 'error' => 'Die Rangliste konnte nicht geladen werden',
159159- 'friend' => 'Freundesrangliste',
159159+ 'friend' => 'Freundes-Rangliste',
160160 'global' => 'Globale Rangliste',
161161- 'supporter-link' => '<a href=":link">Hier</a> klicken, um alle tollen Features zu entdecken!',
162162- 'supporter-only' => 'Du musst Supporter sein, um Freundes- und Landesranglisten zu sehen!',
163163- 'title' => 'Ranglisten',
161161+ 'supporter-link' => '<a href=":link">Hier</a> klicken, um all die tollen Features zu entdecken!',
162162+ 'supporter-only' => 'Du musst osu!supporter sein, um Freundes-, Länder-, oder Mod-Ranglisten zu sehen!',
163163+ 'title' => 'Punkte-Anzeige',
164164165165 'headers' => [
166166- 'accuracy' => 'Genauigkeit',
167167- 'combo' => 'Combo',
166166+ 'accuracy' => 'Präzision',
167167+ 'combo' => 'Maximale Combo',
168168 'miss' => 'Miss',
169169 'mods' => 'Mods',
170170 'pin' => 'Anpinnen',
···185185 ],
186186 'score' => [
187187 'first' => 'An der Spitze',
188188- 'own' => 'Dein bester Rang',
188188+ 'own' => 'Deine Bestleistung',
189189 ],
190190 'supporter_link' => [
191191- '_' => 'Klicke :here um alle schönen Features zu sehen, die du bekommst!',
191191+ '_' => 'Klicke :here, um all die tollen Features zu entdecken, die du bekommst!',
192192 'here' => 'hier',
193193 ],
194194 ],
195195196196 'stats' => [
197197- 'cs' => 'Circle Size',
198198- 'cs-mania' => 'Tastenanzahl',
199199- 'drain' => 'HP Drain',
200200- 'accuracy' => 'Genauigkeit',
201201- 'ar' => 'Approach Rate',
202202- 'stars' => 'Star Difficulty',
203203- 'total_length' => 'Länge',
197197+ 'cs' => 'Circle-Size',
198198+ 'cs-mania' => 'Tasten-Anzahl',
199199+ 'drain' => 'HP-Drain',
200200+ 'accuracy' => 'Präzision',
201201+ 'ar' => 'Approach-Rate',
202202+ 'stars' => 'Star-Difficulty',
203203+ 'total_length' => 'Länge (Drain length: :hit_length)',
204204 'bpm' => 'BPM',
205205 'count_circles' => 'Circle-Anzahl',
206206 'count_sliders' => 'Slider-Anzahl',
207207 'offset' => 'Online-Offset: :offset',
208208- 'user-rating' => 'Benutzerbewertungen',
209209- 'rating-spread' => 'Bewertungsverteilung',
208208+ 'user-rating' => 'User-Bewertungen',
209209+ 'rating-spread' => 'Bewertungs-Spread',
210210 'nominations' => 'Nominierungen',
211211 'playcount' => 'Playcount',
212212 ],
···218218 'qualified' => 'Qualifiziert',
219219 'wip' => 'WIP',
220220 'pending' => 'Ausstehend',
221221- 'graveyard' => 'Friedhof',
221221+ 'graveyard' => 'Graveyard',
222222 ],
223223 ],
224224
+4-4
resources/lang/de/changelog.php
···20202121 'index' => [
2222 'page_title' => [
2323- '_' => 'Changelog Eintrag',
2323+ '_' => 'Changelog-Auflistung',
2424 '_from' => 'Änderungen seit :from',
2525 '_from_to' => 'Änderungen zwischen :from und :to',
2626 '_stream' => 'Änderungen in :stream',
···3232 ],
33333434 'support' => [
3535- 'heading' => 'Dir gefällt, was du siehst?',
3535+ 'heading' => 'Gefällt dir dieses Update?',
3636 'text_1' => 'Unterstütze die weitere Entwicklung von osu! und :link!',
3737- 'text_1_link' => 'werde noch heute Supporter',
3838- 'text_2' => 'Damit treibst du nicht nur die Entwicklung schneller voran, sondern erhältst auch einige coole Features und besondere Anpassungsmöglichkeiten!',
3737+ 'text_1_link' => 'werde noch heute osu!supporter',
3838+ 'text_2' => 'Damit treibst du nicht nur die Entwicklung schneller voran, sondern erhältst auch einige zusätzliche Features und Anpassungsmöglichkeiten!',
3939 ],
4040];
+17-17
resources/lang/de/chat.php
···44// See the LICENCE file in the repository root for full licence text.
5566return [
77- 'loading_users' => 'lade Benutzer...',
88- 'talking_in' => 'sprechen in :channel',
99- 'talking_with' => 'im gespräch mit :name',
1010- 'title_compact' => 'chat',
1111- 'unread_messages' => 'ungelesene nachrichten',
77+ 'loading_users' => 'lade User...',
88+ 'talking_in' => 'in :channel reden',
99+ 'talking_with' => 'im Gespräch mit :name',
1010+ 'title_compact' => 'Chat',
1111+ 'unread_messages' => 'ungelesene Nachrichten',
12121313 'cannot_send' => [
1414- 'channel' => 'Du kannst derzeit keine Nachrichten an diesen Kanal senden. Dies kann folgende Gründe haben:',
1414+ 'channel' => 'Du kannst derzeit keine Nachrichten in diesem Channel senden. Dies kann folgende Gründe haben:',
1515 'user' => 'Du kannst derzeit keine Nachrichten an diesen User senden. Dies kann folgende Gründe haben:',
1616 ],
17171818 'channels' => [
1919- 'confirm_part' => 'Möchtest du diesen Kanal ausblenden? Du erhältst weiterhin Nachrichten aus diesem Kanal.',
2020- 'create' => 'ankündigung erstellen',
1919+ 'confirm_part' => 'Möchtest du diesen Channel ausblenden? Du erhältst weiterhin Nachrichten aus diesem Channel.',
2020+ 'create' => 'Ankündigung erstellen',
21212222 'list' => [
2323 'title' => [
2424 'ANNOUNCE' => 'Ankündigungen',
2525 'GROUP' => 'Gruppen',
2626 'PM' => 'Direktnachrichten',
2727- 'PUBLIC' => 'Kanäle',
2727+ 'PUBLIC' => 'Channel',
2828 ],
2929 ],
3030 ],
···3535 ],
36363737 'labels' => [
3838- 'description' => 'beschreibung',
3939- 'message' => 'nachricht',
4040- 'name' => 'raumname',
4141- 'users' => 'spieler zum hinzufügen',
3838+ 'description' => 'Beschreibung',
3939+ 'message' => 'Nachricht',
4040+ 'name' => 'Raumname',
4141+ 'users' => 'Spieler zum Hinzufügen',
4242 ],
4343 ],
44444545 'not_found' => [
4646- 'message' => 'Hier gibt es nichts, vielleicht hast du den Kanal verlassen oder er existiert nicht...',
4747- 'title' => 'Kanal nicht gefunden',
4646+ 'message' => 'Hier gibt es nichts, vielleicht hast du den Channel verlassen oder er existiert nicht...',
4747+ 'title' => 'Channel nicht gefunden',
4848 ],
49495050 'input' => [
···5656 ],
57575858 'no-conversations' => [
5959- 'howto' => "Starte eine Unterhaltung von einem User-Profil oder einem Usercard-Popup.",
6060- 'lazer' => 'Öffentliche Kanäle, die du mit <a href=":link">osu!lazer</a> beitrittst, werden auch hier angezeigt.',
5959+ 'howto' => "Starte eine Unterhaltung von einem User-Profil oder einem Usercard-Pop-up.",
6060+ 'lazer' => 'Öffentliche Channel, welche du mit <a href=":link">osu!lazer</a> betrittst, werden hier auch sichtbar sein.',
6161 'title' => 'noch keine Unterhaltungen',
6262 ],
6363];
+2-2
resources/lang/de/client_verifications.php
···77 'completed' => [
88 'home' => 'Zum Dashboard gehen',
99 'logout' => 'Abmelden',
1010- 'text' => 'Du kannst diesen Tab/dieses Fenster nun schließen',
1010+ 'text' => 'Du kannst dieses Fenster nun schließen',
1111 'title' => 'osu! Client-Verifizierung wurde abgeschlossen',
1212 ],
13131414 'create' => [
1515- 'confirm' => 'Klicke unten auf den Autorisierungs-Button, um die Client-Überprüfung abzuschließen.',
1515+ 'confirm' => 'Klicke unten auf den Autorisierungs-Button, um die Client-Verifizierung abzuschließen.',
1616 'title' => 'osu! Client-Verifizierung',
1717 ],
1818];
···88 'convinced' => [
99 'title' => 'Ich bin überzeugt! :D',
1010 'support' => 'unterstütze osu!',
1111- 'gift' => 'oder verschenke \'Supporter\' an andere Spieler',
1111+ 'gift' => 'oder verschenke Supporter an andere Spieler',
1212 'instructions' => 'klick auf das Herz, um zum osu!store zu gelangen',
1313 ],
1414 'why-support' => [
···1919 'description' => 'Ein kleines Team entwickelt und betreibt osu!. Deine Unterstützung hilft ihnen dabei, zu, du weißt schon... leben.',
2020 ],
2121 'infra' => [
2222- 'title' => 'Serverinfrastruktur',
2222+ 'title' => 'Server-Infrastruktur',
2323 'description' => 'Die Beiträge gehen an die Server, auf denen die Website, Multiplayer-Dienste, Online-Bestenlisten usw. ausgeführt werden.',
2424 ],
2525 'featured-artists' => [
2626 'title' => 'Featured Artists',
2727 'description' => 'Mit deiner Unterstützung können wir noch mehr großartige Künstler ansprechen und somit mehr gute Musik in osu! lizenzieren!',
2828- 'link_text' => 'Sieh Dir die aktuelle Liste an »',
2828+ 'link_text' => 'Sieh dir die aktuelle Liste an »',
2929 ],
3030 'ads' => [
3131 'title' => 'Halte osu! aufrecht',
···3333 ],
3434 'tournaments' => [
3535 'title' => 'Offizielle Turniere',
3636- 'description' => 'Hilf mit, die Durchführung (und die Preise) der offiziellen osu!-Weltcup-Turniere zu finanzieren.',
3636+ 'description' => 'Hilf mit, die Durchführung (und die Preise) der offiziellen osu!-Weltmeisterschaft-Turniere zu finanzieren.',
3737 'link_text' => 'Erkunde Turniere »',
3838 ],
3939 'bounty-program' => [
4040- 'title' => 'Open-Source Prämienprogramm',
4141- 'description' => 'Unterstütze die Community-Mitarbeiter, die ihre Zeit und Mühe investiert haben, um osu! besser zu machen.',
4040+ 'title' => 'Open-Source-Prämien-Programm',
4141+ 'description' => 'Unterstütze Mitwirkende der Community, die ihre Zeit und Mühe investiert haben, um osu! besser zu machen.',
4242 'link_text' => 'Finde mehr heraus »',
4343 ],
4444 ],
4545 'perks' => [
4646- 'title' => 'Oh? Was gibt\'s denn?!',
4646+ 'title' => 'Cool! Was bekommt man denn?',
4747 'osu_direct' => [
4848 'title' => 'osu!direct',
4949- 'description' => 'Schneller und einfacher Zugriff auf die Beatmapsuche, sogar innerhalb des Spiels.',
4949+ 'description' => 'Schneller und einfacher Zugriff zum Suchen und Downloaden von Beatmaps, ohne das Spiel verlassen zu müssen.',
5050 ],
51515252 'friend_ranking' => [
5353- 'title' => 'Freundesrangliste',
5454- 'description' => "Finde heraus, wie Du Dich auf der Bestenliste einer Beatmap gegen Deine Freunde behauptest, sowohl im Spiel als auch auf der Webseite.",
5353+ 'title' => 'Freundes-Rangliste',
5454+ 'description' => "Siehe dir an wie du dich auf der Bestenliste einer Beatmap gegen deine Freunde behauptest, sowohl im Spiel als auch auf der Webseite.",
5555 ],
56565757 'country_ranking' => [
5858- 'title' => 'Landesrangliste',
5858+ 'title' => 'Länder-Rangliste',
5959 'description' => 'Erobere dein Land, bevor du die Welt eroberst.',
6060 ],
6161···66666767 'auto_downloads' => [
6868 'title' => 'Automatische Downloads',
6969- 'description' => 'Automatische Downloads im Multiplayer, beim Zuschauen, und wenn man Links im Chat anklickt!',
6969+ 'description' => 'Beatmaps werden im Multiplayer, beim Zuschauen oder wenn man Links im Chat anklickt automatisch heruntergeladen!',
7070 ],
71717272 'upload_more' => [
7373 'title' => 'Mehr Hochladen',
7474- 'description' => 'Zusätzliche "ausstehende" Beatmapplätze (pro ranked Beatmap), bis zu einem Maximum von 10.',
7474+ 'description' => 'Zusätzliche ausstehende Beatmap-Slots (pro ranked Beatmap) bis zu einem Maximum von 10.',
7575 ],
76767777 'early_access' => [
7878 'title' => 'Früherer Zugang',
7979- 'description' => 'Zugriff auf frühere Updates, in denen man neue Features ausprobieren kann, bevor sie veröffentlich werden!',
7979+ 'description' => 'Ergattere einen frühzeitigen Zugriff auf neue Releases, in denen man neue Features ausprobieren kann, bevor sie veröffentlicht werden! Dazu gehört auch die Webseite!',
8080 ],
81818282 'customisation' => [
8383 'title' => 'Anpassung',
8484- 'description' => "Füge deinem Profil eine persönliche Note hinzu, indem du eine komplett anpassbare Seite hinzufügst.",
8484+ 'description' => "Füge deinem Profil eine persönliche Note hinzu, indem du ein individuelles Titelbild hochlädst oder einen vollständig anpassbaren \"Ich!\"-Bereich erstellst.",
8585 ],
86868787 'beatmap_filters' => [
8888- 'title' => 'Beatmapfilter',
8989- 'description' => 'Filtere Suchanfragen nach gespielten oder ungespielten Beatmaps und nach erreichtem Rang.',
8888+ 'title' => 'Beatmap-Filter',
8989+ 'description' => 'Filtere Beatmap-Suchanfragen nach gespielten und ungespielten Maps oder nach erreichtem Rang.',
9090 ],
91919292 'yellow_fellow' => [
···101101102102 'change_username' => [
103103 'title' => 'Benutzernamen ändern',
104104- 'description' => 'Ändere deinen Namen ohne weitere Kosten (einmalig).',
104104+ 'description' => 'Beim ersten Supporter-Kauf ist eine kostenlose Namensänderung enthalten.',
105105 ],
106106107107 'skinnables' => [
108108 'title' => 'Skinbare Elemente',
109109- 'description' => 'Mehr skinbare Elemente im Spiel, z. B. der Menühintergrund.',
109109+ 'description' => 'Mehr skinbare Elemente im Spiel, z.B. der Menü-Hintergrund.',
110110 ],
111111112112 'feature_votes' => [
···115115 ],
116116117117 'sort_options' => [
118118- 'title' => 'Sortieroptionen',
118118+ 'title' => 'Sortier-Optionen',
119119 'description' => 'Länder-, Freundes- und modspezifische Ranglisten im Spiel einsehen!',
120120 ],
121121···125125 ],
126126 'more_friends' => [
127127 'title' => 'Mehr Freunde',
128128- 'description' => 'Die maximale Anzahl von Freunden, die Du haben kannst, wurde erhöht von :normally → :supporter',
128128+ 'description' => 'Die maximale Anzahl von Freunden, die du haben kannst, wurde von erhöht :normally → :supporter',
129129 ],
130130 'more_beatmaps' => [
131131- 'title' => 'Weitere Beatmaps hochladen',
132132- 'description' => 'Die Anzahl der non-ranked Beatmaps, die Du gleichzeitig haben kannst, wird aus einem Basiswert plus einem zusätzlichen Bonus für jede ranked Beatmap berechnet (bis zu einem Limit).<br/><br/>Normalerweise sind dies :base plus :bonus pro ranked Beatmap (bis zu :bonus_max). Mit Supporter erhöht sich dies auf :supporter_base plus :supporter_bonus pro ranked Beatmap (bis zu :supporter_bonus_max).',
131131+ 'title' => 'Mehr Beatmaps hochladen',
132132+ 'description' => 'Die Anzahl der unranked Beatmaps, die du gleichzeitig haben kannst, wird aus einem Basiswert plus einem zusätzlichen Bonus für jede ranked Beatmap berechnet (bis zu einem Limit).<br/><br/>Normalerweise sind dies :base plus :bonus pro ranked Beatmap (bis zu :bonus_max). Mit Supporter erhöht sich dies auf :supporter_base plus :supporter_bonus pro ranked Beatmap (bis zu :supporter_bonus_max).',
133133 ],
134134 'friend_filtering' => [
135135- 'title' => 'Freundesranglisten',
136136- 'description' => 'Miss Dich mit Deinen Freunden und finde heraus, wie Du Dich gegen sie behauptest!',
135135+ 'title' => 'Freundes-Ranglisten',
136136+ 'description' => 'Kokurriere dich mit deinen Freunden und sieh dir an, wie du dich gegen sie behauptest!',
137137 ],
138138139139 ],
140140 'supporter_status' => [
141141 'contribution' => 'Danke für deine bisherige Unterstützung! Du hast insgesamt :dollars durch :tags Supporter-Tag(s) beigesteuert!',
142142- 'gifted' => ":giftedTags deiner Supporter-Einkäufe waren Geschenke (für insgesamt :giftedDollars), wie großzügig von dir!",
142142+ 'gifted' => ":giftedTags deiner Supporter-Einkäufe waren Geschenke (im Wert von :giftedDollars), wie großzügig von dir!",
143143 'not_yet' => "Du hast noch kein osu!supporter-Tag :(",
144144 'valid_until' => 'Dein aktuelles osu!supporter-Tag endet am :date!',
145145 'was_valid_until' => 'Dein osu!supporter-Tag war bis :date gültig.',
···66return [
77 'index' => [
88 'description' => 'Pre-packaged collections of beatmaps based around a common theme.',
99+ 'empty' => 'Coming soon!',
910 'nav_title' => 'listing',
1011 'title' => 'Beatmap Packs',
1112
+2-1
resources/lang/en/beatmaps.php
···106106 'unsaved' => 'Unsaved',
107107 'timestamp' => [
108108 'all-diff' => 'Posts on "All difficulties" can\'t be timestamped.',
109109- 'diff' => 'If this :type starts with a timestamp, it will be shown under Timeline.',
109109+ 'diff' => 'If this post starts with a timestamp, it will be shown under Timeline.',
110110 ],
111111 ],
112112 'insert-block' => [
···199199200200 'rank_estimate' => [
201201 '_' => 'This map is estimated to be ranked :date if no issues are found. It is #:position in the :queue.',
202202+ 'on' => 'on :date',
202203 'queue' => 'ranking queue',
203204 'soon' => 'soon',
204205 ],
+4-4
resources/lang/en/beatmapsets.php
···67676868 'details' => [
6969 'by_artist' => 'by :artist',
7070- 'favourite' => 'Favourite this beatmap',
7171- 'favourite_login' => 'Sign in to favourite this beatmap',
7272- 'logged-out' => 'You need to sign in before downloading any beatmaps!',
7070+ 'favourite' => 'favourite this beatmap',
7171+ 'favourite_login' => 'sign in to favourite this beatmap',
7272+ 'logged-out' => 'you need to sign in before downloading any beatmaps!',
7373 'mapped_by' => 'mapped by :mapper',
7474 'mapped_by_guest' => 'guest difficulty by :mapper',
7575- 'unfavourite' => 'Unfavourite this beatmap',
7575+ 'unfavourite' => 'unfavourite this beatmap',
7676 'updated_timeago' => 'last updated :timeago',
77777878 'download' => [
+1-1
resources/lang/en/forum.php
···102102 'preview' => 'Preview',
103103 // TL note: this is used in the topic reply preview, when
104104 // the user goes back from previewing to editing the reply
105105- 'preview_hide' => 'Write',
105105+ 'preview_hide' => 'Edit',
106106 'submit' => 'Post',
107107108108 'necropost' => [
···3737 'blocked_count' => 'blocked users (:count)',
3838 'hide_profile' => 'Hide profile',
3939 'hide_comment' => 'hide',
4040+ 'forum_post_text' => 'This post is hidden.',
4041 'not_blocked' => 'That user is not blocked.',
4142 'show_profile' => 'Show profile',
4243 'show_comment' => 'show',
···415416 'title' => 'User not found! ;_;',
416417 ],
417418 'page' => [
418418- 'button' => 'Edit profile page',
419419+ 'button' => 'edit profile page',
419420 'description' => '<strong>me!</strong> is a personal customisable area in your profile page.',
420421 'edit_big' => 'Edit me!',
421422 'placeholder' => 'Type page content here',
···439440 'stats' => [
440441 'hit_accuracy' => 'Hit Accuracy',
441442 'level' => 'Level :level',
442442- 'level_progress' => 'Progress to next level',
443443+ 'level_progress' => 'progress to next level',
443444 'maximum_combo' => 'Maximum Combo',
444445 'medals' => 'Medals',
445446 'play_count' => 'Play Count',
+1-1
resources/lang/es/authorization.php
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'La discusión de este mapa está bloqueada.',
57575858 'metadata' => [
5959 'nominated' => 'No puedes cambiar los metadatos de un mapa nominado. Contacta con un miembro de los BN o del NAT si crees que están establecidos incorrectamente.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Se estima que este mapa se clasificará :date si no se encuentran problemas. Es el número :position en la :queue.',
202202+ 'on' => '',
202203 'queue' => 'cola de clasificación',
203204 'soon' => 'pronto',
204205 ],
+2-2
resources/lang/es/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Foros',
2929 'latest_post' => 'Último mensaje',
30303131 'index' => [
···4848 'confirm_restore' => '¿Realmente desea restaurar la publicación?',
4949 'edited' => 'Última edición por :user :when, editado :count_delimited vez en total.|Última edición por :user :when, editado :count_delimited veces en total.',
5050 'posted_at' => 'publicado :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'publicado por :username en :forum',
52525353 'actions' => [
5454 'destroy' => 'Eliminar publicación',
···199199200200 'rank_estimate' => [
201201 '_' => 'Tämän beatmapin arvioidaan tulla hyväksytyksi :date, jos mitään ongelmia ei löydy. Se on #:position :queue.',
202202+ 'on' => '',
202203 'queue' => 'hyväksytysjonossa',
203204 'soon' => 'pian',
204205 ],
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Naka-lock ang beatmap na ito para sa talakayan.',
57575858 'metadata' => [
5959 'nominated' => 'Hindi maaaring baguhin ang metadata ng isang nominadong beatmap. Makipag-ugnayan sa isang miyembro ng BN o NAT kung sa palagay mo ay mali ang pagkakatakda nito.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Ang mapa na ito ay tatantiyahin na maging ranked sa :date kapag walang isyu ang nahanap. Nasa ika-#:position ng :queue.',
202202+ 'on' => '',
202203 'queue' => 'pila ng ranking',
203204 'soon' => 'malapit na',
204205 ],
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Forums',
2929 'latest_post' => 'Pinakabagong Post',
30303131 'index' => [
···4848 'confirm_restore' => 'Talagang ibalik ang post na ito?',
4949 'edited' => 'Huling na-edit ni pamamagitan ni :user noong :when, in-edit nang :count_delimited na beses sa kabuuan.|Huling na-edit ni pamamagitan ni :user noong :when, in-edit nang :count_delimited na beses sa kabuuan.',
5050 'posted_at' => 'nai-post noong :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'ini-ulat ni :username sa :forum',
52525353 'actions' => [
5454 'destroy' => 'Burahin ang post na ito',
···5151 'artist' => 'Artiste',
5252 'bpm_gte' => 'BPM Minimum',
5353 'bpm_lte' => 'BPM Maximum',
5454- 'empty' => 'Aucune musique correspondant aux critères de recherche n\'a été trouvé.',
5454+ 'empty' => 'Aucune musique correspondant aux critères de recherche n\'a été trouvée.',
5555 'genre' => 'Genre',
5656 'genre_all' => 'Tous',
5757 'length_gte' => 'Durée minimale',
+3-3
resources/lang/fr/authorization.php
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'La discussion de cette beatmap est verrouillée.',
57575858 'metadata' => [
5959 'nominated' => 'Vous ne pouvez pas modifier les métadonnées d\'une beatmap nominée. Contactez un Beatmap Nominator ou un membre de la NAT si vous pensez qu\'elles sont mal définies.',
···6464 'annnonce_only' => 'Ce canal est uniquement pour les annonces.',
6565 'blocked' => 'Vous ne pouvez pas envoyer un message à un utilisateur qui vous a bloqué ou que vous avez bloqué.',
6666 'friends_only' => 'Cet utilisateur bloque les messages des personnes qui ne sont pas dans sa liste d’amis.',
6767- 'moderated' => 'Ce salon est actuellement restreint par un modérateur.',
6868- 'no_access' => 'Vous n’avez pas accès à ce salon.',
6767+ 'moderated' => 'Ce canal est actuellement restreint par un modérateur.',
6868+ 'no_access' => 'Vous n’avez pas accès à ce canal.',
6969 'receive_friends_only' => 'L\'utilisateur n\'est peut-être pas en mesure de répondre parce que vous n\'acceptez que les messages des personnes de votre liste d\'amis.',
7070 'restricted' => 'Vous ne pouvez pas envoyer de messages en étant réduit au silence, restreint ou banni.',
7171 'silenced' => 'Vous ne pouvez pas envoyer de messages en étant réduit au silence, restreint ou banni.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Procjenjuje se da će ova beatmapa biti rangirana :date ako nema problema. To je :position. u :queue.',
202202+ 'on' => '',
202203 'queue' => 'red čekanja na rangiranje',
203204 'soon' => 'uskoro',
204205 ],
···199199200200 'rank_estimate' => [
201201 '_' => 'Ez a pálya rangsorolt lesz :date napján, ha további problémák nem merülnek fel. Jelenleg a :position. helyen áll a :queue.',
202202+ 'on' => '',
202203 'queue' => 'ranglistázási sorban',
203204 'soon' => 'a közeljövő egy',
204205 ],
+1-1
resources/lang/id/authorization.php
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Diskusi pada beatmap ini telah dikunci.',
57575858 'metadata' => [
5959 'nominated' => 'Kamu tidak dapat mengubah pengaturan metadata pada beatmap yang telah dinominasikan. Harap hubungi BN atau NAT apabila kamu merasa ada suatu hal yang perlu diubah.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Map ini akan berstatus Ranked pada :date apabila tidak terdapat masalah baru yang ditemukan. Map ini berada pada urutan ke-:position dalam :queue yang ada.',
202202+ 'on' => '',
202203 'queue' => 'antrian ranking',
203204 'soon' => 'segera',
204205 ],
+2-2
resources/lang/id/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Forum',
2929 'latest_post' => 'Kiriman Terbaru',
30303131 'index' => [
···4848 'confirm_restore' => 'Apakah kamu yakin untuk memulihkan post ini?',
4949 'edited' => 'Terakhir disunting oleh :user :when, dengan total penyuntingan sebanyak :count_delimited kali.|Terakhir disunting oleh :user :when, dengan total penyuntingan sebanyak :count_delimited kali.',
5050 'posted_at' => 'diposting :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'diposting oleh :username pada :forum',
52525353 'actions' => [
5454 'destroy' => 'Hapus post',
···141141 'approved' => 'Questa beatmap è stata approvata il :date!',
142142 'graveyard' => "Questa beatmap non è stata aggiornata dal :date ed è stata molto probabilmente abbandonata...",
143143 'loved' => 'Questa beatmap è stata aggiunta a quelle amate il :date!',
144144- 'ranked' => 'Questa beatmap è stata classificata il :date!',
144144+ 'ranked' => 'Questa beatmap è stata classificata il giorno :date!',
145145 'wip' => 'Nota: Questa beatmap è contrassegnata come work-in-progress dal creatore.',
146146 ],
147147···199199200200 'rank_estimate' => [
201201 '_' => 'È stimato che questa mappa verrà classificata in data :date se non vengono trovati problemi. È in posizione #:position nella :queue.',
202202+ 'on' => '',
202203 'queue' => 'coda per la classifica',
203204 'soon' => 'molto vicina',
204205 ],
···199199200200 'rank_estimate' => [
201201 '_' => 'Numatoma, kad šis bitmapas bus reitinguotas :date, jei nebus rasta problemų. Jis yra #:position tarp :queue.',
202202+ 'on' => '',
202203 'queue' => 'reitingavimo eilės',
203204 'soon' => 'greitai',
204205 ],
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Deze beatmap is gesloten voor discussie.',
57575858 'metadata' => [
5959 'nominated' => 'U kunt metagegevens van een nominale kaart niet wijzigen. Neem contact op met een BN of NAT lid als u denkt dat deze onjuist is ingesteld.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Deze map staat gepland om ranked te worden op :date als er geen problemen worden gevonden. Het is #:position in de :queue.',
202202+ 'on' => '',
202203 'queue' => 'ranking wachtlijst',
203204 'soon' => 'binnenkort',
204205 ],
+2-2
resources/lang/nl/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Forums',
2929 'latest_post' => 'Laatste bericht',
30303131 'index' => [
···4848 'confirm_restore' => 'Will je deze post echt terugzetten?',
4949 'edited' => 'Laatst bewerkt door :user op :when. :count keer bewerkt in totaal.',
5050 'posted_at' => 'gepost op :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'gepost door :username in :forum',
52525353 'actions' => [
5454 'destroy' => 'Verwijder bericht',
···66return [
77 'index' => [
88 'description' => 'Forhåndspakkede samlinger av beatmaps basert rundt et felles tema.',
99+ 'empty' => '',
910 'nav_title' => 'liste',
1011 'title' => 'Beatmappakker',
1112
+1
resources/lang/no/beatmaps.php
···199199200200 'rank_estimate' => [
201201 '_' => 'Dette kartet er estimert til å bli rangert som :date hvis ingen problemer er funnet. Det er #:position i :queue.',
202202+ 'on' => '',
202203 'queue' => 'rangerings kø ',
203204 'soon' => 'snart',
204205 ],
+1-1
resources/lang/pl/authorization.php
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Tworzenie dyskusji dla tej beatmapy zostało zablokowane.',
57575858 'metadata' => [
5959 'nominated' => 'Nie możesz zmienić metadanych nominowanej mapy. Skontaktuj się z członkiem BN lub NAT, jeśli uważasz, że są one ustawione nieprawidłowo.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Ta beatmapa uzyska status rankingowy :date, jeżeli nie zostaną zgłoszone żadne problemy. Obecnie jest ona na :position. miejscu w :queue.',
202202+ 'on' => '',
202203 'queue' => 'kolejce rankingowej',
203204 'soon' => 'wkrótce',
204205 ],
+1-1
resources/lang/pl/beatmapsets.php
···6868 'details' => [
6969 'by_artist' => ':artist',
7070 'favourite' => 'Dodaj do ulubionych',
7171- 'favourite_login' => 'Zaloguj się, by dodać tę beatmapę do ulubionych',
7171+ 'favourite_login' => 'Zaloguj się, by dodać tę beatmapę do ulubionych.',
7272 'logged-out' => 'Zaloguj się, aby zacząć pobierać beatmapy!',
7373 'mapped_by' => 'autorstwa :mapper',
7474 'mapped_by_guest' => 'gościnny poziom trudności autorstwa :mapper',
+2-2
resources/lang/pl/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Forum',
2929 'latest_post' => 'Ostatni post',
30303131 'index' => [
···4848 'confirm_restore' => 'Czy na pewno chcesz przywrócić post?',
4949 'edited' => 'Ostatnio edytowane przez :user :when, łącznie edytowane :count_delimited raz.|Ostatnio edytowane przez :user :when, łącznie edytowane :count_delimited razy.|Ostatnio edytowane przez :user :when, łącznie edytowane :count_delimited razy.',
5050 'posted_at' => 'opublikowane :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'opublikowane przez :username na :forum',
52525353 'actions' => [
5454 'destroy' => 'Usuń post',
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Este beatmap está trancado para discussão.',
57575858 'metadata' => [
5959 'nominated' => 'Você não pode alterar os metadados de um mapa nomeado. Entre em contato com um membro do BN ou NAT se você acha que ele está definido incorretamente.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Este mapa é estimado a ser ranqueado em :date se nenhum problema for encontrado. É o #:position na :queue.',
202202+ 'on' => '',
202203 'queue' => 'fila de ranqueamento',
203204 'soon' => 'em breve',
204205 ],
+2-2
resources/lang/pt-br/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Fóruns',
2929 'latest_post' => 'Última Publicação',
30303131 'index' => [
···4848 'confirm_restore' => 'Deseja mesmo restaurar a publicação?',
4949 'edited' => 'Última edição por :user :when, editado :count vezes no total.',
5050 'posted_at' => 'publicado :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'postado por :username em :forum',
52525353 'actions' => [
5454 'destroy' => 'Excluir publicação',
···200200201201 'rank_estimate' => [
202202 '_' => 'Este mapa está estimado a ser classificado em :date se não forem descobertos quaisquer problemas. Está em #:position na :queue.',
203203+ 'on' => '',
203204 'queue' => 'fila de classificação',
204205 'soon' => 'em breve',
205206 ],
+2-2
resources/lang/pt/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Fóruns',
2929 'latest_post' => 'Última publicação',
30303131 'index' => [
···4848 'confirm_restore' => 'Queres mesmo restaurar a publicação?',
4949 'edited' => 'Editado pela última vez por :user :when, editado :count vezes no total.',
5050 'posted_at' => 'publicado :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'publicado por :username em :forum',
52525353 'actions' => [
5454 'destroy' => 'Eliminar publicação',
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Discuțiile sunt blocate pe acest beatmap.',
57575858 'metadata' => [
5959 'nominated' => 'Nu poți schimba datele melodiei a unui beatmap nominalizat. Contactează un membru BN sau NAT dacă crezi că e setat greșit.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Acest beatmap este estimat a fi clasificat în data de :date dacă nu sunt găsite probleme. Este #:position în :queue.',
202202+ 'on' => '',
202203 'queue' => 'lista de așteptare pentru clasament',
203204 'soon' => 'în curând',
204205 ],
+2-2
resources/lang/ro/forum.php
···2525 ],
26262727 'forums' => [
2828- 'forums' => '',
2828+ 'forums' => 'Forum-uri',
2929 'latest_post' => 'Ultima Postare',
30303131 'index' => [
···4848 'confirm_restore' => 'Sigur dorești să restaurezi postarea?',
4949 'edited' => 'Editat ultima dată de către :user :when, editat o dată în total.|Editat ultima dată de către :user :when, editat de :count_delimited ori în total.',
5050 'posted_at' => 'postat :when',
5151- 'posted_by_in' => '',
5151+ 'posted_by_in' => 'postat de :username în :forum',
52525353 'actions' => [
5454 'destroy' => 'Șterge postarea',
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Обсуждение этой карты закрыто.',
57575858 'metadata' => [
5959 'nominated' => 'Вы не можете изменить метаданные номинируемой карты. В случае ошибок свяжитесь с номнатором или членом NAT.',
···119119 'add_to_cart' => 'Добавить в корзину',
120120 'notify' => 'Сообщить о поступлении!',
121121122122- 'notification_success' => 'Вы будете оповещены когда товар будет в наличии. Нажмите :link для отмены',
122122+ 'notification_success' => 'Вы будете оповещены, когда товар будет в наличии. Нажмите :link для отмены',
123123 'notification_remove_text' => 'сюда',
124124125125 'notification_in_stock' => 'Данный товар уже есть в наличии!',
···199199200200 'rank_estimate' => [
201201 '_' => 'Táto mapa je predpokladaná k hodnotení :date, pokud sa nenájdu žiadne chyby. Mapa je momentálne v pozícii číslo :position ve fronte :queue.',
202202+ 'on' => '',
202203 'queue' => 'fronta hodnotení ',
203204 'soon' => 'neskôr ',
204205 ],
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Ta beatmapa je zaklenjena za razpravo.',
57575858 'metadata' => [
5959 'nominated' => 'Urejanje metadata nominirane beatmape ni mogoče. Kontaktiraj člana BN ali NAT če misliš, da je ta narobe nastavljen.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Ta beatmapa bo približno rankirana :date če ne bo najdenih težav. Trenutno je #:position v :queue.',
202202+ 'on' => '',
202203 'queue' => 'čakalna vrsta rankiranja',
203204 'soon' => 'kmalu',
204205 ],
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Ова мапа је закључана за дискусију.',
57575858 'metadata' => [
5959 'nominated' => 'Не можете да промените метаподатке номиноване мапе. Контактирајте члана БН или НАТ групе ако мислите да су подаци нетачни.',
···200200201201 'rank_estimate' => [
202202 '_' => 'Процењује се да ће мапа бити померена у "ranked" секцију :date ако се не пронађу проблеми. Мапа је тренутно #:position у :queue.',
203203+ 'on' => '',
203204 'queue' => 'ред за "ranked" секцију',
204205 'soon' => 'ускоро',
205206 ],
···66return [
77 'index' => [
88 'description' => 'Färdigförpackade samlingar med beatmaps som är baserade på ett gemensamt tema.',
99+ 'empty' => '',
910 'nav_title' => 'listning',
1011 'title' => 'Beatmap-samlingar',
1112
+1
resources/lang/sv/beatmaps.php
···199199200200 'rank_estimate' => [
201201 '_' => 'Denna beatmap uppskattas vara rankad :date, så länge inga fel uppstår. Den är #:position i :queue.',
202202+ 'on' => '',
202203 'queue' => 'rankkö',
203204 'soon' => 'snart',
204205 ],
+3-3
resources/lang/sv/rankings.php
···2323 'multiplayer' => 'flerspelarläge',
2424 'performance' => 'prestation',
2525 'score' => 'poäng',
2626- 'seasons' => '',
2626+ 'seasons' => 'säsonger',
2727 ],
28282929 'seasons' => [
3030- 'empty' => '',
3131- 'ongoing' => '',
3030+ 'empty' => 'Det finns inga rum i denna säsong ännu.',
3131+ 'ongoing' => 'Denna säsong pågår fortfarande (det kommer läggas till fler spellistor).',
3232 'room_count' => '',
3333 'url' => '',
3434 ],
···5353 ],
54545555 'beatmapset' => [
5656- 'discussion_locked' => '',
5656+ 'discussion_locked' => 'Ця мапа закрита для обговорень.',
57575858 'metadata' => [
5959 'nominated' => 'Ви не можете змінювати метадані номінованій карті. Зв\'яжіться з членом BN або NAT, якщо ви думаєте, що вони вказані невірно.',
···199199200200 'rank_estimate' => [
201201 '_' => 'Ця мапа стане рейтинговою :date, якщо ніяких проблем не буде знайдено. Вона #:position в :queue.',
202202+ 'on' => '',
202203 'queue' => 'черзі на рейтинг',
203204 'soon' => 'дуже скоро',
204205 ],
+1-1
resources/lang/uk/events.php
···1515 'rank' => '<strong><em>:user</em></strong> отримав #:rank місце на мапі <em>:beatmap</em> (:mode)',
1616 'rank_lost' => '<strong><em>:user</em></strong> втратив лідерство на мапі <em>:beatmap</em> (:mode)',
1717 'user_support_again' => '<strong>:user</strong> вирішив знову підтримати osu! Дякуємо за вашу підтримку!',
1818- 'user_support_first' => '<strong>:user</strong> став osu!прихильником! Дякуємо за вашу підтримку!',
1818+ 'user_support_first' => '<strong>:user</strong> підтримав osu! - дякуємо за вашу підтримку!',
1919 'user_support_gift' => '<strong>:user</strong> отримав тег osu!прихильника в подарунок!',
2020 'username_change' => '<strong>:previousUsername</strong> змінив своє ім\'я на <strong><em>:user</em></strong>!',
2121
···157157 ],
158158 'restricted_banner' => [
159159 'title' => 'Ваш обліковий запис заблоковано!',
160160- 'message' => 'Під час блокування вашого облікового запису, ви не зможете взаємодіяти з іншими гравцями, і ваші результати будуть показуватись лише для вас. Зазвичай, цей процес відбувається автоматично і як правило, ці обмеження облікового запису знімаються протягом доби. :link',
160160+ 'message' => 'Під час блокування вашого облікового запису, ви не в змозі взаємодіяти з іншими гравцями, й ваші результати будуть показуватися лише вам. Зазвичай, цей автоматизований процес й, як правило, обмеження облікового запису знімаються протягом доби. :link',
161161 'message_link' => 'Натисніть сюди, щоб дізнатися подробиці.',
162162 ],
163163 'show' => [
+1
resources/lang/vi/beatmappacks.php
···66return [
77 'index' => [
88 'description' => 'Sưu tầm những map được đóng gói sẵn dựa trên chủ đề chung.',
99+ 'empty' => '',
910 'nav_title' => 'danh sách',
1011 'title' => 'Gói Beatmap',
1112
+1
resources/lang/vi/beatmaps.php
···199199200200 'rank_estimate' => [
201201 '_' => 'Map này ước tính sẽ được Xếp Hạng :date nếu không tìm ra lỗi nào. Nó đang ở #:position trong :queue.',
202202+ 'on' => '',
202203 'queue' => 'hàng chờ xếp hạng',
203204 'soon' => 'sớm',
204205 ],
···18181919Current rate limit is set at an insanely high 1200 requests per minute, with burst capability of up to 200 beyond that. If you require more, you probably fall into the above category of abuse. If you are doing more than 60 requests a minute, you should probably give [peppy](mailto:pe@ppy.sh) a yell.
20202121+# Wrappers
2222+2323+Below is a list of some language-specific wrappers maintained by the community. Your mileage may vary when using them – please report any issues to the wrapper first before reporting back to us.
2424+2525+- [ossapi](https://github.com/circleguard/ossapi) (python)
2626+- [aiosu](https://github.com/NiceAesth/aiosu) (python)
2727+- [rosu-v2](https://github.com/MaxOhn/rosu-v2) (rust)
2828+2129# Changelog
22302331For a full list of changes, see the
···11+<!-- m --><a href='https://osu.ppy.sh' rel='nofollow'>https://osu.ppy.sh</a><!-- m --> <!-- m --><a href='https://osu.ppy.sh' rel='nofollow'>https://osu.ppy.sh</a><!-- m -->
22+33+<!-- m --><a href='http://localhost/home' rel='nofollow'>home</a><!-- m -->
44+<!-- m --><a href='http://localhost/home' rel='nofollow'>home</a><!-- m -->
55+<!-- m --><a href='http://localhost/home' rel='nofollow'>home</a><!-- m -->
66+77+<!-- w --><a href='http://www.example.com' rel='nofollow'>www.example.com</a><!-- w -->
88+<!-- w --><a href='http://www.example.com' rel='nofollow'>www.example.com</a><!-- w -->
99+1010+<!-- e --><a href='mailto:user@example.com' rel='nofollow'>user@example.com</a><!-- e -->
1111+<!-- e --><a href='mailto:user@example.com' rel='nofollow'>user@example.com</a><!-- e -->
···11+<!-- m --><a href="https://osu.ppy.sh" rel="nofollow">https://osu.ppy.sh</a><!-- m --> <!-- m --><a href="https://osu.ppy.sh" rel="nofollow">https://osu.ppy.sh</a><!-- m --><br />
22+<br />
33+<!-- m --><a href="http://localhost/home" rel="nofollow">home</a><!-- m --><br />
44+<!-- m --><a href="http://localhost/home" rel="nofollow">home</a><!-- m --><br />
55+<!-- m --><a href="http://localhost/home" rel="nofollow">home</a><!-- m --><br />
66+<br />
77+<!-- w --><a href="http://www.example.com" rel="nofollow">www.example.com</a><!-- w --><br />
88+<!-- w --><a href="http://www.example.com" rel="nofollow">www.example.com</a><!-- w --><br />
99+<br />
1010+<!-- e --><a href="mailto:user@example.com" rel="nofollow">user@example.com</a><!-- e --><br />
1111+<!-- e --><a href="mailto:user@example.com" rel="nofollow">user@example.com</a><!-- e -->
+1-1
tests/Middleware/RouteScopesTest.php
···4545 'stream_id' => 1, // Changelog stream_id is tinyint, autoincrement makes test fail too soon.
4646 ]);
47474848- factory(Changelog::class)->create([
4848+ Changelog::factory()->create([
4949 'stream_id' => $stream->getKey(),
5050 'user_id' => 1, // user doesn't need to exist and not having to create a user makes the test much faster
5151 ]);