From af1304957329cfa9225371b7ffaa9e9917be829e Mon Sep 17 00:00:00 2001 From: Zsolt Zitting Date: Tue, 20 Apr 2021 20:17:05 -0600 Subject: [PATCH 0001/1261] Add OpenSearch metadata --- public/opensearch.xml | 10 ++++++++++ resources/views/layout/metadata.blade.php | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 public/opensearch.xml diff --git a/public/opensearch.xml b/public/opensearch.xml new file mode 100644 index 00000000000..70ff26000da --- /dev/null +++ b/public/opensearch.xml @@ -0,0 +1,10 @@ + + + osu! + osu! search + + https://osu.ppy.sh/favicon-16x16.png + https://osu.ppy.sh/favicon-32x32.png + https://osu.ppy.sh/home/search + + \ No newline at end of file diff --git a/resources/views/layout/metadata.blade.php b/resources/views/layout/metadata.blade.php index c478cf40df6..b2da617962d 100644 --- a/resources/views/layout/metadata.blade.php +++ b/resources/views/layout/metadata.blade.php @@ -15,6 +15,8 @@ + + @if (isset($opengraph)) From f3899a7e49538df1413c89a92526c3144162d47a Mon Sep 17 00:00:00 2001 From: Zsolt Zitting Date: Tue, 20 Apr 2021 20:23:23 -0600 Subject: [PATCH 0002/1261] Remove unneeded line --- public/opensearch.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/public/opensearch.xml b/public/opensearch.xml index 70ff26000da..1e982839c8e 100644 --- a/public/opensearch.xml +++ b/public/opensearch.xml @@ -1,4 +1,3 @@ - osu! osu! search From 74f48bf32ae61f9ffc556a197fcaeb75e3f4e7f1 Mon Sep 17 00:00:00 2001 From: Altar Date: Sun, 4 Sep 2022 17:43:54 +0200 Subject: [PATCH 0003/1261] Update country name changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per changes to the ISO 3166: "Czech Republic" -> "Czechia" "Turkey" -> "Türkiye" --- database/seeders/ModelSeeders/CountrySeeder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeders/ModelSeeders/CountrySeeder.php b/database/seeders/ModelSeeders/CountrySeeder.php index fa2f09ad0c1..b9598c2d2ab 100644 --- a/database/seeders/ModelSeeders/CountrySeeder.php +++ b/database/seeders/ModelSeeders/CountrySeeder.php @@ -100,7 +100,7 @@ private function getCountryData() ['acronym' => 'CV', 'name' => 'Cabo Verde', 'display' => 0], ['acronym' => 'CX', 'name' => 'Christmas Island', 'display' => 0], ['acronym' => 'CY', 'name' => 'Cyprus', 'display' => 1], - ['acronym' => 'CZ', 'name' => 'Czech Republic', 'display' => 1], + ['acronym' => 'CZ', 'name' => 'Czechia', 'display' => 1], ['acronym' => 'DE', 'name' => 'Germany', 'display' => 2], ['acronym' => 'DJ', 'name' => 'Djibouti', 'display' => 1], ['acronym' => 'DK', 'name' => 'Denmark', 'display' => 1], @@ -270,7 +270,7 @@ private function getCountryData() ['acronym' => 'TM', 'name' => 'Turkmenistan', 'display' => 0], ['acronym' => 'TN', 'name' => 'Tunisia', 'display' => 1], ['acronym' => 'TO', 'name' => 'Tonga', 'display' => 0], - ['acronym' => 'TR', 'name' => 'Turkey', 'display' => 1], + ['acronym' => 'TR', 'name' => 'Türkiye', 'display' => 1], ['acronym' => 'TT', 'name' => 'Trinidad and Tobago', 'display' => 1], ['acronym' => 'TV', 'name' => 'Tuvalu', 'display' => 0], ['acronym' => 'TW', 'name' => 'Taiwan', 'display' => 1], From 8be9fc3ff11b2858b18d4e5a80e43c401dd7fdff Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 16:21:32 +0900 Subject: [PATCH 0004/1261] add LazyLoad component --- resources/assets/lib/components/lazy-load.tsx | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 resources/assets/lib/components/lazy-load.tsx diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx new file mode 100644 index 00000000000..8244c8b728b --- /dev/null +++ b/resources/assets/lib/components/lazy-load.tsx @@ -0,0 +1,57 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import { Spinner } from 'components/spinner'; +import { action, makeObservable, observable } from 'mobx'; +import { observer } from 'mobx-react'; +import * as React from 'react'; + +interface Props { + onLoad: () => PromiseLike; + placeholder?: React.ReactNode; +} + +@observer +export default class LazyLoad extends React.Component> { + @observable loaded = false; + + private observer: IntersectionObserver; + private ref = React.createRef(); + + constructor(props: React.PropsWithChildren) { + super(props); + + this.observer = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + this.load(); + } + }); + + makeObservable(this); + } + + componentDidMount() { + if (this.ref.current == null) return; + + this.observer.observe(this.ref.current); + } + + componentWillUnmount() { + this.observer.disconnect(); + } + + + render() { + if (!this.loaded) { + return
; + } + + return this.props.children; + } + + @action + private load() { + this.observer.disconnect(); + this.props.onLoad().then(action(() => this.loaded = true)); + } +} From 174a487e18b9cb713b739c88721c56019f4e9276 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 16:43:38 +0900 Subject: [PATCH 0005/1261] converting to use LazyLoad --- .../lib/components/profile-page-kudosu.tsx | 89 +++++++---- .../assets/lib/profile-page/beatmapsets.tsx | 9 +- .../assets/lib/profile-page/controller.tsx | 141 +++++++++++++----- .../assets/lib/profile-page/extra-page.tsx | 11 ++ .../assets/lib/profile-page/historical.tsx | 124 ++++++++------- .../lib/profile-page/play-detail-list.tsx | 8 +- .../lib/profile-page/recent-activity.tsx | 9 +- .../assets/lib/profile-page/top-scores.tsx | 11 +- 8 files changed, 277 insertions(+), 125 deletions(-) create mode 100644 resources/assets/lib/profile-page/extra-page.tsx diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index b5fa84fd0b9..f009f373bc1 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -2,12 +2,15 @@ // See the LICENCE file in the repository root for full licence text. import KudosuHistoryJson from 'interfaces/kudosu-history-json'; +import { makeObservable, observable, runInAction } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; +import getPage from 'profile-page/extra-page'; import * as React from 'react'; import { formatNumber } from 'utils/html'; -import { OffsetPaginatorJson } from 'utils/offset-paginator'; +import { hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; import { wikiUrl } from 'utils/url'; +import LazyLoad from './lazy-load'; import ShowMoreLink from './show-more-link'; import StringWithComponent from './string-with-component'; import TimeWithTooltip from './time-with-tooltip'; @@ -46,7 +49,7 @@ function Entry({ kudosu }: { kudosu: KudosuHistoryJson }) { } interface Props { - kudosu: OffsetPaginatorJson; + kudosu?: OffsetPaginatorJson; name: string; onShowMore: () => void; total: number; @@ -54,40 +57,76 @@ interface Props { withEdit: boolean; } +interface Response { + items: KudosuHistoryJson[]; +} + @observer export default class ProfilePageKudosu extends React.Component { + @observable + private kudosu?: OffsetPaginatorJson; + + private xhr?: JQuery.jqXHR; + + constructor(props: Props) { + super(props); + + this.kudosu = props.kudosu; + + makeObservable(this); + } + render() { return (
-
- - {osu.trans('users.show.extra.kudosu.total_info.link')} - - ), - }} - pattern={osu.trans('users.show.extra.kudosu.total_info._')} - /> - )} - label={osu.trans('users.show.extra.kudosu.total')} - modifiers='kudosu' - value={formatNumber(this.props.total)} - /> -
+ +
+ + {osu.trans('users.show.extra.kudosu.total_info.link')} + + ), + }} + pattern={osu.trans('users.show.extra.kudosu.total_info._')} + /> + )} + label={osu.trans('users.show.extra.kudosu.total')} + modifiers='kudosu' + value={formatNumber(this.props.total)} + /> +
- {this.renderEntries()} + {this.renderEntries()} +
); } + private readonly handleOnLoad = () => { + this.xhr = getPage({ id: this.props.userId }, 'kudosu'); + + this.xhr.done((json) => runInAction(() => { + const items = json.items; + const hasMore = hasMoreCheck(5, items); + this.kudosu = { + items, + pagination: { hasMore }, + }; + })); + + return this.xhr; + }; + private renderEntries() { - if (this.props.kudosu.items.length === 0) { + if (this.kudosu == null) return null; + + if (this.kudosu.items.length === 0) { return (
{osu.trans('users.show.extra.kudosu.entry.empty')} @@ -97,11 +136,11 @@ export default class ProfilePageKudosu extends React.Component { return (
    - {Array.isArray(this.props.kudosu.items) && this.props.kudosu.items.map((kudosu) => )} + {Array.isArray(this.kudosu.items) && this.kudosu.items.map((kudosu) => )}
  • diff --git a/resources/assets/lib/profile-page/beatmapsets.tsx b/resources/assets/lib/profile-page/beatmapsets.tsx index 50539d94c61..2a001e0822a 100644 --- a/resources/assets/lib/profile-page/beatmapsets.tsx +++ b/resources/assets/lib/profile-page/beatmapsets.tsx @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. import BeatmapsetPanel from 'components/beatmapset-panel'; +import LazyLoad from 'components/lazy-load'; import ProfilePageExtraSectionTitle from 'components/profile-page-extra-section-title'; import ShowMoreLink from 'components/show-more-link'; import { observer } from 'mobx-react'; @@ -42,17 +43,23 @@ export default class Beatmapsets extends React.Component { return (
    - {sectionKeys.map(this.renderBeatmapsets)} + + {sectionKeys.map(this.renderBeatmapsets)} +
    ); } + private readonly handleOnLoad = () => this.props.controller.getBeatmapsets(); + private readonly onShowMore = (section: BeatmapsetSection) => { this.props.controller.apiShowMore(section); }; private readonly renderBeatmapsets = (section: typeof sectionKeys[number]) => { const state = this.props.controller.state.beatmapsets; + if (state == null) return; + const count = state[section.key].count; const beatmapsets = state[section.key].items; const pagination = state[section.key].pagination; diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index e36a32d0adc..5cb2e6a816e 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -17,13 +17,14 @@ import UserMonthlyPlaycountJson from 'interfaces/user-monthly-playcount-json'; import UserReplaysWatchedCountJson from 'interfaces/user-replays-watched-count-json'; import { route } from 'laroute'; import { debounce, keyBy, pullAt } from 'lodash'; -import { action, makeObservable, observable } from 'mobx'; +import { action, makeObservable, observable, runInAction } from 'mobx'; import core from 'osu-core-singleton'; import { error, onErrorWithCallback } from 'utils/ajax'; import { jsonClone } from 'utils/json'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; import { apiShowMore, apiShowMoreRecentlyReceivedKudosu } from 'utils/offset-paginator'; import { switchNever } from 'utils/switch-never'; +import getPage from './extra-page'; import { ProfilePageSection, ProfilePageUserJson } from './extra-page-props'; const sectionToUrlType = { @@ -83,13 +84,13 @@ interface ScorePinReorderParams { } interface State { - beatmapsets: BeatmapsetsJson; + beatmapsets?: BeatmapsetsJson; currentPage: Page; editingUserPage: boolean; - historical: HistoricalJson; - kudosu: PageSectionWithoutCountJson; - recentActivity: PageSectionWithoutCountJson; - topScores: TopScoresJson; + historical?: HistoricalJson; + kudosu?: PageSectionWithoutCountJson; + recentActivity?: PageSectionWithoutCountJson; + topScores?: TopScoresJson; user: ProfilePageUserJson; } @@ -121,13 +122,8 @@ export default class Controller { if (savedStateJson == null) { this.state = { - beatmapsets: initialData.beatmaps, currentPage: 'main', editingUserPage: false, - historical: initialData.historical, - kudosu: initialData.kudosu, - recentActivity: initialData.recent_activity, - topScores: initialData.top_ranks, user: initialData.user, }; } else { @@ -147,6 +143,8 @@ export default class Controller { @action apiReorderScorePin(currentIndex: number, newIndex: number) { + if (this.state.topScores == null) return; + const origItems = this.state.topScores.pinned.items.slice(); const items = this.state.topScores.pinned.items; const adjacentScoreId = items[newIndex]?.id; @@ -185,7 +183,9 @@ export default class Controller { method: 'PUT', }).fail(action((xhr: JQuery.jqXHR, status: string) => { error(xhr, status); - this.state.topScores.pinned.items = origItems; + if (this.state.topScores != null) { + this.state.topScores.pinned.items = origItems; + } })).always(hideLoadingOverlay); } @@ -283,13 +283,15 @@ export default class Controller { switch (section) { case 'beatmapPlaycounts': { - const json = this.state.historical.beatmap_playcounts; + if (this.state.historical != null) { + const json = this.state.historical.beatmap_playcounts; - this.xhr[section] = apiShowMore( - json, - 'users.beatmapsets', - { ...baseParams, type: 'most_played' }, - ); + this.xhr[section] = apiShowMore( + json, + 'users.beatmapsets', + { ...baseParams, type: 'most_played' }, + ); + } break; } @@ -300,31 +302,39 @@ export default class Controller { case 'lovedBeatmapsets': case 'pendingBeatmapsets': case 'rankedBeatmapsets': { - const type = sectionToUrlType[section]; - const json = this.state.beatmapsets[type]; + if (this.state.beatmapsets != null) { + const type = sectionToUrlType[section]; + const json = this.state.beatmapsets[type]; - this.xhr[section] = apiShowMore( - json, - 'users.beatmapsets', - { ...baseParams, type: sectionToUrlType[section] }, - ); + this.xhr[section] = apiShowMore( + json, + 'users.beatmapsets', + { ...baseParams, type: sectionToUrlType[section] }, + ); + } break; } case 'recentActivity': - this.xhr[section] = apiShowMore( - this.state.recentActivity, - 'users.recent-activity', - baseParams, - ); + if (this.state.recentActivity != null) { + this.xhr[section] = apiShowMore( + this.state.recentActivity, + 'users.recent-activity', + baseParams, + ); + } + break; case 'recentlyReceivedKudosu': - this.xhr[section] = apiShowMoreRecentlyReceivedKudosu( - this.state.kudosu, - baseParams.user, - ); + if (this.state.kudosu != null) { + this.xhr[section] = apiShowMoreRecentlyReceivedKudosu( + this.state.kudosu, + baseParams.user, + ); + } + break; case 'scoresBest': @@ -332,13 +342,15 @@ export default class Controller { case 'scoresPinned': case 'scoresRecent': { const type = sectionToUrlType[section]; - const json = type === 'recent' ? this.state.historical.recent : this.state.topScores[type]; + const json = type === 'recent' ? this.state.historical?.recent : this.state.topScores?.[type]; - this.xhr[section] = apiShowMore( - json, - 'users.scores', - { ...baseParams, mode: this.currentMode, type }, - ); + if (json != null) { + this.xhr[section] = apiShowMore( + json, + 'users.scores', + { ...baseParams, mode: this.currentMode, type }, + ); + } break; } @@ -359,6 +371,54 @@ export default class Controller { this.saveState(); } + @action + getBeatmapsets() { + if (this.state.beatmapsets != null) return Promise.resolve(); + const xhr = getPage(this.state.user, 'beatmaps') as JQuery.jqXHR; + + xhr.done((json) => runInAction(() => { + this.state.beatmapsets = json; + })); + + return xhr; + } + + @action + getHistorical() { + if (this.state.historical != null) return Promise.resolve(); + const xhr = getPage(this.state.user, 'historical') as JQuery.jqXHR; + + xhr.done((json) => runInAction(() => { + this.state.historical = json; + })); + + return xhr; + } + + @action + getRecentActivity() { + if (this.state.topScores != null) return Promise.resolve(); + const xhr = getPage(this.state.user, 'recent_activity') as JQuery.jqXHR>; + + xhr.done((json) => runInAction(() => { + this.state.recentActivity = json; + })); + + return xhr; + } + + @action + getTopScores() { + if (this.state.topScores != null) return Promise.resolve(); + const xhr = getPage(this.state.user, 'top_ranks') as JQuery.jqXHR; + + xhr.done((json) => runInAction(() => { + this.state.topScores = json; + })); + + return xhr; + } + @action setCover(cover: UserCoverJson) { core.currentUserOrFail.cover = this.state.user.cover = cover; @@ -372,6 +432,7 @@ export default class Controller { @action private readonly onScorePinUpdate = (event: unknown, isPinned: boolean, score: SoloScoreJson) => { + if (this.state.topScores == null) return; // make sure the typing is correct if (!isSoloScoreJsonForUser(score)) { return; diff --git a/resources/assets/lib/profile-page/extra-page.tsx b/resources/assets/lib/profile-page/extra-page.tsx new file mode 100644 index 00000000000..65d582c0f34 --- /dev/null +++ b/resources/assets/lib/profile-page/extra-page.tsx @@ -0,0 +1,11 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import { ProfileExtraPage } from 'interfaces/user-extended-json'; +import UserJson from 'interfaces/user-json'; + +import { route } from 'laroute'; + +export default function getPage(user: Pick, page: ProfileExtraPage) { + return $.ajax(route('users.extra-page', { page, user: user.id })); +} diff --git a/resources/assets/lib/profile-page/historical.tsx b/resources/assets/lib/profile-page/historical.tsx index a4f19123bd6..005525d66fa 100644 --- a/resources/assets/lib/profile-page/historical.tsx +++ b/resources/assets/lib/profile-page/historical.tsx @@ -2,11 +2,12 @@ // See the LICENCE file in the repository root for full licence text. import LineChart, { makeOptionsDate } from 'charts/line-chart'; +import LazyLoad from 'components/lazy-load'; import ProfilePageExtraSectionTitle from 'components/profile-page-extra-section-title'; import ShowMoreLink from 'components/show-more-link'; import { curveLinear } from 'd3'; import { escape, sortBy, times } from 'lodash'; -import { autorun, computed, makeObservable } from 'mobx'; +import { action, autorun, computed, makeObservable } from 'mobx'; import { disposeOnUnmount, observer } from 'mobx-react'; import * as moment from 'moment'; import core from 'osu-core-singleton'; @@ -95,12 +96,12 @@ export default class Historical extends React.Component { @computed private get monthlyPlaycountsData() { - return convertUserDataForChart(this.historical.monthly_playcounts); + return convertUserDataForChart(this.historical?.monthly_playcounts ?? []); } @computed private get replaysWatchedCountsData() { - return convertUserDataForChart(this.historical.replays_watched_counts); + return convertUserDataForChart(this.historical?.replays_watched_counts ?? []); } constructor(props: ExtraPageProps) { @@ -124,6 +125,28 @@ export default class Historical extends React.Component {
    + + {this.renderHistorical()} + +
    + ); + } + + private readonly handleOnLoad = () => this.props.controller.getHistorical(); + + private hasSection(attribute: ChartSection) { + return this.historical != null && this.historical[attribute].length > 0; + } + + private readonly onShowMore = (section: HistoricalSection) => { + this.props.controller.apiShowMore(section); + }; + + private renderHistorical() { + if (this.historical == null) return; + + return ( + <> {this.hasSection('monthly_playcounts') && <> @@ -168,18 +191,10 @@ export default class Historical extends React.Component {
} - + ); } - private hasSection(attribute: ChartSection) { - return this.historical[attribute].length > 0; - } - - private readonly onShowMore = (section: HistoricalSection) => { - this.props.controller.apiShowMore(section); - }; - private readonly resizeCharts = () => { Object.values(this.charts).forEach((chart) => { chart.resize(); @@ -189,47 +204,50 @@ export default class Historical extends React.Component { private readonly updateChart = (attribute: ChartSection) => { if (!this.hasSection(attribute)) return; - const area = this.chartRefs[attribute].current; - - if (area == null) { - throw new Error("chart can't be updated before the component is mounted"); - } - - let data: ChartData[]; - switch (attribute) { - case 'monthly_playcounts': - data = this.monthlyPlaycountsData; - break; - case 'replays_watched_counts': - data = this.replaysWatchedCountsData; - break; - default: - switchNever(attribute); - throw new Error('unsupported chart section'); - } - - let chart = this.charts[attribute]; - if (chart == null) { - const options = makeOptionsDate({ - circleLine: true, - curve: curveLinear, - formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), - formatY: (d: number) => formatNumber(d), - infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), - infoBoxFormatY: (d: number) => `${osu.trans(`users.show.extra.historical.${attribute}.count_label`)} ${escape(formatNumber(d))}`, - marginRight: 60, // more spacing for x axis label - modifiers: 'profile-page', - }); - - chart = this.charts[attribute] = new LineChart(area, options); - } - - const definedChart = chart; - - this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { - updateTicks(definedChart, data); - definedChart.loadData(data); - })); + // Need to wait for the ref to be set after the lazy load. + setTimeout(action(() => { + const area = this.chartRefs[attribute].current; + + if (area == null) { + throw new Error("chart can't be updated before the component is mounted"); + } + + let data: ChartData[]; + switch (attribute) { + case 'monthly_playcounts': + data = this.monthlyPlaycountsData; + break; + case 'replays_watched_counts': + data = this.replaysWatchedCountsData; + break; + default: + switchNever(attribute); + throw new Error('unsupported chart section'); + } + + let chart = this.charts[attribute]; + if (chart == null) { + const options = makeOptionsDate({ + circleLine: true, + curve: curveLinear, + formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), + formatY: (d: number) => formatNumber(d), + infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), + infoBoxFormatY: (d: number) => `${osu.trans(`users.show.extra.historical.${attribute}.count_label`)} ${escape(formatNumber(d))}`, + marginRight: 60, // more spacing for x axis label + modifiers: 'profile-page', + }); + + chart = this.charts[attribute] = new LineChart(area, options); + } + + const definedChart = chart; + + this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { + updateTicks(definedChart, data); + definedChart.loadData(data); + })); + }), 0); }; private readonly updateCharts = () => { diff --git a/resources/assets/lib/profile-page/play-detail-list.tsx b/resources/assets/lib/profile-page/play-detail-list.tsx index 880e038f41d..761fdffd9a9 100644 --- a/resources/assets/lib/profile-page/play-detail-list.tsx +++ b/resources/assets/lib/profile-page/play-detail-list.tsx @@ -51,7 +51,7 @@ export default class PlayDetailList extends React.Component { @computed private get scores() { - return this.sectionMap.key === 'recent' ? this.props.controller.state.historical.recent : this.props.controller.state.topScores[this.sectionMap.key]; + return this.sectionMap.key === 'recent' ? this.props.controller.state.historical?.recent : this.props.controller.state.topScores?.[this.sectionMap.key]; } @computed @@ -66,6 +66,8 @@ export default class PlayDetailList extends React.Component { @computed private get uniqueItems() { + if (this.scores == null) return []; + const ret = new Map(); this.scores.items.forEach((item) => ret.set(item.id, item)); @@ -107,6 +109,8 @@ export default class PlayDetailList extends React.Component { } render() { + if (this.scores == null) return null; + const showPpWeight = 'showPpWeight' in this.sectionMap && this.sectionMap.showPpWeight; return ( @@ -151,7 +155,7 @@ export default class PlayDetailList extends React.Component { }; private onUpdatePinOrder = (event: Event, ui: JQueryUI.SortableUIParams) => { - if (!Array.isArray(this.scores.items)) { + if (this.scores == null) { throw new Error('trying to update pin order with missing data'); } diff --git a/resources/assets/lib/profile-page/recent-activity.tsx b/resources/assets/lib/profile-page/recent-activity.tsx index 4b02df7bc2f..c154a0c36a8 100644 --- a/resources/assets/lib/profile-page/recent-activity.tsx +++ b/resources/assets/lib/profile-page/recent-activity.tsx @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import LazyLoad from 'components/lazy-load'; import ShowMoreLink from 'components/show-more-link'; import StringWithComponent from 'components/string-with-component'; import TimeWithTooltip from 'components/time-with-tooltip'; @@ -20,11 +21,15 @@ export default class RecentActivity extends React.Component { return (
- {this.props.controller.state.recentActivity.items.length > 0 ? this.renderEntries() : this.renderEmpty()} + + {(this.props.controller.state.recentActivity?.items.length ?? 0) > 0 ? this.renderEntries() : this.renderEmpty()} +
); } + private readonly handleOnLoad = () => this.props.controller.getRecentActivity(); + private readonly onShowMore = () => { this.props.controller.apiShowMore('recentActivity'); }; @@ -34,6 +39,8 @@ export default class RecentActivity extends React.Component { } private renderEntries() { + if (this.props.controller.state.recentActivity == null) return null; + return (
    {this.props.controller.state.recentActivity.items.map(this.renderEntry)} diff --git a/resources/assets/lib/profile-page/top-scores.tsx b/resources/assets/lib/profile-page/top-scores.tsx index b380a350ec8..1ac161d98cf 100644 --- a/resources/assets/lib/profile-page/top-scores.tsx +++ b/resources/assets/lib/profile-page/top-scores.tsx @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import LazyLoad from 'components/lazy-load'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; import * as React from 'react'; @@ -25,10 +26,14 @@ export default class TopScores extends React.Component { )} - {topScoreSections.map((section) => ( - - ))} + + {topScoreSections.map((section) => ( + + ))} + ); } + + private readonly handleLazyLoad = () => this.props.controller.getTopScores(); } From 21d44c09b5df73451a838ba6adc6c6f6d5d44d3d Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 20:10:50 +0900 Subject: [PATCH 0006/1261] move kudosu handling into component --- .../lib/components/profile-page-kudosu.tsx | 34 +++++++++++++++---- .../assets/lib/modding-profile/kudosu.tsx | 27 +++------------ .../assets/lib/profile-page/controller.tsx | 10 ++---- resources/assets/lib/profile-page/kudosu.tsx | 5 --- 4 files changed, 33 insertions(+), 43 deletions(-) diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index f009f373bc1..ae61f347369 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -2,13 +2,14 @@ // See the LICENCE file in the repository root for full licence text. import KudosuHistoryJson from 'interfaces/kudosu-history-json'; -import { makeObservable, observable, runInAction } from 'mobx'; +import { action, makeObservable, observable, runInAction } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; import getPage from 'profile-page/extra-page'; import * as React from 'react'; import { formatNumber } from 'utils/html'; -import { hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; +import { parseJsonNullable, storeJson } from 'utils/json'; +import { apiShowMoreRecentlyReceivedKudosu, hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; import { wikiUrl } from 'utils/url'; import LazyLoad from './lazy-load'; import ShowMoreLink from './show-more-link'; @@ -16,6 +17,8 @@ import StringWithComponent from './string-with-component'; import TimeWithTooltip from './time-with-tooltip'; import ValueDisplay from './value-display'; +const jsonId = 'kudosu'; + function Entry({ kudosu }: { kudosu: KudosuHistoryJson }) { const textMappings = { amount: ( @@ -51,7 +54,6 @@ function Entry({ kudosu }: { kudosu: KudosuHistoryJson }) { interface Props { kudosu?: OffsetPaginatorJson; name: string; - onShowMore: () => void; total: number; userId: number; withEdit: boolean; @@ -65,17 +67,22 @@ interface Response { export default class ProfilePageKudosu extends React.Component { @observable private kudosu?: OffsetPaginatorJson; - + private showMoreXhr?: JQuery.jqXHR; private xhr?: JQuery.jqXHR; constructor(props: Props) { super(props); - this.kudosu = props.kudosu; + this.kudosu = parseJsonNullable(jsonId) ?? props.kudosu; makeObservable(this); } + componentWillUnmount(){ + this.xhr?.abort(); + this.showMoreXhr?.abort(); + } + render() { return (
    @@ -108,7 +115,9 @@ export default class ProfilePageKudosu extends React.Component { ); } + @action private readonly handleOnLoad = () => { + if (this.kudosu != null) return Promise.resolve(); this.xhr = getPage({ id: this.props.userId }, 'kudosu'); this.xhr.done((json) => runInAction(() => { @@ -123,6 +132,13 @@ export default class ProfilePageKudosu extends React.Component { return this.xhr; }; + @action + private readonly handleShowMore = () => { + if (this.kudosu == null) return; + + this.showMoreXhr = apiShowMoreRecentlyReceivedKudosu(this.kudosu, this.props.userId).done(this.saveState); + }; + private renderEntries() { if (this.kudosu == null) return null; @@ -136,16 +152,20 @@ export default class ProfilePageKudosu extends React.Component { return (
      - {Array.isArray(this.kudosu.items) && this.kudosu.items.map((kudosu) => )} + {this.kudosu.items.map((kudosu) => )}
    ); } + + private readonly saveState = () => { + storeJson(jsonId, this.kudosu); + }; } diff --git a/resources/assets/lib/modding-profile/kudosu.tsx b/resources/assets/lib/modding-profile/kudosu.tsx index 685883bb12a..3aac57dde7e 100644 --- a/resources/assets/lib/modding-profile/kudosu.tsx +++ b/resources/assets/lib/modding-profile/kudosu.tsx @@ -6,8 +6,8 @@ import KudosuHistoryJson from 'interfaces/kudosu-history-json'; import { makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import * as React from 'react'; -import { jsonClone, parseJsonNullable, storeJson } from 'utils/json'; -import { apiShowMoreRecentlyReceivedKudosu, hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; +import { jsonClone } from 'utils/json'; +import { hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; interface Props { expectedInitialCount: number; @@ -19,8 +19,6 @@ interface Props { type MobxState = OffsetPaginatorJson; -const jsonId = 'kudosu'; - @observer export default class Kudosu extends React.Component { @observable private mobxState: MobxState = { @@ -33,14 +31,8 @@ export default class Kudosu extends React.Component { super(props); // TODO: this should be handled by Main component instead. - const savedState = parseJsonNullable(jsonId); - - if (savedState == null) { - this.mobxState.items = jsonClone(props.initialKudosu); - this.mobxState.pagination.hasMore = hasMoreCheck(props.expectedInitialCount, this.mobxState.items); - } else { - this.mobxState = savedState; - } + this.mobxState.items = jsonClone(props.initialKudosu); + this.mobxState.pagination.hasMore = hasMoreCheck(props.expectedInitialCount, this.mobxState.items); makeObservable(this); } @@ -54,21 +46,10 @@ export default class Kudosu extends React.Component { ); } - - private readonly onShowMore = () => { - this.xhr = apiShowMoreRecentlyReceivedKudosu(this.mobxState, this.props.userId) - .done(this.saveState); - }; - - - private readonly saveState = () => { - storeJson(jsonId, this.mobxState); - }; } diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 5cb2e6a816e..1bb670c2ef4 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -22,7 +22,7 @@ import core from 'osu-core-singleton'; import { error, onErrorWithCallback } from 'utils/ajax'; import { jsonClone } from 'utils/json'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; -import { apiShowMore, apiShowMoreRecentlyReceivedKudosu } from 'utils/offset-paginator'; +import { apiShowMore } from 'utils/offset-paginator'; import { switchNever } from 'utils/switch-never'; import getPage from './extra-page'; import { ProfilePageSection, ProfilePageUserJson } from './extra-page-props'; @@ -328,13 +328,7 @@ export default class Controller { break; case 'recentlyReceivedKudosu': - if (this.state.kudosu != null) { - this.xhr[section] = apiShowMoreRecentlyReceivedKudosu( - this.state.kudosu, - baseParams.user, - ); - } - + // do nothing break; case 'scoresBest': diff --git a/resources/assets/lib/profile-page/kudosu.tsx b/resources/assets/lib/profile-page/kudosu.tsx index c2113c70c2b..5e01cf3d346 100644 --- a/resources/assets/lib/profile-page/kudosu.tsx +++ b/resources/assets/lib/profile-page/kudosu.tsx @@ -11,15 +11,10 @@ export default class Kudosu extends React.Component { ); } - - private readonly onShowMore = () => { - this.props.controller.apiShowMore('recentlyReceivedKudosu'); - }; } From b265119fccdfc699c005df8162f3020c2975b8a0 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 20:26:44 +0900 Subject: [PATCH 0007/1261] actually skip lazyload from initial data --- app/Http/Controllers/UsersController.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index a2447419f10..cb9b384a9ea 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -639,13 +639,6 @@ public function show($id, $mode = null) 'user' => $userArray, ]; - // moved data - // TODO: lazy load - $this->parsePaginationParams(); - foreach (static::LAZY_EXTRA_PAGES as $page) { - $initialData[$page] = $this->extraPages($id, $page); - } - return ext_view('users.show', compact('initialData', 'user')); } } From 2d15ab84d81f2ae5bb82f5161e01d5c482bc8436 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 21:24:02 +0900 Subject: [PATCH 0008/1261] move cast into function --- resources/assets/lib/profile-page/controller.tsx | 8 ++++---- resources/assets/lib/profile-page/extra-page.tsx | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 1bb670c2ef4..5a42861d810 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -368,7 +368,7 @@ export default class Controller { @action getBeatmapsets() { if (this.state.beatmapsets != null) return Promise.resolve(); - const xhr = getPage(this.state.user, 'beatmaps') as JQuery.jqXHR; + const xhr = getPage(this.state.user, 'beatmaps'); xhr.done((json) => runInAction(() => { this.state.beatmapsets = json; @@ -380,7 +380,7 @@ export default class Controller { @action getHistorical() { if (this.state.historical != null) return Promise.resolve(); - const xhr = getPage(this.state.user, 'historical') as JQuery.jqXHR; + const xhr = getPage(this.state.user, 'historical'); xhr.done((json) => runInAction(() => { this.state.historical = json; @@ -392,7 +392,7 @@ export default class Controller { @action getRecentActivity() { if (this.state.topScores != null) return Promise.resolve(); - const xhr = getPage(this.state.user, 'recent_activity') as JQuery.jqXHR>; + const xhr = getPage>(this.state.user, 'recent_activity'); xhr.done((json) => runInAction(() => { this.state.recentActivity = json; @@ -404,7 +404,7 @@ export default class Controller { @action getTopScores() { if (this.state.topScores != null) return Promise.resolve(); - const xhr = getPage(this.state.user, 'top_ranks') as JQuery.jqXHR; + const xhr = getPage(this.state.user, 'top_ranks'); xhr.done((json) => runInAction(() => { this.state.topScores = json; diff --git a/resources/assets/lib/profile-page/extra-page.tsx b/resources/assets/lib/profile-page/extra-page.tsx index 65d582c0f34..c87bc9bdd60 100644 --- a/resources/assets/lib/profile-page/extra-page.tsx +++ b/resources/assets/lib/profile-page/extra-page.tsx @@ -6,6 +6,6 @@ import UserJson from 'interfaces/user-json'; import { route } from 'laroute'; -export default function getPage(user: Pick, page: ProfileExtraPage) { - return $.ajax(route('users.extra-page', { page, user: user.id })); +export default function getPage(user: Pick, page: ProfileExtraPage) { + return $.ajax(route('users.extra-page', { page, user: user.id })) as JQuery.jqXHR; } From 469a3662566613ec85ab5e9042df7e1dec8a8861 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 21:47:10 +0900 Subject: [PATCH 0009/1261] remove initial data properties --- resources/assets/lib/profile-page/controller.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 5a42861d810..bf3e077f6a3 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -64,13 +64,8 @@ export function validPage(page: unknown) { interface InitialData { achievements: AchievementJson[]; - beatmaps: BeatmapsetsJson; current_mode: GameMode; - historical: HistoricalJson; - kudosu: PageSectionWithoutCountJson; - recent_activity: PageSectionWithoutCountJson; scores_notice: string | null; - top_ranks: TopScoresJson; user: ProfilePageUserJson; } From 3b2fe727d9bc5f084a29c260ea139e97b30b972a Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 30 Sep 2022 23:21:29 +0900 Subject: [PATCH 0010/1261] correct response typing --- app/Http/Controllers/UsersController.php | 1 + .../lib/components/profile-page-kudosu.tsx | 17 ++++----------- .../interfaces/profile-page/extras-json.ts | 21 ------------------- .../assets/lib/profile-page/controller.tsx | 3 +-- .../{extra-page.tsx => extra-page.ts} | 14 ++++++++++++- 5 files changed, 19 insertions(+), 37 deletions(-) delete mode 100644 resources/assets/lib/interfaces/profile-page/extras-json.ts rename resources/assets/lib/profile-page/{extra-page.tsx => extra-page.ts} (61%) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index cb9b384a9ea..ff3f27b3c94 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -143,6 +143,7 @@ public function checkUsernameExists() public function extraPages($_id, $page) { // TODO: counts basically duplicated from UserCompactTransformer + // TOOD: switch to cursor pagination? switch ($page) { case 'beatmaps': return [ diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index ae61f347369..d221ca01eb3 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -5,11 +5,11 @@ import KudosuHistoryJson from 'interfaces/kudosu-history-json'; import { action, makeObservable, observable, runInAction } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; -import getPage from 'profile-page/extra-page'; +import getPage, { PageSectionWithoutCountJson } from 'profile-page/extra-page'; import * as React from 'react'; import { formatNumber } from 'utils/html'; import { parseJsonNullable, storeJson } from 'utils/json'; -import { apiShowMoreRecentlyReceivedKudosu, hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; +import { apiShowMoreRecentlyReceivedKudosu, OffsetPaginatorJson } from 'utils/offset-paginator'; import { wikiUrl } from 'utils/url'; import LazyLoad from './lazy-load'; import ShowMoreLink from './show-more-link'; @@ -59,16 +59,12 @@ interface Props { withEdit: boolean; } -interface Response { - items: KudosuHistoryJson[]; -} - @observer export default class ProfilePageKudosu extends React.Component { @observable private kudosu?: OffsetPaginatorJson; private showMoreXhr?: JQuery.jqXHR; - private xhr?: JQuery.jqXHR; + private xhr?: JQuery.jqXHR>; constructor(props: Props) { super(props); @@ -121,12 +117,7 @@ export default class ProfilePageKudosu extends React.Component { this.xhr = getPage({ id: this.props.userId }, 'kudosu'); this.xhr.done((json) => runInAction(() => { - const items = json.items; - const hasMore = hasMoreCheck(5, items); - this.kudosu = { - items, - pagination: { hasMore }, - }; + this.kudosu = json; })); return this.xhr; diff --git a/resources/assets/lib/interfaces/profile-page/extras-json.ts b/resources/assets/lib/interfaces/profile-page/extras-json.ts deleted file mode 100644 index ba35fc43f6b..00000000000 --- a/resources/assets/lib/interfaces/profile-page/extras-json.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. -// See the LICENCE file in the repository root for full licence text. - -import EventJson from 'interfaces/event-json'; -import KudosuHistoryJson from 'interfaces/kudosu-history-json'; -import { OffsetPaginationJson } from 'utils/offset-paginator'; - -export default interface ExtrasJson { - recentActivity: EventJson[]; - recentlyReceivedKudosu: KudosuHistoryJson[]; -} - -export interface PageSectionJson extends PageSectionWithoutCountJson { - count: number; -} - -// TODO: basically OffsetPaginatorJson now -export interface PageSectionWithoutCountJson { - items: T[]; - pagination: OffsetPaginationJson; -} diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index bf3e077f6a3..00f639de49d 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -8,7 +8,6 @@ import CurrentUserJson from 'interfaces/current-user-json'; import EventJson from 'interfaces/event-json'; import GameMode from 'interfaces/game-mode'; import KudosuHistoryJson from 'interfaces/kudosu-history-json'; -import { PageSectionJson, PageSectionWithoutCountJson } from 'interfaces/profile-page/extras-json'; import { ScoreCurrentUserPinJson } from 'interfaces/score-json'; import SoloScoreJson, { isSoloScoreJsonForUser, SoloScoreJsonForUser } from 'interfaces/solo-score-json'; import UserCoverJson from 'interfaces/user-cover-json'; @@ -24,7 +23,7 @@ import { jsonClone } from 'utils/json'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; import { apiShowMore } from 'utils/offset-paginator'; import { switchNever } from 'utils/switch-never'; -import getPage from './extra-page'; +import getPage, { PageSectionJson, PageSectionWithoutCountJson } from './extra-page'; import { ProfilePageSection, ProfilePageUserJson } from './extra-page-props'; const sectionToUrlType = { diff --git a/resources/assets/lib/profile-page/extra-page.tsx b/resources/assets/lib/profile-page/extra-page.ts similarity index 61% rename from resources/assets/lib/profile-page/extra-page.tsx rename to resources/assets/lib/profile-page/extra-page.ts index c87bc9bdd60..1f3d68021ad 100644 --- a/resources/assets/lib/profile-page/extra-page.tsx +++ b/resources/assets/lib/profile-page/extra-page.ts @@ -3,8 +3,20 @@ import { ProfileExtraPage } from 'interfaces/user-extended-json'; import UserJson from 'interfaces/user-json'; - import { route } from 'laroute'; +import { OffsetPaginationJson } from 'utils/offset-paginator'; + +export interface PageSectionJson { + count: number; + items: T[]; + pagination: OffsetPaginationJson; +} + +// TODO: basically OffsetPaginatorJson now +export interface PageSectionWithoutCountJson { + items: T[]; + pagination: OffsetPaginationJson; +} export default function getPage(user: Pick, page: ProfileExtraPage) { return $.ajax(route('users.extra-page', { page, user: user.id })) as JQuery.jqXHR; From 699405f52dbe20ea4b403073b5c7bc8d7ffe6d90 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Sat, 1 Oct 2022 03:24:37 +0900 Subject: [PATCH 0011/1261] slightly better spinner position --- resources/assets/less/bem-index.less | 1 + resources/assets/less/bem/lazy-load.less | 10 ++++++++++ resources/assets/lib/components/lazy-load.tsx | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 resources/assets/less/bem/lazy-load.less diff --git a/resources/assets/less/bem-index.less b/resources/assets/less/bem-index.less index e5e911710b8..decac69dcb5 100644 --- a/resources/assets/less/bem-index.less +++ b/resources/assets/less/bem-index.less @@ -204,6 +204,7 @@ @import "bem/landing-nav"; @import "bem/landing-news"; @import "bem/landing-sitemap"; +@import "bem/lazy-load"; @import "bem/line-chart"; @import "bem/link"; @import "bem/livestream-featured"; diff --git a/resources/assets/less/bem/lazy-load.less b/resources/assets/less/bem/lazy-load.less new file mode 100644 index 00000000000..43eef793ea0 --- /dev/null +++ b/resources/assets/less/bem/lazy-load.less @@ -0,0 +1,10 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +.lazy-load { + display: flex; + align-items: center; + justify-content: center; + // TODO: need better min-height for different sections? + min-height: 50px; +} diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 8244c8b728b..a5df194c52d 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -43,7 +43,7 @@ export default class LazyLoad extends React.Component
    ; + return
    ; } return this.props.children; From c34ef033f18bb8b78c56dafa1f4dad83c820545b Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 3 Oct 2022 12:28:14 +0900 Subject: [PATCH 0012/1261] placeholder not currently used --- resources/assets/lib/components/lazy-load.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index a5df194c52d..ecf167f2406 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -8,7 +8,6 @@ import * as React from 'react'; interface Props { onLoad: () => PromiseLike; - placeholder?: React.ReactNode; } @observer From 002d2567b0781e19f0fdf634bb9cfed323d1cac4 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 6 Oct 2022 17:41:54 +0900 Subject: [PATCH 0013/1261] wrong state --- resources/assets/lib/profile-page/controller.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 00f639de49d..6ff29a34572 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -385,7 +385,7 @@ export default class Controller { @action getRecentActivity() { - if (this.state.topScores != null) return Promise.resolve(); + if (this.state.recentActivity != null) return Promise.resolve(); const xhr = getPage>(this.state.user, 'recent_activity'); xhr.done((json) => runInAction(() => { From 820b4307fa89b9f254569d52bdfb508eff2cfc16 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Tue, 11 Oct 2022 21:40:13 +0900 Subject: [PATCH 0014/1261] saveState after loading kudosu --- resources/assets/lib/components/profile-page-kudosu.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index d221ca01eb3..c8da4b8dc87 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -118,6 +118,7 @@ export default class ProfilePageKudosu extends React.Component { this.xhr.done((json) => runInAction(() => { this.kudosu = json; + this.saveState(); })); return this.xhr; From 6aac2e571d1ecfe96d15b7c97a24dd97be5377a2 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 6 Oct 2022 16:54:18 +0900 Subject: [PATCH 0015/1261] make entry count computed --- .../assets/lib/profile-page/recent-activity.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/recent-activity.tsx b/resources/assets/lib/profile-page/recent-activity.tsx index c154a0c36a8..5a74766b6e8 100644 --- a/resources/assets/lib/profile-page/recent-activity.tsx +++ b/resources/assets/lib/profile-page/recent-activity.tsx @@ -7,6 +7,7 @@ import StringWithComponent from 'components/string-with-component'; import TimeWithTooltip from 'components/time-with-tooltip'; import EventJson from 'interfaces/event-json'; import { snakeCase } from 'lodash'; +import { computed, makeObservable } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; import * as React from 'react'; @@ -17,12 +18,23 @@ import parseEvent from './parse-event'; @observer export default class RecentActivity extends React.Component { + @computed + private get count() { + return this.props.controller.state.recentActivity?.items.length ?? 0; + } + + constructor(props: ExtraPageProps) { + super(props); + + makeObservable(this); + } + render() { return (
    - {(this.props.controller.state.recentActivity?.items.length ?? 0) > 0 ? this.renderEntries() : this.renderEmpty()} + {this.count > 0 ? this.renderEntries() : this.renderEmpty()}
    ); From 432c053d14fd1c7e36aa694cd3f091b810088cf7 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Tue, 4 Oct 2022 23:05:33 +0900 Subject: [PATCH 0016/1261] compensate scroll position for elements loaded off view if necessary --- resources/assets/lib/components/lazy-load.tsx | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index ecf167f2406..f72081f6542 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -5,6 +5,7 @@ import { Spinner } from 'components/spinner'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import * as React from 'react'; +import { nextVal } from 'utils/seq'; interface Props { onLoad: () => PromiseLike; @@ -12,10 +13,14 @@ interface Props { @observer export default class LazyLoad extends React.Component> { - @observable loaded = false; + // saved positions before lazy loaded element is rendered. + private beforeRenderedBounds?: DOMRect; + private beforeRenderedScrollY = 0; + + @observable private loaded = false; + private readonly observer: IntersectionObserver; + private readonly ref = React.createRef(); - private observer: IntersectionObserver; - private ref = React.createRef(); constructor(props: React.PropsWithChildren) { super(props); @@ -35,22 +40,47 @@ export default class LazyLoad extends React.Component; } - return this.props.children; + this.beforeRenderedScrollY = window.scrollY; + this.beforeRenderedBounds = this.ref.current?.getBoundingClientRect(); + + return
    {this.props.children}
    ; } @action private load() { this.observer.disconnect(); + // TODO: wait until scrolling stops to have a predictable position. this.props.onLoad().then(action(() => this.loaded = true)); } } From 5e02afa0d3cd93ee499b42793bb7c49a15543971 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 6 Oct 2022 17:07:35 +0900 Subject: [PATCH 0017/1261] keep ref on same element --- resources/assets/less/bem/lazy-load.less | 12 +++++++----- resources/assets/lib/components/lazy-load.tsx | 14 +++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/resources/assets/less/bem/lazy-load.less b/resources/assets/less/bem/lazy-load.less index 43eef793ea0..d865231a9f6 100644 --- a/resources/assets/less/bem/lazy-load.less +++ b/resources/assets/less/bem/lazy-load.less @@ -2,9 +2,11 @@ // See the LICENCE file in the repository root for full licence text. .lazy-load { - display: flex; - align-items: center; - justify-content: center; - // TODO: need better min-height for different sections? - min-height: 50px; + &--loading { + display: flex; + align-items: center; + justify-content: center; + // TODO: need better min-height for different sections? + min-height: 50px; + } } diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index f72081f6542..ce546e6325d 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -5,7 +5,7 @@ import { Spinner } from 'components/spinner'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import * as React from 'react'; -import { nextVal } from 'utils/seq'; +import { classWithModifiers } from 'utils/css'; interface Props { onLoad: () => PromiseLike; @@ -67,14 +67,18 @@ export default class LazyLoad extends React.Component; - } + return ( +
    + {this.loaded ? this.renderLoaded() : } +
    + ); + } + renderLoaded() { this.beforeRenderedScrollY = window.scrollY; this.beforeRenderedBounds = this.ref.current?.getBoundingClientRect(); - return
    {this.props.children}
    ; + return this.props.children; } @action From dff3b21e13137e704d3571bdb25d78b556eebd74 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 7 Oct 2022 18:30:24 +0900 Subject: [PATCH 0018/1261] only perform after render scroll update once --- resources/assets/lib/components/lazy-load.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index ce546e6325d..266d942c712 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -17,6 +17,7 @@ export default class LazyLoad extends React.Component(); @@ -41,7 +42,8 @@ export default class LazyLoad extends React.Component Date: Tue, 11 Oct 2022 18:23:40 +0900 Subject: [PATCH 0019/1261] maintain distance from bottom of page instead (more reliable, maybe?) --- resources/assets/lib/components/lazy-load.tsx | 35 ++++++++++--------- resources/assets/lib/osu-core.ts | 1 + resources/assets/lib/profile-page/main.tsx | 7 ++++ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 266d942c712..835943eafa2 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -4,8 +4,10 @@ import { Spinner } from 'components/spinner'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; +import core from 'osu-core-singleton'; import * as React from 'react'; import { classWithModifiers } from 'utils/css'; +import { bottomPageDistance } from 'utils/html'; interface Props { onLoad: () => PromiseLike; @@ -15,7 +17,7 @@ interface Props { export default class LazyLoad extends React.Component> { // saved positions before lazy loaded element is rendered. private beforeRenderedBounds?: DOMRect; - private beforeRenderedScrollY = 0; + private distanceFromBottom = 0; private hasUpdated = false; @observable private loaded = false; @@ -49,21 +51,22 @@ export default class LazyLoad extends React.Component window.innerHeight) return; + + const maxScrollY = document.body.scrollHeight - window.innerHeight; + + // if at bottom, try keep it at the bottom + if (this.distanceFromBottom === 0) { + window.scrollTo(window.scrollX, maxScrollY); + return; + // maintain distance from bottom + // TODO: try and sync this to the "page" cutoff? + } else if (this.beforeRenderedBounds.bottom < core.visibleOffset) { + window.scrollTo(window.scrollX, maxScrollY - this.distanceFromBottom); + } } componentWillUnmount() { @@ -79,8 +82,8 @@ export default class LazyLoad extends React.Component { } componentDidMount() { + core.reactTurbolinks.runAfterPageLoad(() => { + core.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; + }); + $(window).on(`scroll.${this.eventId}`, this.pageScan); if (this.pages.current != null) { @@ -150,6 +154,7 @@ export default class Main extends React.Component { } componentWillUnmount() { + core.visibleOffset = 0; $(window).off(`.${this.eventId}`); [this.pages, this.tabs].forEach((sortable) => { @@ -295,6 +300,8 @@ export default class Main extends React.Component { @action private readonly pageScan = () => { + core.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; + if (this.scrolling) return; const pages = this.pageElements; From 3af0a430a7e2231091a86461b6c174f21e0f9c7f Mon Sep 17 00:00:00 2001 From: bakaneko Date: Tue, 11 Oct 2022 19:13:10 +0900 Subject: [PATCH 0020/1261] refocus on extra page after load if necessary --- .../assets/less/bem/user-profile-pages.less | 5 +++ .../lib/components/lazy-load-context.tsx | 14 +++++++ resources/assets/lib/components/lazy-load.tsx | 12 +++++- resources/assets/lib/osu-core.ts | 1 - resources/assets/lib/profile-page/main.tsx | 42 +++++++++++++------ 5 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 resources/assets/lib/components/lazy-load-context.tsx diff --git a/resources/assets/less/bem/user-profile-pages.less b/resources/assets/less/bem/user-profile-pages.less index 1bf49a6d4ad..cb93b461e30 100644 --- a/resources/assets/less/bem/user-profile-pages.less +++ b/resources/assets/less/bem/user-profile-pages.less @@ -19,4 +19,9 @@ &--no-tabs { --vertical-gutter-top-desktop: var(--vertical-gutter); } + + &__page { + // set in js after page switcher height is measured. + scroll-margin-top: var(--scroll-margin-top, 0); + } } diff --git a/resources/assets/lib/components/lazy-load-context.tsx b/resources/assets/lib/components/lazy-load-context.tsx new file mode 100644 index 00000000000..39f3f6c24a7 --- /dev/null +++ b/resources/assets/lib/components/lazy-load-context.tsx @@ -0,0 +1,14 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import { createContext } from 'react'; + +export interface Props { + name?: string; + offsetTop: number; // store the visible viewport offset somewhere (to account for sticky/fixed headers, etc) + onWillUpdateScroll?: (key: string) => boolean; +} + +const LazyLoadContext = createContext({ offsetTop: 0 }); + +export default LazyLoadContext; diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 835943eafa2..70c5b64b2a6 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -4,10 +4,10 @@ import { Spinner } from 'components/spinner'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; -import core from 'osu-core-singleton'; import * as React from 'react'; import { classWithModifiers } from 'utils/css'; import { bottomPageDistance } from 'utils/html'; +import LazyLoadContext from './lazy-load-context'; interface Props { onLoad: () => PromiseLike; @@ -15,6 +15,9 @@ interface Props { @observer export default class LazyLoad extends React.Component> { + static readonly contextType = LazyLoadContext; + declare context: React.ContextType; + // saved positions before lazy loaded element is rendered. private beforeRenderedBounds?: DOMRect; private distanceFromBottom = 0; @@ -53,6 +56,11 @@ export default class LazyLoad extends React.Component window.innerHeight) return; @@ -64,7 +72,7 @@ export default class LazyLoad extends React.Component. Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import LazyLoadContext from 'components/lazy-load-context'; import UserProfileContainer from 'components/user-profile-container'; import { ProfileExtraPage } from 'interfaces/user-extended-json'; import { pull, last } from 'lodash'; -import { action, computed, makeObservable } from 'mobx'; +import { action, computed, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import core from 'osu-core-singleton'; import * as React from 'react'; @@ -49,10 +50,12 @@ export default class Main extends React.Component { recent_activity: React.createRef(), top_ranks: React.createRef(), }; + private jumpTo: ProfileExtraPage | null = null; private readonly pages = React.createRef(); private scrolling = false; private readonly tabs = React.createRef(); private readonly timeouts: Partial> = {}; + @observable private visibleOffset = 0; @computed private get displayExtraTabs() { @@ -100,7 +103,9 @@ export default class Main extends React.Component { componentDidMount() { core.reactTurbolinks.runAfterPageLoad(() => { - core.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; + const bounds = this.pagesOffset.getBoundingClientRect(); + this.visibleOffset = bounds.bottom; + this.pages.current?.style.setProperty('--scroll-margin-top', `${bounds.height}px`); }); $(window).on(`scroll.${this.eventId}`, this.pageScan); @@ -154,7 +159,6 @@ export default class Main extends React.Component { } componentWillUnmount() { - core.visibleOffset = 0; $(window).off(`.${this.eventId}`); [this.pages, this.tabs].forEach((sortable) => { @@ -203,14 +207,15 @@ export default class Main extends React.Component {
    {this.displayedExtraPages.map((name) => ( -
    - {this.extraPage(name)} -
    + +
    + {this.extraPage(name)} +
    +
    ))}
    @@ -256,6 +261,17 @@ export default class Main extends React.Component { } }; + private readonly handleLazyLoadWillUpdateScroll = (name: string) => { + if (this.jumpTo === name) { + // TODO: use scrollIntoView({ behavior: 'smooth' }) for pageJump instead of setting scroll position. + this.extraPages[name].current?.scrollIntoView(); + this.jumpTo = null; + return true; + } + + return false; + }; + private isSortablePage(page: ProfileExtraPage) { return this.controller.state.user.profile_order.includes(page); } @@ -281,6 +297,8 @@ export default class Main extends React.Component { if (target == null) return; + this.jumpTo = page; + // count for the tabs height; assume pageJump always causes the header to be pinned // otherwise the calculation needs another phase and gets a bit messy. offsetTop = window.scrollY + target.getBoundingClientRect().top - this.pagesOffset.getBoundingClientRect().height; @@ -300,7 +318,7 @@ export default class Main extends React.Component { @action private readonly pageScan = () => { - core.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; + this.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; if (this.scrolling) return; From a7c698b1927f52b6da70d94f7e9dc2235d0c2558 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Tue, 11 Oct 2022 20:42:09 +0900 Subject: [PATCH 0021/1261] being at the bottom sets wrong page marker --- resources/assets/lib/profile-page/main.tsx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 487f95f5972..9d87678443f 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -264,8 +264,7 @@ export default class Main extends React.Component { private readonly handleLazyLoadWillUpdateScroll = (name: string) => { if (this.jumpTo === name) { // TODO: use scrollIntoView({ behavior: 'smooth' }) for pageJump instead of setting scroll position. - this.extraPages[name].current?.scrollIntoView(); - this.jumpTo = null; + this.pageJump(name, true); return true; } @@ -285,7 +284,7 @@ export default class Main extends React.Component { }; @action - private readonly pageJump = (page: Page | null) => { + private readonly pageJump = (page: Page | null, refocusing = false) => { if (page === null) return; let offsetTop: number; @@ -297,6 +296,9 @@ export default class Main extends React.Component { if (target == null) return; + // FIXME: need to unset on scroll or after jump. + // it's currently not unset because Chrome changes the scroll position when an offscreen element changes size + // causing this marker to be unset too early. this.jumpTo = page; // count for the tabs height; assume pageJump always causes the header to be pinned @@ -308,7 +310,17 @@ export default class Main extends React.Component { // The result will be wrong when target page is too short anyway. this.scrolling = true; - $(window).stop().scrollTo(core.stickyHeader.scrollOffset(offsetTop), 500, { + let scrollTo = core.stickyHeader.scrollOffset(offsetTop); + // Never scroll to bottom unless last element + // Repositioning the scroll also triggers pageScan causing issues with the bottomPage() assumption. + const scrollLimit = document.body.scrollHeight - window.innerHeight - 1; + if (page !== last(this.displayedExtraPages)) { + scrollTo = Math.min(scrollTo, scrollLimit); + } + + const duration = refocusing ? 0 : 500; + + $(window).stop().scrollTo(scrollTo, duration, { onAfter: action(() => { this.controller.currentPage = page; this.scrolling = false; From cbc4ad9263508826c3902592de7a2e503fa097c9 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Tue, 11 Oct 2022 21:33:14 +0900 Subject: [PATCH 0022/1261] pagesOffset is null when navigating away and unmount runs after navigation --- resources/assets/lib/profile-page/main.tsx | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 9d87678443f..e510099caa4 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -84,13 +84,7 @@ export default class Main extends React.Component { } private get pagesOffset() { - const elem = document.querySelector('.js-switchable-mode-page--scrollspy-offset'); - - if (elem == null) { - throw new Error('page offset reference is missing'); - } - - return elem; + return document.querySelector('.js-switchable-mode-page--scrollspy-offset'); } constructor(props: Props) { @@ -102,11 +96,13 @@ export default class Main extends React.Component { } componentDidMount() { - core.reactTurbolinks.runAfterPageLoad(() => { - const bounds = this.pagesOffset.getBoundingClientRect(); - this.visibleOffset = bounds.bottom; - this.pages.current?.style.setProperty('--scroll-margin-top', `${bounds.height}px`); - }); + core.reactTurbolinks.runAfterPageLoad(action(() => { + if (this.pagesOffset != null) { + const bounds = this.pagesOffset.getBoundingClientRect(); + this.visibleOffset = bounds.bottom; + this.pages.current?.style.setProperty('--scroll-margin-top', `${bounds.height}px`); + } + })); $(window).on(`scroll.${this.eventId}`, this.pageScan); @@ -285,7 +281,7 @@ export default class Main extends React.Component { @action private readonly pageJump = (page: Page | null, refocusing = false) => { - if (page === null) return; + if (page === null || this.pagesOffset == null) return; let offsetTop: number; @@ -330,6 +326,8 @@ export default class Main extends React.Component { @action private readonly pageScan = () => { + if (this.pagesOffset == null) return; + this.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; if (this.scrolling) return; From f2547c2c8221286acb0159c14ec468a1320542fb Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 12 Oct 2022 19:13:29 +0900 Subject: [PATCH 0023/1261] new pageJump; - uses scrollIntoView() instead of jquery scrollTo. The after scroll callback on scrollTo didn't quite work as sometimes a scroll event would still fire after the callback ran with scrolling = false. - updated pageScan. --- .../lib/components/lazy-load-context.tsx | 1 + resources/assets/lib/components/lazy-load.tsx | 6 +- resources/assets/lib/profile-page/main.tsx | 161 ++++++++++-------- 3 files changed, 92 insertions(+), 76 deletions(-) diff --git a/resources/assets/lib/components/lazy-load-context.tsx b/resources/assets/lib/components/lazy-load-context.tsx index 39f3f6c24a7..068bc793bb5 100644 --- a/resources/assets/lib/components/lazy-load-context.tsx +++ b/resources/assets/lib/components/lazy-load-context.tsx @@ -6,6 +6,7 @@ import { createContext } from 'react'; export interface Props { name?: string; offsetTop: number; // store the visible viewport offset somewhere (to account for sticky/fixed headers, etc) + onWillRenderAfterLoad?: (key: string) => void; onWillUpdateScroll?: (key: string) => boolean; } diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 70c5b64b2a6..df1feb5815f 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -93,13 +93,17 @@ export default class LazyLoad extends React.Component this.loaded = true)); } } diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index e510099caa4..c4fc097007e 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -4,14 +4,14 @@ import LazyLoadContext from 'components/lazy-load-context'; import UserProfileContainer from 'components/user-profile-container'; import { ProfileExtraPage } from 'interfaces/user-extended-json'; -import { pull, last } from 'lodash'; +import { pull, last, debounce, first, throttle } from 'lodash'; import { action, computed, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import core from 'osu-core-singleton'; import * as React from 'react'; import { error } from 'utils/ajax'; import { classWithModifiers } from 'utils/css'; -import { bottomPage, htmlElementOrNull } from 'utils/html'; +import { bottomPage } from 'utils/html'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; import { pageChange } from 'utils/page-change'; import { nextVal } from 'utils/seq'; @@ -37,6 +37,7 @@ interface Props { @observer export default class Main extends React.Component { private readonly controller: Controller; + private readonly debouncedUnsetJumpTo = debounce(() => this.unsetJumpTo(), 50); private readonly disposers = new Set<(() => void) | undefined>(); private draggingTab = false; private readonly eventId = `users-show-${nextVal()}`; @@ -50,11 +51,12 @@ export default class Main extends React.Component { recent_activity: React.createRef(), top_ranks: React.createRef(), }; - private jumpTo: ProfileExtraPage | null = null; + private jumpTo: Page | null = null; private readonly pages = React.createRef(); - private scrolling = false; + private pageScanDisabled = false; + private skipUnsetJumpTo = false; private readonly tabs = React.createRef(); - private readonly timeouts: Partial> = {}; + private readonly timeouts: Partial> = {}; @observable private visibleOffset = 0; @computed @@ -80,11 +82,11 @@ export default class Main extends React.Component { } private get pageElements() { - return document.querySelectorAll('.js-switchable-mode-page--scrollspy'); + return document.querySelectorAll('.js-switchable-mode-page--scrollspy'); } private get pagesOffset() { - return document.querySelector('.js-switchable-mode-page--scrollspy-offset'); + return document.querySelector('.js-switchable-mode-page--scrollspy-offset'); } constructor(props: Props) { @@ -104,7 +106,10 @@ export default class Main extends React.Component { } })); - $(window).on(`scroll.${this.eventId}`, this.pageScan); + const scrollEventId = `scroll.${this.eventId}`; + // pageScan does not need to run at 144 fps... + $(window).on(scrollEventId, throttle(() => this.pageScan(), 20)); + $(window).on(scrollEventId, this.debouncedUnsetJumpTo); if (this.pages.current != null) { $(this.pages.current).sortable({ @@ -140,6 +145,7 @@ export default class Main extends React.Component { pageChange(); + // TODO: need to restore position when navigating back (lazy loaded component doesn't render full size immediately) const page = this.controller.hasSavedState ? null : validPage(currentUrl().hash.slice(1)); @@ -149,7 +155,10 @@ export default class Main extends React.Component { this.pageScan(); } else { // The scroll is a bit off on Firefox if not using timeout. - this.timeouts.initialPageJump = window.setTimeout(() => this.pageJump(page)); + this.timeouts.initialPageJump = window.setTimeout(() => { + this.jumpTo = page; + this.pageScrollIntoView(page); + }); } })); } @@ -157,6 +166,8 @@ export default class Main extends React.Component { componentWillUnmount() { $(window).off(`.${this.eventId}`); + this.debouncedUnsetJumpTo.cancel(); + [this.pages, this.tabs].forEach((sortable) => { if (sortable.current != null) { $(sortable.current).sortable('destroy'); @@ -203,7 +214,7 @@ export default class Main extends React.Component {
    {this.displayedExtraPages.map((name) => ( - +
    { } }; - private readonly handleLazyLoadWillUpdateScroll = (name: string) => { - if (this.jumpTo === name) { - // TODO: use scrollIntoView({ behavior: 'smooth' }) for pageJump instead of setting scroll position. - this.pageJump(name, true); + // ignore any scroll shifts during render (basically, ignore Chrome). + private readonly handleLazyLoadRenderAfterLoad = () => { + this.skipUnsetJumpTo = true; + this.debouncedUnsetJumpTo.cancel(); + }; + + private readonly handleLazyLoadWillUpdateScroll = () => { + if (this.jumpTo != null) { + this.pageScrollIntoView(this.jumpTo); return true; } @@ -280,88 +296,84 @@ export default class Main extends React.Component { }; @action - private readonly pageJump = (page: Page | null, refocusing = false) => { + private readonly pageJump = (page: Page | null) => { if (page === null || this.pagesOffset == null) return; - let offsetTop: number; - - if (page === 'main') { - offsetTop = 0; - } else { - const target = this.extraPages[page].current; - - if (target == null) return; - - // FIXME: need to unset on scroll or after jump. - // it's currently not unset because Chrome changes the scroll position when an offscreen element changes size - // causing this marker to be unset too early. - this.jumpTo = page; - - // count for the tabs height; assume pageJump always causes the header to be pinned - // otherwise the calculation needs another phase and gets a bit messy. - offsetTop = window.scrollY + target.getBoundingClientRect().top - this.pagesOffset.getBoundingClientRect().height; - } - - // Don't bother scanning the current position. - // The result will be wrong when target page is too short anyway. - this.scrolling = true; - - let scrollTo = core.stickyHeader.scrollOffset(offsetTop); - // Never scroll to bottom unless last element - // Repositioning the scroll also triggers pageScan causing issues with the bottomPage() assumption. - const scrollLimit = document.body.scrollHeight - window.innerHeight - 1; - if (page !== last(this.displayedExtraPages)) { - scrollTo = Math.min(scrollTo, scrollLimit); - } + this.jumpTo = page; - const duration = refocusing ? 0 : 500; - - $(window).stop().scrollTo(scrollTo, duration, { - onAfter: action(() => { - this.controller.currentPage = page; - this.scrolling = false; - }), - }); + this.pageScrollIntoView(this.jumpTo, true); }; @action private readonly pageScan = () => { - if (this.pagesOffset == null) return; + if (this.pageScanDisabled || this.pagesOffset == null) return; + + const pages = this.pageElements; + if (pages.length === 0) return; this.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; - if (this.scrolling) return; + const matching = new Set(); - const pages = this.pageElements; + for (const page of pages) { + const pageDims = page.getBoundingClientRect(); + const pageBottom = pageDims.bottom - Math.min(pageDims.height * 0.75, 200); - if (pages.length === 0) return; - - let page: HTMLElement | null = null; + if (pageBottom > this.visibleOffset && pageDims.top < window.innerHeight) { + matching.add(page.dataset.pageId as ProfileExtraPage); + } + } - if (bottomPage()) { - page = htmlElementOrNull(last(pages)); - } else { - const anchorHeight = this.pagesOffset.getBoundingClientRect().height; + let preferred: Page | null = null; - for (const p of pages) { - page = htmlElementOrNull(p); + // prefer using the page being navigated to if its element is in view. + if (this.jumpTo != null && matching.has(this.jumpTo)) { + preferred = this.jumpTo; + } - if (page == null) { - throw new Error('page element is somehow not an HTMLElement'); - } + const pageIds = [...matching.values()]; - const pageDims = page.getBoundingClientRect(); - const pageBottom = pageDims.bottom - Math.min(pageDims.height * 0.75, 200); + if (preferred == null) { + preferred = (bottomPage() ? last(pageIds) : first(pageIds)) ?? null; + } - if (pageBottom > anchorHeight) break; - } + if (preferred != null) { + this.controller.currentPage = preferred; } + }; + + private readonly pageScrollIntoView = (page: Page, smooth = false) => { + const target = page === 'main' ? document.body : this.extraPages[page].current; + if (target == null) return; + + // smooth scroll when using navigation bar. + if (smooth) { + target.scrollIntoView({ behavior: 'smooth' }); + } else { + // do extra magic to preserve focus of element. + // disable unsetting the page to jump to. + this.skipUnsetJumpTo = true; + target.scrollIntoView(); + setTimeout(() => { + // cancel any pending event caused by scrollIntoView(); + // setTimeout is needed because scrollIntoView() doesn't fire the scroll event immediately. + this.debouncedUnsetJumpTo.cancel(); + this.skipUnsetJumpTo = false; + }); - if (page != null) { - this.controller.currentPage = page.dataset.pageId as ProfileExtraPage; } }; + // Unset jumpTo if user scrolled or used page tabs. + // Don't unset if scroll was caused by layout shifts. + // There isn't currently a way to tell if a scroll event is user initiated or not. + // The current css spec also doesn't support callback after scroll finishes animating so we're using + // this kind of hack to guess what needs to be done. + private readonly unsetJumpTo = () => { + if (this.skipUnsetJumpTo) return; + this.jumpTo = null; + }; + private readonly updateOrder = (event: Event) => { const target = event.target; @@ -386,6 +398,5 @@ export default class Main extends React.Component { hideLoadingOverlay(); this.pageScan(); }); - }; } From 9fb8b14eb2887488b3b42e98fee6560adbd978a5 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 12 Oct 2022 20:01:35 +0900 Subject: [PATCH 0024/1261] unneeded? --- resources/assets/lib/profile-page/main.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index c4fc097007e..c11dbcf1ad3 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -176,7 +176,6 @@ export default class Main extends React.Component { Object.values(this.timeouts).forEach((timeout) => window.clearTimeout(timeout)); - $(window).stop(); this.controller.destroy(); this.disposers.forEach((disposer) => disposer?.()); } From 4a05e4b0b569fa8b9e389df9645152a5890cc4dd Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 12 Oct 2022 20:16:38 +0900 Subject: [PATCH 0025/1261] force pageScan in case the scroll position doesn't move --- resources/assets/lib/profile-page/main.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index c11dbcf1ad3..85da5f782f0 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -359,8 +359,9 @@ export default class Main extends React.Component { this.debouncedUnsetJumpTo.cancel(); this.skipUnsetJumpTo = false; }); - } + + this.pageScan(); }; // Unset jumpTo if user scrolled or used page tabs. From 4d7d4e57ca6155db71d490ffad71baa8e433220d Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 12 Oct 2022 20:27:53 +0900 Subject: [PATCH 0026/1261] set jumpTo earlier --- resources/assets/lib/profile-page/main.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 85da5f782f0..3593b36be9f 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -150,13 +150,14 @@ export default class Main extends React.Component { ? null : validPage(currentUrl().hash.slice(1)); + this.jumpTo = page; + this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { if (page == null) { this.pageScan(); } else { // The scroll is a bit off on Firefox if not using timeout. this.timeouts.initialPageJump = window.setTimeout(() => { - this.jumpTo = page; this.pageScrollIntoView(page); }); } From 89fe3680b0189960526aefcdf1703fb001d8b513 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 12 Oct 2022 23:53:51 +0900 Subject: [PATCH 0027/1261] also unneeded --- resources/assets/lib/profile-page/main.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 3593b36be9f..ac07679378d 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -53,7 +53,6 @@ export default class Main extends React.Component { }; private jumpTo: Page | null = null; private readonly pages = React.createRef(); - private pageScanDisabled = false; private skipUnsetJumpTo = false; private readonly tabs = React.createRef(); private readonly timeouts: Partial> = {}; @@ -306,7 +305,7 @@ export default class Main extends React.Component { @action private readonly pageScan = () => { - if (this.pageScanDisabled || this.pagesOffset == null) return; + if (this.pagesOffset == null) return; const pages = this.pageElements; if (pages.length === 0) return; From 3c07429c459b3d6b9dda0bf9c1092db69c0ab755 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 14:15:14 +0900 Subject: [PATCH 0028/1261] all this weird stuff is just to handle the bottom of page special case, so maybe only apply it there? --- .../lib/components/lazy-load-context.tsx | 3 +- resources/assets/lib/components/lazy-load.tsx | 23 +++---- resources/assets/lib/profile-page/main.tsx | 65 +++++++------------ 3 files changed, 33 insertions(+), 58 deletions(-) diff --git a/resources/assets/lib/components/lazy-load-context.tsx b/resources/assets/lib/components/lazy-load-context.tsx index 068bc793bb5..cef903d8cc4 100644 --- a/resources/assets/lib/components/lazy-load-context.tsx +++ b/resources/assets/lib/components/lazy-load-context.tsx @@ -6,8 +6,7 @@ import { createContext } from 'react'; export interface Props { name?: string; offsetTop: number; // store the visible viewport offset somewhere (to account for sticky/fixed headers, etc) - onWillRenderAfterLoad?: (key: string) => void; - onWillUpdateScroll?: (key: string) => boolean; + onWillUpdateScroll?: (key: string) => void; } const LazyLoadContext = createContext({ offsetTop: 0 }); diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index df1feb5815f..367588bdc77 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -56,25 +56,24 @@ export default class LazyLoad extends React.Component window.innerHeight) return; const maxScrollY = document.body.scrollHeight - window.innerHeight; - // if at bottom, try keep it at the bottom + // TODO: try and sync this to the "page" cutoff? (profile page active page changes before it reaches the tab) + // Try to maintain distance from bottom or keep at bottom at already there. + // This is simpler than working out size changes since we only care about the page getting taller. if (this.distanceFromBottom === 0) { window.scrollTo(window.scrollX, maxScrollY); - return; - // maintain distance from bottom - // TODO: try and sync this to the "page" cutoff? } else if (this.beforeRenderedBounds.bottom < this.context.offsetTop) { window.scrollTo(window.scrollX, maxScrollY - this.distanceFromBottom); } + + // for containers that need to do extra updates. + if (this.context.name != null) { + this.context.onWillUpdateScroll?.(this.context.name); + } } componentWillUnmount() { @@ -90,13 +89,11 @@ export default class LazyLoad extends React.Component { private readonly controller: Controller; - private readonly debouncedUnsetJumpTo = debounce(() => this.unsetJumpTo(), 50); private readonly disposers = new Set<(() => void) | undefined>(); private draggingTab = false; private readonly eventId = `users-show-${nextVal()}`; @@ -52,8 +51,8 @@ export default class Main extends React.Component { top_ranks: React.createRef(), }; private jumpTo: Page | null = null; + private lastScroll = 0; private readonly pages = React.createRef(); - private skipUnsetJumpTo = false; private readonly tabs = React.createRef(); private readonly timeouts: Partial> = {}; @observable private visibleOffset = 0; @@ -106,9 +105,9 @@ export default class Main extends React.Component { })); const scrollEventId = `scroll.${this.eventId}`; + $(window).on(scrollEventId, this.setLastScroll); // pageScan does not need to run at 144 fps... $(window).on(scrollEventId, throttle(() => this.pageScan(), 20)); - $(window).on(scrollEventId, this.debouncedUnsetJumpTo); if (this.pages.current != null) { $(this.pages.current).sortable({ @@ -166,8 +165,6 @@ export default class Main extends React.Component { componentWillUnmount() { $(window).off(`.${this.eventId}`); - this.debouncedUnsetJumpTo.cancel(); - [this.pages, this.tabs].forEach((sortable) => { if (sortable.current != null) { $(sortable.current).sortable('destroy'); @@ -213,7 +210,7 @@ export default class Main extends React.Component {
    {this.displayedExtraPages.map((name) => ( - +
    { } }; - // ignore any scroll shifts during render (basically, ignore Chrome). - private readonly handleLazyLoadRenderAfterLoad = () => { - this.skipUnsetJumpTo = true; - this.debouncedUnsetJumpTo.cancel(); - }; - - private readonly handleLazyLoadWillUpdateScroll = () => { - if (this.jumpTo != null) { + private readonly handleLazyLoadWillUpdateScroll = (name: ProfileExtraPage) => { + // Scroll lazy loaded part into view in case it was taller than the visible area. + // This should only be an issue at page bottom. + if (bottomPage() && this.jumpTo === name) { this.pageScrollIntoView(this.jumpTo); - return true; + this.jumpTo = null; } - - return false; }; private isSortablePage(page: ProfileExtraPage) { @@ -324,16 +315,14 @@ export default class Main extends React.Component { } let preferred: Page | null = null; - - // prefer using the page being navigated to if its element is in view. - if (this.jumpTo != null && matching.has(this.jumpTo)) { - preferred = this.jumpTo; - } - const pageIds = [...matching.values()]; - if (preferred == null) { - preferred = (bottomPage() ? last(pageIds) : first(pageIds)) ?? null; + // special case for bottom of page if there are multiple pages visible. + if (bottomPage()) { + // prefer using the page being navigated to if its element is in view. + preferred = this.jumpTo != null && matching.has(this.jumpTo) ? this.jumpTo : last(pageIds) ?? null; + } else { + preferred = first(pageIds) ?? null; } if (preferred != null) { @@ -349,29 +338,19 @@ export default class Main extends React.Component { if (smooth) { target.scrollIntoView({ behavior: 'smooth' }); } else { - // do extra magic to preserve focus of element. - // disable unsetting the page to jump to. - this.skipUnsetJumpTo = true; target.scrollIntoView(); - setTimeout(() => { - // cancel any pending event caused by scrollIntoView(); - // setTimeout is needed because scrollIntoView() doesn't fire the scroll event immediately. - this.debouncedUnsetJumpTo.cancel(); - this.skipUnsetJumpTo = false; - }); } this.pageScan(); }; - // Unset jumpTo if user scrolled or used page tabs. - // Don't unset if scroll was caused by layout shifts. - // There isn't currently a way to tell if a scroll event is user initiated or not. - // The current css spec also doesn't support callback after scroll finishes animating so we're using - // this kind of hack to guess what needs to be done. - private readonly unsetJumpTo = () => { - if (this.skipUnsetJumpTo) return; - this.jumpTo = null; + private readonly setLastScroll = () => { + // unset if we're clrealy scrolling away from the bottom. + // layout shifts from lazy sections can cause the page to grow taller or scroll downwards, but not up. + if (window.scrollY < this.lastScroll) { + this.jumpTo = null; + } + this.lastScroll = window.scrollY; }; private readonly updateOrder = (event: Event) => { From 3c791e1fd85850e9105f533295dbbb274d8bd87f Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 16:11:56 +0900 Subject: [PATCH 0029/1261] unset marker if scroll into view has to go up but page still goes downwards overall --- resources/assets/lib/components/lazy-load-context.tsx | 2 +- resources/assets/lib/components/lazy-load.tsx | 2 +- resources/assets/lib/profile-page/main.tsx | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/resources/assets/lib/components/lazy-load-context.tsx b/resources/assets/lib/components/lazy-load-context.tsx index cef903d8cc4..e2f7c1f24c6 100644 --- a/resources/assets/lib/components/lazy-load-context.tsx +++ b/resources/assets/lib/components/lazy-load-context.tsx @@ -6,7 +6,7 @@ import { createContext } from 'react'; export interface Props { name?: string; offsetTop: number; // store the visible viewport offset somewhere (to account for sticky/fixed headers, etc) - onWillUpdateScroll?: (key: string) => void; + onWillUpdateScroll?: (key: string, bounds: DOMRect) => void; } const LazyLoadContext = createContext({ offsetTop: 0 }); diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 367588bdc77..ec491eef5c1 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -72,7 +72,7 @@ export default class LazyLoad extends React.Component { } }; - private readonly handleLazyLoadWillUpdateScroll = (name: ProfileExtraPage) => { + private readonly handleLazyLoadWillUpdateScroll = (name: ProfileExtraPage, bounds: DOMRect) => { // Scroll lazy loaded part into view in case it was taller than the visible area. // This should only be an issue at page bottom. if (bottomPage() && this.jumpTo === name) { - this.pageScrollIntoView(this.jumpTo); - this.jumpTo = null; + if (bounds.top < this.visibleOffset) { + this.jumpTo = null; + } + + this.pageScrollIntoView(name); } }; From bb512278c8567252b62e4b8a7db048b9ef1f895e Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 16:26:45 +0900 Subject: [PATCH 0030/1261] unset marker if we passed it. this should have been obvious in hindsight.... --- resources/assets/lib/profile-page/main.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 42ef0fd14b8..f59fba28190 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -309,11 +309,16 @@ export default class Main extends React.Component { const matching = new Set(); for (const page of pages) { + const pageId = page.dataset.pageId as ProfileExtraPage; const pageDims = page.getBoundingClientRect(); + if (pageId === this.jumpTo && pageDims.top < this.visibleOffset) { + this.jumpTo = null; + } + const pageBottom = pageDims.bottom - Math.min(pageDims.height * 0.75, 200); if (pageBottom > this.visibleOffset && pageDims.top < window.innerHeight) { - matching.add(page.dataset.pageId as ProfileExtraPage); + matching.add(pageId); } } From 911ad60b70f086c68de01190823665719374ef81 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 16:43:12 +0900 Subject: [PATCH 0031/1261] skip lazy load if data already available (e.g. navigating back and loading existing state) --- resources/assets/lib/components/lazy-load.tsx | 32 ++++--- .../lib/components/profile-page-kudosu.tsx | 9 +- .../assets/lib/profile-page/beatmapsets.tsx | 8 +- .../assets/lib/profile-page/historical.tsx | 96 ++++++++++--------- .../lib/profile-page/recent-activity.tsx | 7 +- .../assets/lib/profile-page/top-scores.tsx | 8 +- 6 files changed, 93 insertions(+), 67 deletions(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index ec491eef5c1..c7471359e42 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -10,6 +10,7 @@ import { bottomPageDistance } from 'utils/html'; import LazyLoadContext from './lazy-load-context'; interface Props { + hasData?: boolean; onLoad: () => PromiseLike; } @@ -22,20 +23,22 @@ export default class LazyLoad extends React.Component(); constructor(props: React.PropsWithChildren) { super(props); - this.observer = new IntersectionObserver((entries) => { - if (entries.some((entry) => entry.isIntersecting)) { - this.load(); - } - }); + if (!this.hasData) { + this.observer = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + this.load(); + } + }); + } makeObservable(this); } @@ -43,11 +46,11 @@ export default class LazyLoad extends React.Component - {this.loaded ? this.renderLoaded() : } +
    + {this.hasData ? this.renderLoaded() : }
    ); } @@ -99,8 +102,7 @@ export default class LazyLoad extends React.Component this.loaded = true)); + this.observer?.disconnect(); + this.props.onLoad().then(action(() => this.hasData = true)); } } diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index c8da4b8dc87..70b28f70b0d 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -2,7 +2,7 @@ // See the LICENCE file in the repository root for full licence text. import KudosuHistoryJson from 'interfaces/kudosu-history-json'; -import { action, makeObservable, observable, runInAction } from 'mobx'; +import { action, computed, makeObservable, observable, runInAction } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; import getPage, { PageSectionWithoutCountJson } from 'profile-page/extra-page'; @@ -66,6 +66,11 @@ export default class ProfilePageKudosu extends React.Component { private showMoreXhr?: JQuery.jqXHR; private xhr?: JQuery.jqXHR>; + @computed + private get hasData() { + return this.kudosu != null; + } + constructor(props: Props) { super(props); @@ -84,7 +89,7 @@ export default class ProfilePageKudosu extends React.Component {
    - +
    { + @computed + private get hasData() { + return this.props.controller.state.beatmapsets != null; + } + render() { return (
    - + {sectionKeys.map(this.renderBeatmapsets)}
    diff --git a/resources/assets/lib/profile-page/historical.tsx b/resources/assets/lib/profile-page/historical.tsx index 005525d66fa..76f43672cde 100644 --- a/resources/assets/lib/profile-page/historical.tsx +++ b/resources/assets/lib/profile-page/historical.tsx @@ -7,7 +7,7 @@ import ProfilePageExtraSectionTitle from 'components/profile-page-extra-section- import ShowMoreLink from 'components/show-more-link'; import { curveLinear } from 'd3'; import { escape, sortBy, times } from 'lodash'; -import { action, autorun, computed, makeObservable } from 'mobx'; +import { autorun, computed, makeObservable, observable } from 'mobx'; import { disposeOnUnmount, observer } from 'mobx-react'; import * as moment from 'moment'; import core from 'osu-core-singleton'; @@ -82,7 +82,7 @@ function updateTicks(chart: LineChart, data: ChartData[]) { @observer export default class Historical extends React.Component { - private readonly chartRefs = { + @observable private readonly chartRefs = { monthly_playcounts: React.createRef(), replays_watched_counts: React.createRef(), }; @@ -94,6 +94,11 @@ export default class Historical extends React.Component { return this.props.controller.state.historical; } + @computed + private get hasData() { + return this.historical != null; + } + @computed private get monthlyPlaycountsData() { return convertUserDataForChart(this.historical?.monthly_playcounts ?? []); @@ -125,7 +130,7 @@ export default class Historical extends React.Component {
    - + {this.renderHistorical()}
    @@ -204,50 +209,47 @@ export default class Historical extends React.Component { private readonly updateChart = (attribute: ChartSection) => { if (!this.hasSection(attribute)) return; - // Need to wait for the ref to be set after the lazy load. - setTimeout(action(() => { - const area = this.chartRefs[attribute].current; - - if (area == null) { - throw new Error("chart can't be updated before the component is mounted"); - } - - let data: ChartData[]; - switch (attribute) { - case 'monthly_playcounts': - data = this.monthlyPlaycountsData; - break; - case 'replays_watched_counts': - data = this.replaysWatchedCountsData; - break; - default: - switchNever(attribute); - throw new Error('unsupported chart section'); - } - - let chart = this.charts[attribute]; - if (chart == null) { - const options = makeOptionsDate({ - circleLine: true, - curve: curveLinear, - formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), - formatY: (d: number) => formatNumber(d), - infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), - infoBoxFormatY: (d: number) => `${osu.trans(`users.show.extra.historical.${attribute}.count_label`)} ${escape(formatNumber(d))}`, - marginRight: 60, // more spacing for x axis label - modifiers: 'profile-page', - }); - - chart = this.charts[attribute] = new LineChart(area, options); - } - - const definedChart = chart; - - this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { - updateTicks(definedChart, data); - definedChart.loadData(data); - })); - }), 0); + const area = this.chartRefs[attribute].current; + + if (area == null) { + return; + } + + let data: ChartData[]; + switch (attribute) { + case 'monthly_playcounts': + data = this.monthlyPlaycountsData; + break; + case 'replays_watched_counts': + data = this.replaysWatchedCountsData; + break; + default: + switchNever(attribute); + throw new Error('unsupported chart section'); + } + + let chart = this.charts[attribute]; + if (chart == null) { + const options = makeOptionsDate({ + circleLine: true, + curve: curveLinear, + formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), + formatY: (d: number) => formatNumber(d), + infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), + infoBoxFormatY: (d: number) => `${osu.trans(`users.show.extra.historical.${attribute}.count_label`)} ${escape(formatNumber(d))}`, + marginRight: 60, // more spacing for x axis label + modifiers: 'profile-page', + }); + + chart = this.charts[attribute] = new LineChart(area, options); + } + + const definedChart = chart; + + this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { + updateTicks(definedChart, data); + definedChart.loadData(data); + })); }; private readonly updateCharts = () => { diff --git a/resources/assets/lib/profile-page/recent-activity.tsx b/resources/assets/lib/profile-page/recent-activity.tsx index 5a74766b6e8..d4969e16cde 100644 --- a/resources/assets/lib/profile-page/recent-activity.tsx +++ b/resources/assets/lib/profile-page/recent-activity.tsx @@ -23,6 +23,11 @@ export default class RecentActivity extends React.Component { return this.props.controller.state.recentActivity?.items.length ?? 0; } + @computed + private get hasData() { + return this.props.controller.state.recentActivity != null; + } + constructor(props: ExtraPageProps) { super(props); @@ -33,7 +38,7 @@ export default class RecentActivity extends React.Component { return (
    - + {this.count > 0 ? this.renderEntries() : this.renderEmpty()}
    diff --git a/resources/assets/lib/profile-page/top-scores.tsx b/resources/assets/lib/profile-page/top-scores.tsx index 1ac161d98cf..49c71ca1101 100644 --- a/resources/assets/lib/profile-page/top-scores.tsx +++ b/resources/assets/lib/profile-page/top-scores.tsx @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. import LazyLoad from 'components/lazy-load'; +import { computed } from 'mobx'; import { observer } from 'mobx-react'; import ExtraHeader from 'profile-page/extra-header'; import * as React from 'react'; @@ -10,6 +11,11 @@ import PlayDetailList from './play-detail-list'; @observer export default class TopScores extends React.Component { + @computed + private get hasData() { + return this.props.controller.state.beatmapsets != null; + } + render() { return (
    @@ -26,7 +32,7 @@ export default class TopScores extends React.Component {
    )} - + {topScoreSections.map((section) => ( ))} From 0ae17242dbf87710076f69ae19fcdb5fe3c162b6 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 16:52:49 +0900 Subject: [PATCH 0032/1261] prefix id, otherwise it conflicts with navigation fragment <_< --- resources/assets/lib/components/profile-page-kudosu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index 70b28f70b0d..3966c7fb476 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -17,7 +17,7 @@ import StringWithComponent from './string-with-component'; import TimeWithTooltip from './time-with-tooltip'; import ValueDisplay from './value-display'; -const jsonId = 'kudosu'; +const jsonId = 'json-kudosu'; function Entry({ kudosu }: { kudosu: KudosuHistoryJson }) { const textMappings = { From 7561f2759c74e1a72823b5465317dc30478ebf32 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 19:40:30 +0900 Subject: [PATCH 0033/1261] split Chart into component; observable ref was not the best idea. --- resources/assets/lib/profile-page/chart.tsx | 90 +++++++++++++++ .../assets/lib/profile-page/historical.tsx | 105 +----------------- 2 files changed, 96 insertions(+), 99 deletions(-) create mode 100644 resources/assets/lib/profile-page/chart.tsx diff --git a/resources/assets/lib/profile-page/chart.tsx b/resources/assets/lib/profile-page/chart.tsx new file mode 100644 index 00000000000..825f2860264 --- /dev/null +++ b/resources/assets/lib/profile-page/chart.tsx @@ -0,0 +1,90 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import LineChart, { makeOptionsDate } from 'charts/line-chart'; +import { curveLinear } from 'd3'; +import { escape } from 'lodash'; +import * as moment from 'moment'; +import core from 'osu-core-singleton'; +import * as React from 'react'; +import { formatNumber } from 'utils/html'; + +// conveniently both charts share same interface +export interface ChartData { + x: Date; + y: number; +} + +interface Props { + data: ChartData[]; + labelY: string; +} + +function updateTicks(chart: LineChart, data: ChartData[]) { + if (core.windowSize.isDesktop) { + chart.options.ticksX = undefined; + + chart.options.tickValuesX = data.length < 10 ? data.map((d) => d.x) : undefined; + } else { + chart.options.ticksX = Math.min(6, data.length); + chart.options.tickValuesX = undefined; + } +} + +// @observer +export default class Chart extends React.Component { + private chart?: LineChart; + private readonly disposers = new Set<(() => void) | undefined>(); + private readonly ref = React.createRef(); + + constructor(props: Props) { + super(props); + + // makeObservable(this); + } + + componentDidMount() { + $(window).on('resize', this.resizeChart); + this.disposers.add(() => $(window).off('resize', this.resizeChart)); + this.updateChart(); + } + + componentWillUnmount() { + this.disposers.forEach((disposer) => disposer?.()); + } + + render() { + return
    ; + } + + + private readonly resizeChart = () => { + this.chart?.resize(); + }; + + private readonly updateChart = () => { + if (this.ref.current == null) return; // for typing purposes, ref object shouldn't be null in componentDidMount(); + + if (this.chart == null) { + const options = makeOptionsDate({ + circleLine: true, + curve: curveLinear, + formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), + formatY: (d: number) => formatNumber(d), + infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), + infoBoxFormatY: (d: number) => `${this.props.labelY} ${escape(formatNumber(d))}`, + marginRight: 60, // more spacing for x axis label + modifiers: 'profile-page', + }); + + this.chart = new LineChart(this.ref.current, options); + } + + const definedChart = this.chart; + + this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { + updateTicks(definedChart, this.props.data); + definedChart.loadData(this.props.data); + })); + }; +} diff --git a/resources/assets/lib/profile-page/historical.tsx b/resources/assets/lib/profile-page/historical.tsx index 76f43672cde..df2a14c61f7 100644 --- a/resources/assets/lib/profile-page/historical.tsx +++ b/resources/assets/lib/profile-page/historical.tsx @@ -1,20 +1,16 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. -import LineChart, { makeOptionsDate } from 'charts/line-chart'; import LazyLoad from 'components/lazy-load'; import ProfilePageExtraSectionTitle from 'components/profile-page-extra-section-title'; import ShowMoreLink from 'components/show-more-link'; -import { curveLinear } from 'd3'; -import { escape, sortBy, times } from 'lodash'; -import { autorun, computed, makeObservable, observable } from 'mobx'; -import { disposeOnUnmount, observer } from 'mobx-react'; +import { sortBy, times } from 'lodash'; +import { computed, makeObservable } from 'mobx'; +import { observer } from 'mobx-react'; import * as moment from 'moment'; -import core from 'osu-core-singleton'; import * as React from 'react'; -import { formatNumber } from 'utils/html'; -import { switchNever } from 'utils/switch-never'; import BeatmapPlaycount from './beatmap-playcount'; +import Chart, { ChartData } from './chart'; import ExtraHeader from './extra-header'; import ExtraPageProps, { HistoricalSection } from './extra-page-props'; import PlayDetailList from './play-detail-list'; @@ -28,11 +24,6 @@ interface RawChartData { start_date: string; } -interface ChartData { - x: Date; - y: number; -} - function convertUserDataForChart(rawData: RawChartData[]): ChartData[] { const data = sortBy(rawData, 'start_date') .map((count) => ({ @@ -69,26 +60,8 @@ function dataPadder(padded: ChartData[], entry: ChartData) { return padded; } -function updateTicks(chart: LineChart, data: ChartData[]) { - if (core.windowSize.isDesktop) { - chart.options.ticksX = undefined; - - chart.options.tickValuesX = data.length < 10 ? data.map((d) => d.x) : undefined; - } else { - chart.options.ticksX = Math.min(6, data.length); - chart.options.tickValuesX = undefined; - } -} - @observer export default class Historical extends React.Component { - @observable private readonly chartRefs = { - monthly_playcounts: React.createRef(), - replays_watched_counts: React.createRef(), - }; - private readonly charts: Partial>> = {}; - private readonly disposers = new Set<(() => void) | undefined>(); - @computed private get historical() { return this.props.controller.state.historical; @@ -115,16 +88,6 @@ export default class Historical extends React.Component { makeObservable(this); } - componentDidMount() { - $(window).on('resize', this.resizeCharts); - this.disposers.add(() => $(window).off('resize', this.resizeCharts)); - disposeOnUnmount(this, autorun(this.updateCharts)); - } - - componentWillUnmount() { - this.disposers.forEach((disposer) => disposer?.()); - } - render() { return (
    @@ -157,7 +120,7 @@ export default class Historical extends React.Component {
    -
    +
    } @@ -192,67 +155,11 @@ export default class Historical extends React.Component {
    -
    +
    } ); } - - private readonly resizeCharts = () => { - Object.values(this.charts).forEach((chart) => { - chart.resize(); - }); - }; - - private readonly updateChart = (attribute: ChartSection) => { - if (!this.hasSection(attribute)) return; - - const area = this.chartRefs[attribute].current; - - if (area == null) { - return; - } - - let data: ChartData[]; - switch (attribute) { - case 'monthly_playcounts': - data = this.monthlyPlaycountsData; - break; - case 'replays_watched_counts': - data = this.replaysWatchedCountsData; - break; - default: - switchNever(attribute); - throw new Error('unsupported chart section'); - } - - let chart = this.charts[attribute]; - if (chart == null) { - const options = makeOptionsDate({ - circleLine: true, - curve: curveLinear, - formatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month_short.moment')), - formatY: (d: number) => formatNumber(d), - infoBoxFormatX: (d: Date) => moment.utc(d).format(osu.trans('common.datetime.year_month.moment')), - infoBoxFormatY: (d: number) => `${osu.trans(`users.show.extra.historical.${attribute}.count_label`)} ${escape(formatNumber(d))}`, - marginRight: 60, // more spacing for x axis label - modifiers: 'profile-page', - }); - - chart = this.charts[attribute] = new LineChart(area, options); - } - - const definedChart = chart; - - this.disposers.add(core.reactTurbolinks.runAfterPageLoad(() => { - updateTicks(definedChart, data); - definedChart.loadData(data); - })); - }; - - private readonly updateCharts = () => { - chartSections.forEach(this.updateChart); - }; } From 8fac76da41f851cc6826f09e566eddf919a24c30 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 20:09:01 +0900 Subject: [PATCH 0034/1261] no tsx --- .../components/{lazy-load-context.tsx => lazy-load-context.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/assets/lib/components/{lazy-load-context.tsx => lazy-load-context.ts} (100%) diff --git a/resources/assets/lib/components/lazy-load-context.tsx b/resources/assets/lib/components/lazy-load-context.ts similarity index 100% rename from resources/assets/lib/components/lazy-load-context.tsx rename to resources/assets/lib/components/lazy-load-context.ts From 0c776b820f50006c05b556f51d30ca9401b2a681 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 20:27:40 +0900 Subject: [PATCH 0035/1261] lint fix --- resources/assets/lib/components/profile-page-kudosu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index 3966c7fb476..e1308195c7c 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -89,7 +89,7 @@ export default class ProfilePageKudosu extends React.Component {
    - +
    Date: Thu, 13 Oct 2022 21:37:38 +0900 Subject: [PATCH 0036/1261] main is always above the extra tabs bar --- resources/assets/lib/profile-page/main.tsx | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index f59fba28190..31e038be87a 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -50,12 +50,12 @@ export default class Main extends React.Component { recent_activity: React.createRef(), top_ranks: React.createRef(), }; + @observable private extraTabsBottom = 0; private jumpTo: Page | null = null; private lastScroll = 0; private readonly pages = React.createRef(); private readonly tabs = React.createRef(); private readonly timeouts: Partial> = {}; - @observable private visibleOffset = 0; @computed private get displayExtraTabs() { @@ -99,7 +99,7 @@ export default class Main extends React.Component { core.reactTurbolinks.runAfterPageLoad(action(() => { if (this.pagesOffset != null) { const bounds = this.pagesOffset.getBoundingClientRect(); - this.visibleOffset = bounds.bottom; + this.extraTabsBottom = bounds.bottom; this.pages.current?.style.setProperty('--scroll-margin-top', `${bounds.height}px`); } })); @@ -210,7 +210,7 @@ export default class Main extends React.Component {
    {this.displayedExtraPages.map((name) => ( - +
    { // Scroll lazy loaded part into view in case it was taller than the visible area. // This should only be an issue at page bottom. if (bottomPage() && this.jumpTo === name) { - if (bounds.top < this.visibleOffset) { + if (bounds.top < this.extraTabsBottom) { this.jumpTo = null; } @@ -304,33 +304,35 @@ export default class Main extends React.Component { const pages = this.pageElements; if (pages.length === 0) return; - this.visibleOffset = this.pagesOffset.getBoundingClientRect().bottom; + this.extraTabsBottom = this.pagesOffset.getBoundingClientRect().bottom; const matching = new Set(); for (const page of pages) { - const pageId = page.dataset.pageId as ProfileExtraPage; + const pageId = page.dataset.pageId as Page; const pageDims = page.getBoundingClientRect(); - if (pageId === this.jumpTo && pageDims.top < this.visibleOffset) { + if (pageId === this.jumpTo && pageDims.top < this.extraTabsBottom) { this.jumpTo = null; } const pageBottom = pageDims.bottom - Math.min(pageDims.height * 0.75, 200); + const match = pageId === 'main' + ? pageBottom > 0 + : pageBottom > this.extraTabsBottom && pageDims.top < window.innerHeight; - if (pageBottom > this.visibleOffset && pageDims.top < window.innerHeight) { + if (match) { matching.add(pageId); } } - let preferred: Page | null = null; + let preferred: Page | undefined; const pageIds = [...matching.values()]; - // special case for bottom of page if there are multiple pages visible. if (bottomPage()) { // prefer using the page being navigated to if its element is in view. - preferred = this.jumpTo != null && matching.has(this.jumpTo) ? this.jumpTo : last(pageIds) ?? null; + preferred = this.jumpTo != null && matching.has(this.jumpTo) ? this.jumpTo : last(pageIds); } else { - preferred = first(pageIds) ?? null; + preferred = first(pageIds); } if (preferred != null) { From 39700906f8c43cc3ca573e115498491bdfd2fe26 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 21:44:24 +0900 Subject: [PATCH 0037/1261] nothing to observe --- .../lib/components/profile-page-kudosu.tsx | 3 +- .../assets/lib/modding-profile/kudosu.tsx | 31 ++++++------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index e1308195c7c..73be0ec2e3b 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -61,8 +61,7 @@ interface Props { @observer export default class ProfilePageKudosu extends React.Component { - @observable - private kudosu?: OffsetPaginatorJson; + @observable private kudosu?: OffsetPaginatorJson; private showMoreXhr?: JQuery.jqXHR; private xhr?: JQuery.jqXHR>; diff --git a/resources/assets/lib/modding-profile/kudosu.tsx b/resources/assets/lib/modding-profile/kudosu.tsx index 3aac57dde7e..82ee7f9bf1c 100644 --- a/resources/assets/lib/modding-profile/kudosu.tsx +++ b/resources/assets/lib/modding-profile/kudosu.tsx @@ -3,11 +3,9 @@ import ProfilePageKudosu from 'components/profile-page-kudosu'; import KudosuHistoryJson from 'interfaces/kudosu-history-json'; -import { makeObservable, observable } from 'mobx'; -import { observer } from 'mobx-react'; import * as React from 'react'; import { jsonClone } from 'utils/json'; -import { hasMoreCheck, OffsetPaginatorJson } from 'utils/offset-paginator'; +import { hasMoreCheck } from 'utils/offset-paginator'; interface Props { expectedInitialCount: number; @@ -17,34 +15,25 @@ interface Props { userId: number; } -type MobxState = OffsetPaginatorJson; - -@observer export default class Kudosu extends React.Component { - @observable private mobxState: MobxState = { - items: [], - pagination: {}, - }; - private xhr?: JQuery.jqXHR; + private readonly kudosu; constructor(props: Props) { super(props); - // TODO: this should be handled by Main component instead. - this.mobxState.items = jsonClone(props.initialKudosu); - this.mobxState.pagination.hasMore = hasMoreCheck(props.expectedInitialCount, this.mobxState.items); - - makeObservable(this); - } - - componentWillUnmount() { - this.xhr?.abort(); + const items = jsonClone(props.initialKudosu); + this.kudosu = { + items, + pagination: { + hasMore: hasMoreCheck(props.expectedInitialCount, items), + }, + }; } render() { return ( Date: Thu, 13 Oct 2022 21:46:02 +0900 Subject: [PATCH 0038/1261] cursor would be in getExtraSection...I think? --- app/Http/Controllers/UsersController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index ff3f27b3c94..cb9b384a9ea 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -143,7 +143,6 @@ public function checkUsernameExists() public function extraPages($_id, $page) { // TODO: counts basically duplicated from UserCompactTransformer - // TOOD: switch to cursor pagination? switch ($page) { case 'beatmaps': return [ From 160004dd00d6513d87c8f45a2f426f17c7b4a706 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 13 Oct 2022 21:57:49 +0900 Subject: [PATCH 0039/1261] fetches no longer have to resolve a Promise --- resources/assets/lib/components/lazy-load.tsx | 4 +++- resources/assets/lib/components/profile-page-kudosu.tsx | 1 - resources/assets/lib/profile-page/controller.tsx | 4 ---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index c7471359e42..beec301ddf5 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -10,8 +10,10 @@ import { bottomPageDistance } from 'utils/html'; import LazyLoadContext from './lazy-load-context'; interface Props { + // For allowing lazy loading to be completely skipped if data is alrealy available. + // Immediately resolving a Promise in onLoad still renders a spinner. hasData?: boolean; - onLoad: () => PromiseLike; + onLoad: () => JQuery.jqXHR; } @observer diff --git a/resources/assets/lib/components/profile-page-kudosu.tsx b/resources/assets/lib/components/profile-page-kudosu.tsx index 73be0ec2e3b..6c31f46a460 100644 --- a/resources/assets/lib/components/profile-page-kudosu.tsx +++ b/resources/assets/lib/components/profile-page-kudosu.tsx @@ -117,7 +117,6 @@ export default class ProfilePageKudosu extends React.Component { @action private readonly handleOnLoad = () => { - if (this.kudosu != null) return Promise.resolve(); this.xhr = getPage({ id: this.props.userId }, 'kudosu'); this.xhr.done((json) => runInAction(() => { diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 6ff29a34572..15424497b58 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -361,7 +361,6 @@ export default class Controller { @action getBeatmapsets() { - if (this.state.beatmapsets != null) return Promise.resolve(); const xhr = getPage(this.state.user, 'beatmaps'); xhr.done((json) => runInAction(() => { @@ -373,7 +372,6 @@ export default class Controller { @action getHistorical() { - if (this.state.historical != null) return Promise.resolve(); const xhr = getPage(this.state.user, 'historical'); xhr.done((json) => runInAction(() => { @@ -385,7 +383,6 @@ export default class Controller { @action getRecentActivity() { - if (this.state.recentActivity != null) return Promise.resolve(); const xhr = getPage>(this.state.user, 'recent_activity'); xhr.done((json) => runInAction(() => { @@ -397,7 +394,6 @@ export default class Controller { @action getTopScores() { - if (this.state.topScores != null) return Promise.resolve(); const xhr = getPage(this.state.user, 'top_ranks'); xhr.done((json) => runInAction(() => { From 4dcc1b7d8bea46e1957d31ec25fc9b54e7680c69 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 14 Oct 2022 04:39:40 +0900 Subject: [PATCH 0040/1261] ...uncommited lint fix --- resources/assets/lib/profile-page/historical.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/lib/profile-page/historical.tsx b/resources/assets/lib/profile-page/historical.tsx index df2a14c61f7..8a188273478 100644 --- a/resources/assets/lib/profile-page/historical.tsx +++ b/resources/assets/lib/profile-page/historical.tsx @@ -120,7 +120,7 @@ export default class Historical extends React.Component {
    - +
    } @@ -155,7 +155,7 @@ export default class Historical extends React.Component {
    - +
    } From 4d84af81ee9141e7fdaa6e6c99aa27799c89049b Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 17 Oct 2022 17:13:37 +0900 Subject: [PATCH 0041/1261] consolidate to generic getter --- .../assets/lib/profile-page/beatmapsets.tsx | 6 +- .../assets/lib/profile-page/controller.tsx | 93 +++++++------------ .../assets/lib/profile-page/historical.tsx | 24 ++--- resources/assets/lib/profile-page/kudosu.tsx | 2 +- .../lib/profile-page/play-detail-list.tsx | 4 +- .../lib/profile-page/recent-activity.tsx | 16 ++-- .../assets/lib/profile-page/top-scores.tsx | 4 +- 7 files changed, 64 insertions(+), 85 deletions(-) diff --git a/resources/assets/lib/profile-page/beatmapsets.tsx b/resources/assets/lib/profile-page/beatmapsets.tsx index a81af5e63d0..26a475d059f 100644 --- a/resources/assets/lib/profile-page/beatmapsets.tsx +++ b/resources/assets/lib/profile-page/beatmapsets.tsx @@ -42,7 +42,7 @@ const sectionKeys = [ export default class Beatmapsets extends React.Component { @computed private get hasData() { - return this.props.controller.state.beatmapsets != null; + return this.props.controller.state.lazy.beatmaps != null; } render() { @@ -56,14 +56,14 @@ export default class Beatmapsets extends React.Component { ); } - private readonly handleOnLoad = () => this.props.controller.getBeatmapsets(); + private readonly handleOnLoad = () => this.props.controller.get('beatmaps'); private readonly onShowMore = (section: BeatmapsetSection) => { this.props.controller.apiShowMore(section); }; private readonly renderBeatmapsets = (section: typeof sectionKeys[number]) => { - const state = this.props.controller.state.beatmapsets; + const state = this.props.controller.state.lazy.beatmaps; if (state == null) return; const count = state[section.key].count; diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index 15424497b58..3ea59760b05 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -68,6 +68,14 @@ interface InitialData { user: ProfilePageUserJson; } +interface LazyPages { + beatmaps: BeatmapsetsJson; + historical: HistoricalJson; + kudosu: PageSectionWithoutCountJson; + recent_activity: PageSectionWithoutCountJson; + top_ranks: TopScoresJson; +} + export type Page = ProfileExtraPage | 'main'; interface ScorePinReorderParams { @@ -78,13 +86,9 @@ interface ScorePinReorderParams { } interface State { - beatmapsets?: BeatmapsetsJson; currentPage: Page; editingUserPage: boolean; - historical?: HistoricalJson; - kudosu?: PageSectionWithoutCountJson; - recentActivity?: PageSectionWithoutCountJson; - topScores?: TopScoresJson; + lazy: Partial; user: ProfilePageUserJson; } @@ -118,6 +122,7 @@ export default class Controller { this.state = { currentPage: 'main', editingUserPage: false, + lazy: {}, user: initialData.user, }; } else { @@ -137,10 +142,10 @@ export default class Controller { @action apiReorderScorePin(currentIndex: number, newIndex: number) { - if (this.state.topScores == null) return; + if (this.state.lazy.top_ranks == null) return; - const origItems = this.state.topScores.pinned.items.slice(); - const items = this.state.topScores.pinned.items; + const origItems = this.state.lazy.top_ranks.pinned.items.slice(); + const items = this.state.lazy.top_ranks.pinned.items; const adjacentScoreId = items[newIndex]?.id; if (adjacentScoreId == null) { throw new Error('invalid newIndex specified'); @@ -177,8 +182,8 @@ export default class Controller { method: 'PUT', }).fail(action((xhr: JQuery.jqXHR, status: string) => { error(xhr, status); - if (this.state.topScores != null) { - this.state.topScores.pinned.items = origItems; + if (this.state.lazy.top_ranks != null) { + this.state.lazy.top_ranks.pinned.items = origItems; } })).always(hideLoadingOverlay); } @@ -277,8 +282,8 @@ export default class Controller { switch (section) { case 'beatmapPlaycounts': { - if (this.state.historical != null) { - const json = this.state.historical.beatmap_playcounts; + if (this.state.lazy.historical != null) { + const json = this.state.lazy.historical.beatmap_playcounts; this.xhr[section] = apiShowMore( json, @@ -296,9 +301,9 @@ export default class Controller { case 'lovedBeatmapsets': case 'pendingBeatmapsets': case 'rankedBeatmapsets': { - if (this.state.beatmapsets != null) { + if (this.state.lazy.beatmaps != null) { const type = sectionToUrlType[section]; - const json = this.state.beatmapsets[type]; + const json = this.state.lazy.beatmaps[type]; this.xhr[section] = apiShowMore( json, @@ -311,9 +316,9 @@ export default class Controller { } case 'recentActivity': - if (this.state.recentActivity != null) { + if (this.state.lazy.recent_activity != null) { this.xhr[section] = apiShowMore( - this.state.recentActivity, + this.state.lazy.recent_activity, 'users.recent-activity', baseParams, ); @@ -330,7 +335,7 @@ export default class Controller { case 'scoresPinned': case 'scoresRecent': { const type = sectionToUrlType[section]; - const json = type === 'recent' ? this.state.historical?.recent : this.state.topScores?.[type]; + const json = type === 'recent' ? this.state.lazy.historical?.recent : this.state.lazy.top_ranks?.[type]; if (json != null) { this.xhr[section] = apiShowMore( @@ -360,45 +365,13 @@ export default class Controller { } @action - getBeatmapsets() { - const xhr = getPage(this.state.user, 'beatmaps'); - - xhr.done((json) => runInAction(() => { - this.state.beatmapsets = json; - })); - - return xhr; - } - - @action - getHistorical() { - const xhr = getPage(this.state.user, 'historical'); - - xhr.done((json) => runInAction(() => { - this.state.historical = json; - })); - - return xhr; - } - - @action - getRecentActivity() { - const xhr = getPage>(this.state.user, 'recent_activity'); - - xhr.done((json) => runInAction(() => { - this.state.recentActivity = json; - })); - - return xhr; - } - - @action - getTopScores() { - const xhr = getPage(this.state.user, 'top_ranks'); + get(page: T) { + const xhr = getPage(this.state.user, page) + .done((json) => runInAction(() => { + this.state.lazy[page] = json; + })); - xhr.done((json) => runInAction(() => { - this.state.topScores = json; - })); + this.xhr[page] = xhr; return xhr; } @@ -416,7 +389,7 @@ export default class Controller { @action private readonly onScorePinUpdate = (event: unknown, isPinned: boolean, score: SoloScoreJson) => { - if (this.state.topScores == null) return; + if (this.state.lazy.top_ranks == null) return; // make sure the typing is correct if (!isSoloScoreJsonForUser(score)) { return; @@ -431,16 +404,16 @@ export default class Controller { const newScore = jsonClone(score); newScore.id = scorePinData.score_id; - const arrayIndex = this.state.topScores.pinned.items.findIndex((s) => s.id === newScore.id); - this.state.topScores.pinned.count += isPinned ? 1 : -1; + const arrayIndex = this.state.lazy.top_ranks.pinned.items.findIndex((s) => s.id === newScore.id); + this.state.lazy.top_ranks.pinned.count += isPinned ? 1 : -1; if (isPinned) { if (arrayIndex === -1) { - this.state.topScores.pinned.items.unshift(newScore); + this.state.lazy.top_ranks.pinned.items.unshift(newScore); } } else { if (arrayIndex !== -1) { - pullAt(this.state.topScores.pinned.items, arrayIndex); + pullAt(this.state.lazy.top_ranks.pinned.items, arrayIndex); } } diff --git a/resources/assets/lib/profile-page/historical.tsx b/resources/assets/lib/profile-page/historical.tsx index 8a188273478..5e669639f69 100644 --- a/resources/assets/lib/profile-page/historical.tsx +++ b/resources/assets/lib/profile-page/historical.tsx @@ -63,23 +63,23 @@ function dataPadder(padded: ChartData[], entry: ChartData) { @observer export default class Historical extends React.Component { @computed - private get historical() { - return this.props.controller.state.historical; + private get data() { + return this.props.controller.state.lazy.historical; } @computed private get hasData() { - return this.historical != null; + return this.data != null; } @computed private get monthlyPlaycountsData() { - return convertUserDataForChart(this.historical?.monthly_playcounts ?? []); + return convertUserDataForChart(this.data?.monthly_playcounts ?? []); } @computed private get replaysWatchedCountsData() { - return convertUserDataForChart(this.historical?.replays_watched_counts ?? []); + return convertUserDataForChart(this.data?.replays_watched_counts ?? []); } constructor(props: ExtraPageProps) { @@ -100,10 +100,10 @@ export default class Historical extends React.Component { ); } - private readonly handleOnLoad = () => this.props.controller.getHistorical(); + private readonly handleOnLoad = () => this.props.controller.get('historical'); private hasSection(attribute: ChartSection) { - return this.historical != null && this.historical[attribute].length > 0; + return this.data != null && this.data[attribute].length > 0; } private readonly onShowMore = (section: HistoricalSection) => { @@ -111,7 +111,7 @@ export default class Historical extends React.Component { }; private renderHistorical() { - if (this.historical == null) return; + if (this.data == null) return; return ( <> @@ -126,13 +126,13 @@ export default class Historical extends React.Component { } - {this.historical.beatmap_playcounts.count > 0 && + {this.data.beatmap_playcounts.count > 0 && <> - {this.historical.beatmap_playcounts.items.map((playcount) => ( + {this.data.beatmap_playcounts.items.map((playcount) => ( { /> ))} { render() { return ( { @computed private get scores() { - return this.sectionMap.key === 'recent' ? this.props.controller.state.historical?.recent : this.props.controller.state.topScores?.[this.sectionMap.key]; + return this.sectionMap.key === 'recent' + ? this.props.controller.state.lazy.historical?.recent + : this.props.controller.state.lazy.top_ranks?.[this.sectionMap.key]; } @computed diff --git a/resources/assets/lib/profile-page/recent-activity.tsx b/resources/assets/lib/profile-page/recent-activity.tsx index d4969e16cde..7e9e41dab84 100644 --- a/resources/assets/lib/profile-page/recent-activity.tsx +++ b/resources/assets/lib/profile-page/recent-activity.tsx @@ -20,12 +20,16 @@ import parseEvent from './parse-event'; export default class RecentActivity extends React.Component { @computed private get count() { - return this.props.controller.state.recentActivity?.items.length ?? 0; + return this.data?.items.length ?? 0; + } + + private get data() { + return this.props.controller.state.lazy.recent_activity; } @computed private get hasData() { - return this.props.controller.state.recentActivity != null; + return this.data != null; } constructor(props: ExtraPageProps) { @@ -45,7 +49,7 @@ export default class RecentActivity extends React.Component { ); } - private readonly handleOnLoad = () => this.props.controller.getRecentActivity(); + private readonly handleOnLoad = () => this.props.controller.get('recent_activity'); private readonly onShowMore = () => { this.props.controller.apiShowMore('recentActivity'); @@ -56,14 +60,14 @@ export default class RecentActivity extends React.Component { } private renderEntries() { - if (this.props.controller.state.recentActivity == null) return null; + if (this.data == null) return null; return (
    - +
    +

    + {!! osu_trans('users.create.form.tos_notice._', [ + 'link' => tag( + 'a', + [ + 'href' => route('legal', ['locale' => app()->getLocale(), 'path' => 'Terms']), + 'target' => '_blank', + ], + osu_trans('users.create.form.tos_notice.link') + ), + ]) !!} +

    +
    @endsection From d6a740b2366e26fe8453a444cd69eb733512f62f Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 2 Jan 2023 09:30:30 +0900 Subject: [PATCH 0359/1261] allow bot to send chat message without min plays --- app/Libraries/OsuAuthorize.php | 8 ++++--- tests/Libraries/ChatTest.php | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/app/Libraries/OsuAuthorize.php b/app/Libraries/OsuAuthorize.php index 4b9579d15e9..8390cc8855c 100644 --- a/app/Libraries/OsuAuthorize.php +++ b/app/Libraries/OsuAuthorize.php @@ -913,7 +913,7 @@ public function checkChatChannelCanMessage(?User $user, Channel $channel): strin $this->ensureLoggedIn($user); $this->ensureCleanRecord($user, $prefix); - if (!config('osu.user.min_plays_allow_verified_bypass')) { + if (!(config('osu.user.min_plays_allow_verified_bypass') || $user->isBot())) { $this->ensureHasPlayed($user); } @@ -962,7 +962,7 @@ public function checkChatPmStart(?User $user, User $target): string $this->ensureLoggedIn($user); $this->ensureCleanRecord($user, $prefix); - if (!config('osu.user.min_plays_allow_verified_bypass')) { + if (!(config('osu.user.min_plays_allow_verified_bypass') || $user->isBot())) { $this->ensureHasPlayed($user); } @@ -998,7 +998,9 @@ public function checkChatChannelSend(?User $user, Channel $channel): string $this->ensureSessionVerified($user); $this->ensureCleanRecord($user, $prefix); // This check becomes useless when min_plays_allow_verified_bypass is enabled. - $this->ensureHasPlayed($user); + if (!$user->isBot()) { + $this->ensureHasPlayed($user); + } if (!$this->doCheckUser($user, 'ChatChannelRead', $channel)->can()) { return $prefix.'no_access'; diff --git a/tests/Libraries/ChatTest.php b/tests/Libraries/ChatTest.php index 060349958f2..7f2e364a521 100644 --- a/tests/Libraries/ChatTest.php +++ b/tests/Libraries/ChatTest.php @@ -106,6 +106,38 @@ public function testSendPM() $this->assertSame($initialMessagesCount + 1, Message::count()); } + /** + * @dataProvider sendPMMinPlaysDataProvider + */ + public function testSendPMMinPlays(?string $groupIdentifier, $hasMinPlays, $successful) + { + config()->set('osu.user.min_plays_allow_verified_bypass', false); + config()->set('osu.user.min_plays_for_posting', 2); + + $playCount = $hasMinPlays ? null : 1; + + $sender = User::factory()->withGroup($groupIdentifier)->withPlays($playCount)->create(); + $sender->markSessionVerified(); + $target = User::factory()->create(['pm_friends_only' => false]); + + $countChange = $successful ? 1 : 0; + + $this->expectCountChange(fn () => Channel::count(), $countChange); + $this->expectCountChange(fn () => Message::count(), $countChange); + + if (!$successful) { + $this->expectException(AuthorizationException::class); + } + + Chat::sendPrivateMessage($sender, $target, 'test message', false); + + $channel = Channel::findPM($sender, $target); + + if ($successful) { + $this->assertInstanceOf(Channel::class, Channel::findPM($sender, $target)); + }; + } + /** * @dataProvider sendPmFriendsOnlyGroupsDataProvider */ @@ -240,6 +272,16 @@ public function sendPmFriendsOnlyGroupsDataProvider() ]; } + public function sendPMMinPlaysDataProvider() + { + return [ + [null, true, true], + [null, false, false], + ['bot', true, true], + ['bot', false, true], + ]; + } + public function sendPmSenderFriendsOnlyGroupsDataProvider() { return [ From d822e181abf40dd203bb04d4cbeb8b2157e44cb7 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 2 Jan 2023 09:36:09 +0900 Subject: [PATCH 0360/1261] whoops --- tests/Libraries/ChatTest.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Libraries/ChatTest.php b/tests/Libraries/ChatTest.php index 7f2e364a521..c9c68c1815b 100644 --- a/tests/Libraries/ChatTest.php +++ b/tests/Libraries/ChatTest.php @@ -131,11 +131,9 @@ public function testSendPMMinPlays(?string $groupIdentifier, $hasMinPlays, $succ Chat::sendPrivateMessage($sender, $target, 'test message', false); - $channel = Channel::findPM($sender, $target); - if ($successful) { $this->assertInstanceOf(Channel::class, Channel::findPM($sender, $target)); - }; + } } /** From 8cbaeef98f720414cb07e827de1c31f13b044d33 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 3 Jan 2023 17:41:25 +0900 Subject: [PATCH 0361/1261] Only fetch scores with valid beatmap --- app/Libraries/Score/FetchDedupedScores.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Libraries/Score/FetchDedupedScores.php b/app/Libraries/Score/FetchDedupedScores.php index 02390f686b0..cdbcc2c2ffe 100644 --- a/app/Libraries/Score/FetchDedupedScores.php +++ b/app/Libraries/Score/FetchDedupedScores.php @@ -35,10 +35,11 @@ public function all(): array $nextCursor['is_legacy'] = get_bool($nextCursor['is_legacy']); $search->searchAfter(array_values($nextCursor)); } - $search->response(); + $response = $search->response(); $search->assertNoError(); - if ($this->append($search->records()->all())) { + $records = $response->records()->whereHas('beatmap.beatmapset')->get()->all(); + if ($this->append($records)) { break; } From 8d0d255318a8b80bbd1e6c8dad21725df842c3e3 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 3 Jan 2023 20:20:40 +0900 Subject: [PATCH 0362/1261] Add string cursor for artist tracks --- app/Http/Controllers/ArtistTracksController.php | 5 ++--- app/Libraries/Search/ArtistTrackSearchParamsFromRequest.php | 3 +-- resources/assets/lib/artist-tracks-index/main.tsx | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/ArtistTracksController.php b/app/Http/Controllers/ArtistTracksController.php index 3cd5764f8fa..b1d5fbf3c78 100644 --- a/app/Http/Controllers/ArtistTracksController.php +++ b/app/Http/Controllers/ArtistTracksController.php @@ -16,11 +16,10 @@ public function index() $params = ArtistTrackSearchParamsFromRequest::fromArray(request()->all()); $search = new ArtistTrackSearch($params); - $data = [ + $data = array_merge([ 'artist_tracks' => json_collection($search->records(), 'ArtistTrack', ['artist', 'album']), 'search' => ArtistTrackSearchParamsFromRequest::toArray($params), - 'cursor' => $search->getSortCursor(), - ]; + ], cursor_for_response($search->getSortCursor())); if (is_json_request()) { return $data; diff --git a/app/Libraries/Search/ArtistTrackSearchParamsFromRequest.php b/app/Libraries/Search/ArtistTrackSearchParamsFromRequest.php index dc18a01cbce..2c12c007488 100644 --- a/app/Libraries/Search/ArtistTrackSearchParamsFromRequest.php +++ b/app/Libraries/Search/ArtistTrackSearchParamsFromRequest.php @@ -18,7 +18,6 @@ public static function fromArray(array $rawParams) 'album', 'artist', 'bpm:array', - 'cursor:array', 'genre', 'is_default_sort:bool', 'length:array', @@ -36,7 +35,7 @@ public static function fromArray(array $rawParams) $params->genre = $paramsArray['genre']; [$params->length, $params->lengthInput] = ComparatorParam::make($paramsArray['length'], 'length', 0.5); $params->parseSort($paramsArray['sort'], $paramsArray['is_default_sort']); - $params->searchAfter = SearchAfterParam::make($params, $paramsArray['cursor']); // TODO: filter cursor param + $params->searchAfter = SearchAfterParam::make($params, cursor_from_params($rawParams)); // TODO: enforce value types return $params; } diff --git a/resources/assets/lib/artist-tracks-index/main.tsx b/resources/assets/lib/artist-tracks-index/main.tsx index 83682d65ec4..97f0024263d 100644 --- a/resources/assets/lib/artist-tracks-index/main.tsx +++ b/resources/assets/lib/artist-tracks-index/main.tsx @@ -19,7 +19,7 @@ import Sort from './sort-bar'; export interface ArtistTracksIndex { artist_tracks: ArtistTrackWithArtistJson[]; - cursor: unknown; + cursor_string: string | null; search: ArtistTrackSearch; } @@ -89,7 +89,7 @@ export default class Main extends React.Component { @@ -103,7 +103,7 @@ export default class Main extends React.Component { @action private readonly handleShowMore = () => { - this.loadingXhr = $.getJSON(route('artists.tracks.index'), { ...this.data.search, cursor: this.data.cursor }); + this.loadingXhr = $.getJSON(route('artists.tracks.index'), { ...this.data.search, cursor_string: this.data.cursor_string }); this.loadingXhr.done((newData) => runInAction(() => { const { container, ...prevProps } = this.props; From 06efb85a7e50625133dfddb07f59f551039a3ed6 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 3 Jan 2023 20:30:12 +0900 Subject: [PATCH 0363/1261] Less surprising search and cursor behaviour --- app/Http/Controllers/ArtistTracksController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ArtistTracksController.php b/app/Http/Controllers/ArtistTracksController.php index b1d5fbf3c78..6a68eca4c44 100644 --- a/app/Http/Controllers/ArtistTracksController.php +++ b/app/Http/Controllers/ArtistTracksController.php @@ -8,6 +8,7 @@ use App\Libraries\Search\ArtistTrackSearch; use App\Libraries\Search\ArtistTrackSearchParamsFromRequest; use App\Models\ArtistTrack; +use App\Transformers\ArtistTrackTransformer; class ArtistTracksController extends Controller { @@ -16,8 +17,9 @@ public function index() $params = ArtistTrackSearchParamsFromRequest::fromArray(request()->all()); $search = new ArtistTrackSearch($params); + $tracks = $search->records(); $data = array_merge([ - 'artist_tracks' => json_collection($search->records(), 'ArtistTrack', ['artist', 'album']), + 'artist_tracks' => json_collection($tracks, new ArtistTrackTransformer(), ['artist', 'album']), 'search' => ArtistTrackSearchParamsFromRequest::toArray($params), ], cursor_for_response($search->getSortCursor())); From 7419f28adb9ef71a86379db117af66548c5b2177 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 3 Jan 2023 20:38:59 +0900 Subject: [PATCH 0364/1261] Add support for string cursor on news listing --- app/Http/Controllers/NewsController.php | 31 +++++++++++------------- app/Models/NewsPost.php | 2 +- resources/assets/lib/news-index/main.tsx | 4 +-- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php index ce1890b135f..337e8d6efcc 100644 --- a/app/Http/Controllers/NewsController.php +++ b/app/Http/Controllers/NewsController.php @@ -22,15 +22,15 @@ class NewsController extends Controller * * ### Response Format * - * Field | Type | Notes - * --------------------------|-------------------------|------ - * cursor | [Cursor](#cursor) | | - * news_posts | [NewsPost](#newspost)[] | Includes `preview`. - * news_sidebar.current_year | number | Year of the first post's publish time, or current year if no posts returned. - * news_sidebar.news_posts | [NewsPost](#newspost)[] | All posts published during `current_year`. - * news_sidebar.years | number[] | All years during which posts have been published. - * search.limit | number | Clamped limit input. - * search.sort | string | Always `published_desc`. + * Field | Type | Notes + * ------------------------- | ----------------------------- | ----- + * cursor_string | [CursorString](#cursorstring) | | + * news_posts | [NewsPost](#newspost)[] | Includes `preview`. + * news_sidebar.current_year | number | Year of the first post's publish time, or current year if no posts returned. + * news_sidebar.news_posts | [NewsPost](#newspost)[] | All posts published during `current_year`. + * news_sidebar.years | number[] | All years during which posts have been published. + * search.limit | number | Clamped limit input. + * search.sort | string | Always `published_desc`. * *
    +
    + {{ osu_trans('home.download.lazer_note') }} +
    From 6b872e79b77090afb6073e5d5f067dfc2eaecb3b Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Jan 2023 13:46:44 +0900 Subject: [PATCH 0391/1261] Update translations from crowdin --- resources/lang/ar/beatmapsets.php | 1 + resources/lang/ar/home.php | 18 +- resources/lang/ar/page_title.php | 1 + resources/lang/ar/users.php | 18 + resources/lang/be/beatmapsets.php | 1 + resources/lang/be/home.php | 18 +- resources/lang/be/page_title.php | 1 + resources/lang/be/users.php | 18 + resources/lang/bg/beatmapsets.php | 1 + resources/lang/bg/home.php | 18 +- resources/lang/bg/mail.php | 2 +- resources/lang/bg/page_title.php | 1 + resources/lang/bg/store.php | 8 +- resources/lang/bg/users.php | 18 + resources/lang/ca-ES/accounts.php | 2 +- resources/lang/ca-ES/artist.php | 2 +- resources/lang/ca-ES/authorization.php | 8 +- resources/lang/ca-ES/beatmapsets.php | 1 + resources/lang/ca-ES/home.php | 18 +- resources/lang/ca-ES/mail.php | 2 +- resources/lang/ca-ES/page_title.php | 1 + resources/lang/ca-ES/store.php | 8 +- resources/lang/ca-ES/users.php | 18 + resources/lang/cs/beatmapsets.php | 3 +- resources/lang/cs/contest.php | 2 +- resources/lang/cs/home.php | 18 +- resources/lang/cs/mail.php | 2 +- resources/lang/cs/page_title.php | 1 + resources/lang/cs/store.php | 8 +- resources/lang/cs/users.php | 22 +- resources/lang/da/beatmapsets.php | 1 + resources/lang/da/home.php | 18 +- resources/lang/da/page_title.php | 1 + resources/lang/da/users.php | 18 + resources/lang/de/accounts.php | 4 +- resources/lang/de/beatmapsets.php | 3 +- resources/lang/de/home.php | 18 +- resources/lang/de/mail.php | 2 +- resources/lang/de/page_title.php | 1 + resources/lang/de/store.php | 8 +- resources/lang/de/users.php | 20 +- resources/lang/el/artist.php | 14 +- resources/lang/el/beatmapsets.php | 1 + resources/lang/el/follows.php | 12 +- resources/lang/el/home.php | 26 +- resources/lang/el/mail.php | 10 +- resources/lang/el/multiplayer.php | 14 +- resources/lang/el/page_title.php | 1 + resources/lang/el/paypal/errors.php | 6 +- resources/lang/el/users.php | 18 + resources/lang/el/wiki.php | 6 +- resources/lang/es/beatmaps.php | 50 +-- resources/lang/es/beatmapsets.php | 1 + resources/lang/es/home.php | 18 +- resources/lang/es/mail.php | 4 +- resources/lang/es/page_title.php | 1 + resources/lang/es/paypal/errors.php | 4 +- resources/lang/es/store.php | 8 +- resources/lang/es/users.php | 18 + resources/lang/fa-IR/beatmap_discussions.php | 48 +-- resources/lang/fa-IR/beatmappacks.php | 8 +- resources/lang/fa-IR/beatmapsets.php | 1 + resources/lang/fa-IR/home.php | 18 +- resources/lang/fa-IR/page_title.php | 1 + resources/lang/fa-IR/users.php | 18 + resources/lang/fi/beatmapsets.php | 1 + resources/lang/fi/home.php | 18 +- resources/lang/fi/page_title.php | 1 + resources/lang/fi/users.php | 18 + resources/lang/fil-PH/beatmapsets.php | 1 + resources/lang/fil-PH/home.php | 18 +- resources/lang/fil-PH/mail.php | 2 +- resources/lang/fil-PH/page_title.php | 1 + resources/lang/fil-PH/store.php | 8 +- resources/lang/fil-PH/users.php | 18 + resources/lang/fr/beatmapsets.php | 1 + resources/lang/fr/home.php | 18 +- resources/lang/fr/mail.php | 2 +- resources/lang/fr/page_title.php | 1 + resources/lang/fr/store.php | 8 +- resources/lang/fr/users.php | 18 + resources/lang/he-IL/beatmapsets.php | 1 + resources/lang/he-IL/home.php | 18 +- resources/lang/he-IL/page_title.php | 1 + resources/lang/he-IL/users.php | 18 + resources/lang/hr-HR/beatmapsets.php | 1 + resources/lang/hr-HR/home.php | 18 +- resources/lang/hr-HR/page_title.php | 1 + resources/lang/hr-HR/users.php | 18 + resources/lang/hu/beatmapsets.php | 3 +- resources/lang/hu/community.php | 4 +- resources/lang/hu/contest.php | 4 +- resources/lang/hu/home.php | 18 +- resources/lang/hu/layout.php | 2 +- resources/lang/hu/mail.php | 2 +- resources/lang/hu/multiplayer.php | 2 +- resources/lang/hu/notifications.php | 2 +- resources/lang/hu/page_title.php | 1 + resources/lang/hu/scores.php | 2 +- resources/lang/hu/store.php | 8 +- resources/lang/hu/users.php | 32 +- resources/lang/id/accounts.php | 14 +- resources/lang/id/api.php | 12 +- resources/lang/id/artist.php | 2 +- resources/lang/id/authorization.php | 52 +-- resources/lang/id/beatmap_discussions.php | 6 +- resources/lang/id/beatmappacks.php | 10 +- resources/lang/id/beatmaps.php | 26 +- resources/lang/id/beatmapset_events.php | 2 +- resources/lang/id/beatmapset_watches.php | 4 +- resources/lang/id/beatmapsets.php | 37 +- resources/lang/id/changelog.php | 4 +- resources/lang/id/chat.php | 10 +- resources/lang/id/client_verifications.php | 2 +- resources/lang/id/comments.php | 4 +- resources/lang/id/common.php | 6 +- resources/lang/id/contest.php | 10 +- resources/lang/id/errors.php | 6 +- resources/lang/id/events.php | 4 +- resources/lang/id/follows.php | 2 +- resources/lang/id/forum.php | 60 ++-- resources/lang/id/home.php | 24 +- resources/lang/id/layout.php | 16 +- resources/lang/id/livestreams.php | 4 +- resources/lang/id/mail.php | 78 ++--- resources/lang/id/model_validation.php | 26 +- .../lang/id/model_validation/fulfillments.php | 2 +- .../id/model_validation/store/product.php | 4 +- resources/lang/id/notifications.php | 30 +- resources/lang/id/oauth.php | 8 +- resources/lang/id/page_title.php | 1 + resources/lang/id/password_reset.php | 2 +- resources/lang/id/paypal/errors.php | 2 +- resources/lang/id/store.php | 52 +-- resources/lang/id/tournament.php | 2 +- resources/lang/id/user_verification.php | 6 +- resources/lang/id/users.php | 66 ++-- resources/lang/id/wiki.php | 8 +- resources/lang/it/beatmapsets.php | 1 + resources/lang/it/home.php | 18 +- resources/lang/it/mail.php | 2 +- resources/lang/it/page_title.php | 1 + resources/lang/it/store.php | 8 +- resources/lang/it/users.php | 18 + resources/lang/ja/beatmapsets.php | 3 +- resources/lang/ja/home.php | 18 +- resources/lang/ja/mail.php | 2 +- resources/lang/ja/page_title.php | 1 + resources/lang/ja/store.php | 4 +- resources/lang/ja/users.php | 20 +- resources/lang/ko/beatmapsets.php | 1 + resources/lang/ko/home.php | 18 +- resources/lang/ko/mail.php | 2 +- resources/lang/ko/page_title.php | 1 + resources/lang/ko/store.php | 8 +- resources/lang/ko/users.php | 18 + resources/lang/lt-LT/accounts.php | 2 +- resources/lang/lt-LT/api.php | 4 +- resources/lang/lt-LT/artist.php | 4 +- resources/lang/lt-LT/authorization.php | 34 +- .../lang/lt-LT/beatmap_discussion_posts.php | 2 +- resources/lang/lt-LT/beatmap_discussions.php | 12 +- resources/lang/lt-LT/beatmappacks.php | 2 +- resources/lang/lt-LT/beatmaps.php | 18 +- resources/lang/lt-LT/beatmapset_events.php | 98 +++--- resources/lang/lt-LT/beatmapset_watches.php | 4 +- resources/lang/lt-LT/beatmapsets.php | 87 ++--- resources/lang/lt-LT/chat.php | 40 +-- resources/lang/lt-LT/comments.php | 6 +- resources/lang/lt-LT/common.php | 94 ++--- resources/lang/lt-LT/community.php | 104 +++--- resources/lang/lt-LT/contest.php | 4 +- resources/lang/lt-LT/follows.php | 6 +- resources/lang/lt-LT/forum.php | 328 +++++++++--------- resources/lang/lt-LT/home.php | 22 +- resources/lang/lt-LT/mail.php | 2 +- resources/lang/lt-LT/model_validation.php | 18 +- resources/lang/lt-LT/multiplayer.php | 2 +- resources/lang/lt-LT/news.php | 12 +- resources/lang/lt-LT/notifications.php | 16 +- resources/lang/lt-LT/page_title.php | 5 +- resources/lang/lt-LT/rankings.php | 2 +- resources/lang/lt-LT/report.php | 4 +- resources/lang/lt-LT/sort.php | 2 +- resources/lang/lt-LT/store.php | 8 +- resources/lang/lt-LT/users.php | 60 ++-- resources/lang/lt-LT/wiki.php | 2 +- resources/lang/lv-LV/beatmapsets.php | 1 + resources/lang/lv-LV/home.php | 18 +- resources/lang/lv-LV/page_title.php | 1 + resources/lang/lv-LV/users.php | 18 + resources/lang/ms-MY/beatmapsets.php | 1 + resources/lang/ms-MY/home.php | 18 +- resources/lang/ms-MY/page_title.php | 1 + resources/lang/ms-MY/rankings.php | 6 +- resources/lang/ms-MY/users.php | 18 + resources/lang/nl/beatmapsets.php | 1 + resources/lang/nl/home.php | 18 +- resources/lang/nl/page_title.php | 1 + resources/lang/nl/store.php | 8 +- resources/lang/nl/users.php | 18 + resources/lang/no/artist.php | 4 +- resources/lang/no/beatmapsets.php | 5 +- resources/lang/no/events.php | 6 +- resources/lang/no/forum.php | 10 +- resources/lang/no/home.php | 18 +- resources/lang/no/page_title.php | 1 + resources/lang/no/store.php | 4 +- resources/lang/no/users.php | 26 +- resources/lang/pl/beatmapsets.php | 1 + resources/lang/pl/home.php | 18 +- resources/lang/pl/mail.php | 2 +- resources/lang/pl/page_title.php | 1 + resources/lang/pl/store.php | 8 +- resources/lang/pl/users.php | 18 + resources/lang/pt-br/beatmapsets.php | 1 + resources/lang/pt-br/home.php | 18 +- resources/lang/pt-br/mail.php | 2 +- resources/lang/pt-br/page_title.php | 1 + resources/lang/pt-br/store.php | 8 +- resources/lang/pt-br/users.php | 18 + resources/lang/pt/beatmapsets.php | 1 + resources/lang/pt/home.php | 18 +- resources/lang/pt/mail.php | 2 +- resources/lang/pt/page_title.php | 1 + resources/lang/pt/store.php | 8 +- resources/lang/pt/users.php | 18 + resources/lang/ro/beatmapsets.php | 1 + resources/lang/ro/home.php | 18 +- resources/lang/ro/mail.php | 2 +- resources/lang/ro/page_title.php | 1 + resources/lang/ro/store.php | 10 +- resources/lang/ro/users.php | 18 + resources/lang/ru/beatmaps.php | 8 +- resources/lang/ru/beatmapset_events.php | 4 +- resources/lang/ru/beatmapsets.php | 7 +- resources/lang/ru/contest.php | 4 +- resources/lang/ru/events.php | 2 +- resources/lang/ru/forum.php | 2 +- resources/lang/ru/home.php | 18 +- resources/lang/ru/layout.php | 2 +- resources/lang/ru/mail.php | 2 +- resources/lang/ru/oauth.php | 2 +- resources/lang/ru/page_title.php | 1 + resources/lang/ru/store.php | 8 +- resources/lang/ru/users.php | 42 ++- resources/lang/si-LK/beatmapsets.php | 1 + resources/lang/si-LK/home.php | 18 +- resources/lang/si-LK/page_title.php | 1 + resources/lang/si-LK/users.php | 18 + resources/lang/sk/beatmapsets.php | 1 + resources/lang/sk/home.php | 18 +- resources/lang/sk/page_title.php | 1 + resources/lang/sk/users.php | 18 + resources/lang/sl-SI/beatmapsets.php | 1 + resources/lang/sl-SI/home.php | 18 +- resources/lang/sl-SI/mail.php | 2 +- resources/lang/sl-SI/page_title.php | 1 + resources/lang/sl-SI/store.php | 8 +- resources/lang/sl-SI/users.php | 18 + resources/lang/sr-SP/beatmapsets.php | 1 + resources/lang/sr-SP/forum.php | 18 +- resources/lang/sr-SP/home.php | 18 +- resources/lang/sr-SP/mail.php | 10 +- resources/lang/sr-SP/model_validation.php | 24 +- resources/lang/sr-SP/page_title.php | 1 + resources/lang/sr-SP/store.php | 8 +- resources/lang/sr-SP/users.php | 20 +- resources/lang/sv/beatmapsets.php | 1 + resources/lang/sv/home.php | 18 +- resources/lang/sv/page_title.php | 1 + resources/lang/sv/store.php | 2 +- resources/lang/sv/users.php | 18 + resources/lang/tg-TJ/beatmapsets.php | 1 + resources/lang/tg-TJ/home.php | 18 +- resources/lang/tg-TJ/page_title.php | 1 + resources/lang/tg-TJ/users.php | 18 + resources/lang/th/beatmapsets.php | 1 + resources/lang/th/home.php | 18 +- resources/lang/th/page_title.php | 1 + resources/lang/th/users.php | 18 + resources/lang/tr/artist.php | 2 +- resources/lang/tr/beatmaps.php | 2 +- resources/lang/tr/beatmapsets.php | 1 + resources/lang/tr/contest.php | 2 +- resources/lang/tr/forum.php | 4 +- resources/lang/tr/home.php | 18 +- resources/lang/tr/mail.php | 2 +- resources/lang/tr/multiplayer.php | 4 +- resources/lang/tr/notifications.php | 6 +- resources/lang/tr/page_title.php | 1 + resources/lang/tr/store.php | 8 +- resources/lang/tr/users.php | 22 +- resources/lang/uk/beatmapsets.php | 1 + resources/lang/uk/comments.php | 2 +- resources/lang/uk/home.php | 18 +- resources/lang/uk/mail.php | 4 +- resources/lang/uk/page_title.php | 1 + resources/lang/uk/store.php | 22 +- resources/lang/uk/user_verification.php | 2 +- resources/lang/uk/users.php | 36 +- resources/lang/uk/wiki.php | 2 +- resources/lang/vi/beatmapsets.php | 1 + resources/lang/vi/forum.php | 2 +- resources/lang/vi/home.php | 18 +- resources/lang/vi/mail.php | 2 +- resources/lang/vi/page_title.php | 1 + resources/lang/vi/store.php | 8 +- resources/lang/vi/users.php | 18 + resources/lang/zh-tw/beatmapsets.php | 1 + resources/lang/zh-tw/home.php | 18 +- resources/lang/zh-tw/page_title.php | 1 + resources/lang/zh-tw/users.php | 18 + resources/lang/zh/beatmapsets.php | 1 + resources/lang/zh/home.php | 18 +- resources/lang/zh/mail.php | 2 +- resources/lang/zh/page_title.php | 1 + resources/lang/zh/store.php | 8 +- resources/lang/zh/users.php | 18 + 319 files changed, 2538 insertions(+), 1278 deletions(-) diff --git a/resources/lang/ar/beatmapsets.php b/resources/lang/ar/beatmapsets.php index ce594a25eb0..985980fea1d 100644 --- a/resources/lang/ar/beatmapsets.php +++ b/resources/lang/ar/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'قم بتسجيل الدخول لتفضيل هذه الخريطة', 'logged-out' => 'تحتاج إلى تسجيل الدخول قبل تنزيل أي خريطة!', 'mapped_by' => 'نشأت بواسطة :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'إلغاء تفضيل هذه الخريطة', 'updated_timeago' => 'آخر تحديث :timeago', diff --git a/resources/lang/ar/home.php b/resources/lang/ar/home.php index 3f5bf7af0f7..00599cd2fcb 100644 --- a/resources/lang/ar/home.php +++ b/resources/lang/ar/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "لنجعلك
    مستعداََ!", 'action' => 'حمل osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'مستخدمين MacOS', + 'mirror' => 'مُباشر', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "لنجعلك
    مستعداََ!", + 'video-guide' => 'دليل الفديو', 'help' => [ '_' => 'إذا كان لديك مشكلة في بدء اللعبة أو انشاء حساب، :help_forum_link أو :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'لنظام التشغل MacOS', 'linux' => 'لنظام التشغيل Linux', ], - 'mirror' => 'مُباشر', - 'macos-fallback' => 'مستخدمين MacOS', 'steps' => [ 'register' => [ 'title' => 'احصل على حساب', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'دليل الفديو', ], 'user' => [ diff --git a/resources/lang/ar/page_title.php b/resources/lang/ar/page_title.php index 80ca1aea753..887deb9fcac 100644 --- a/resources/lang/ar/page_title.php +++ b/resources/lang/ar/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'معلومات اللاعب', + 'create' => '', 'disabled' => 'ملحوظة', ], 'wiki_controller' => [ diff --git a/resources/lang/ar/users.php b/resources/lang/ar/users.php index 864a35ef551..9a817e75a77 100644 --- a/resources/lang/ar/users.php +++ b/resources/lang/ar/users.php @@ -52,6 +52,22 @@ 'send_message' => 'إرسال رسالة', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'اه-اوه! يبدو انه قد تم تعطيل حسابك.', 'warning' => "في حالة مخالفَتِكَ لِقاعِدة, خذ بعين الاِعتبار ان هنالك حظر لمدة شهر واحد لم يكون ضمنه اي طلبات عفو. بعد هذه المدة, قد يكون من الضرورة مراسلتنا. برجاء الاِنتباه الى ان انشاءكَ لحِساب في هذه الفترة سيؤدي الى زيادة في فترة حظر الشهر الواحد. يرجى الاِنتباه ايضاََ الى ان كل حساب تنشأهُ, فأِنك تنتهك القوانين اكثر. ننصحك وبشدة ان لا تتجه لهذا المسار المظلم!", @@ -451,6 +467,8 @@ 'offline' => 'غير متصل', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'انشأ المستخدم', ], 'verify' => [ diff --git a/resources/lang/be/beatmapsets.php b/resources/lang/be/beatmapsets.php index d49a65e19e5..ba9f3fa8b3b 100644 --- a/resources/lang/be/beatmapsets.php +++ b/resources/lang/be/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Увайдзіце, каб дадаць бітмапу ў абраныя', 'logged-out' => 'Каб спампаваць нейкую бітмапу, вам трэба ўвайсці!', 'mapped_by' => 'створана :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Выдаліць з абраных', 'updated_timeago' => 'абноўлены :timeago', diff --git a/resources/lang/be/home.php b/resources/lang/be/home.php index b76fc6a9b24..e1ff348f5d0 100644 --- a/resources/lang/be/home.php +++ b/resources/lang/be/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "давай
    распачнем!", 'action' => 'Спампаваць osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'для macOS', + 'mirror' => 'люстэрка', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "давай
    распачнем!", + 'video-guide' => 'відэа дапаможнік', 'help' => [ '_' => 'калі ў вас узніклі праблемы з пачаткам гульні альбо рэгістрацыяй уліковага запісу, :help_forum_link або :support_button. ', @@ -86,8 +99,6 @@ 'macos' => 'для macOS', 'linux' => 'для Linux', ], - 'mirror' => 'люстэрка', - 'macos-fallback' => 'для macOS', 'steps' => [ 'register' => [ 'title' => 'стварыце ўлік. запіс', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'відэа дапаможнік', ], 'user' => [ diff --git a/resources/lang/be/page_title.php b/resources/lang/be/page_title.php index 5359f0557c5..153f38c4a3b 100644 --- a/resources/lang/be/page_title.php +++ b/resources/lang/be/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'інфармацыя пра гульца', + 'create' => '', 'disabled' => 'звярніце ўвагу', ], 'wiki_controller' => [ diff --git a/resources/lang/be/users.php b/resources/lang/be/users.php index 904e2794f2c..ef551a23125 100644 --- a/resources/lang/be/users.php +++ b/resources/lang/be/users.php @@ -52,6 +52,22 @@ 'send_message' => 'адправіць паведамленне', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'А-а-а! Здаецца, ваш уліковы запіс быў адключаны.', 'warning' => "Калі вы парушылі правіла, звярніце ўвагу, што, як правіла, існуе перыяд ахаладжэння ў месяц, на працягу якога мы не будзем разглядаць просьбы аб амністыі. Па заканчэнні гэтага перыуду вы можаце звязацца з намі, калі палічыце патрэбным. Звярніце ўвагу, што стварэнне новых уліковых запісаў пасля адключэння прывядзе да падаўжэння гэтага месячнага астуджэння . Таксама звярніце ўвагу, што для кожнага ўліковага запісу вы ў далейшым парушаеце правілы . Мы настойліва раім вам не ісці па гэтым шляху!", @@ -451,6 +467,8 @@ 'offline' => 'Не ў сетцы', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Карыстальнік створаны', ], 'verify' => [ diff --git a/resources/lang/bg/beatmapsets.php b/resources/lang/bg/beatmapsets.php index 69d8e395fd2..af45dc08c67 100644 --- a/resources/lang/bg/beatmapsets.php +++ b/resources/lang/bg/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Влез, за добавяне в любими', 'logged-out' => 'Моля, влез в профила си, за изтегляне на бийтмапове!', 'mapped_by' => 'създаден от :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'премахване от Любими', 'updated_timeago' => 'последно актуализиран :timeago', diff --git a/resources/lang/bg/home.php b/resources/lang/bg/home.php index 749fa2672f2..a332dc0ae8b 100644 --- a/resources/lang/bg/home.php +++ b/resources/lang/bg/home.php @@ -72,9 +72,22 @@ ], 'download' => [ + 'action' => 'Изтегли osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS потребители', + 'mirror' => 'алтернативна връзка', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', 'tagline' => "нека ви помогнем
    да започнете!", - 'action' => 'Изтегли osu!', + 'video-guide' => 'видео ръководство', 'help' => [ '_' => 'при проблем със стартиране на играта или регистриране на профил, посетете :help_forum_link или :support_button.', @@ -87,8 +100,6 @@ 'macos' => 'за macOS', 'linux' => 'за Linux', ], - 'mirror' => 'алтернативна връзка', - 'macos-fallback' => 'macOS потребители', 'steps' => [ 'register' => [ 'title' => 'създай акаунт', @@ -106,7 +117,6 @@ ], ], ], - 'video-guide' => 'видео ръководство', ], 'user' => [ diff --git a/resources/lang/bg/mail.php b/resources/lang/bg/mail.php index be0d7ad630e..685f6a016be 100644 --- a/resources/lang/bg/mail.php +++ b/resources/lang/bg/mail.php @@ -70,7 +70,7 @@ 'duration' => 'Благодарение на тях имате достъп до osu!direct и още други osu!supporter привилегии за следващите :duration.', 'features' => 'Може да откриете повече информация на тези функционалности тук:', 'gifted' => 'Някой току що ви подари osu!supporter tag!', - 'gift_message' => '', + 'gift_message' => 'Лицето което ви подари този етикет остави следното съобщение:', 'subject' => 'Подариха ви osu!supporter!', ], diff --git a/resources/lang/bg/page_title.php b/resources/lang/bg/page_title.php index 60e4a47476f..fd47f3d860d 100644 --- a/resources/lang/bg/page_title.php +++ b/resources/lang/bg/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'инфо за играч', + 'create' => '', 'disabled' => 'известие', ], 'wiki_controller' => [ diff --git a/resources/lang/bg/store.php b/resources/lang/bg/store.php index 3627b9279eb..e87650af648 100644 --- a/resources/lang/bg/store.php +++ b/resources/lang/bg/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Кликнете тук, за да го редактирате.', 'declined' => 'Плащането е отменено.', 'delayed_shipping' => 'В момента сме затрупани с поръчки! Добре дошли сте да пуснете вашата поръчка, но очаквайте **допълнително 1-2 седмици закъснение**, докато наваксаме с вече съществуващите поръчки.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Скриване на всички osu!supporter етикети в тази поръчка от моята активност', 'old_cart' => 'Вашата количка изглежда е с изтекъл срок и бе възобновена, моля опитайте отново.', 'pay' => 'Плащане с PayPal', 'title_compact' => 'разплащане', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Вие заплатихте чрез eCheck, което може да отнеме до 10 дена от страна на PayPal за потвърждение на плащането!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter етикетите от тази поръчка не са показани в активността ви.', 'title_compact' => 'фактура', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Съобщение: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'подари на играч', - 'gift_message' => '', + 'gift_message' => 'съобщение по избор към подаръка! (до :length символа)', 'require_login' => [ '_' => 'Моля, :link, за да закупите osu!supporter !', diff --git a/resources/lang/bg/users.php b/resources/lang/bg/users.php index 737cd2896ba..c17daaf1f45 100644 --- a/resources/lang/bg/users.php +++ b/resources/lang/bg/users.php @@ -52,6 +52,22 @@ 'send_message' => 'изпрати съобщение', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'О, не! Изглежда, че вашият профил е деактивиран.', 'warning' => "В случай, че нарушите правило, имайте предвид, че съществува период на изчакване с продължителност един месец, през който няма да разгледаме вашата молба. След изтичане на този период, свободни сте да се свържите с нас в случай на необходимост. Създаване на нови акаунти след деактивиране на един, ще доведе до удължаване на този едномесечен период.. Със създаването на всеки един нов акаунт, вие допълнително нарушавате правилата. Силно се надяваме да се вслушате в думите ни!", @@ -451,6 +467,8 @@ 'offline' => 'Офлайн', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Потребител създаден', ], 'verify' => [ diff --git a/resources/lang/ca-ES/accounts.php b/resources/lang/ca-ES/accounts.php index f73b53bb91e..f10071f6d3b 100644 --- a/resources/lang/ca-ES/accounts.php +++ b/resources/lang/ca-ES/accounts.php @@ -95,7 +95,7 @@ ], 'privacy' => [ - 'friends_only' => 'bloca els missatges privats de persones que no són a la llista d\'amics', + 'friends_only' => 'bloquejar els missatges privats de persones que no són a la llista d\'amics', 'hide_online' => 'amaga la teva presència en línia', 'title' => 'Privadesa', ], diff --git a/resources/lang/ca-ES/artist.php b/resources/lang/ca-ES/artist.php index d2f756a9e81..795fa933c00 100644 --- a/resources/lang/ca-ES/artist.php +++ b/resources/lang/ca-ES/artist.php @@ -18,7 +18,7 @@ ], 'index' => [ - 'description' => 'Els artistes destacats són artistes amb qui col·laborem per brindar-li música nova i original a osu!. Aquests artistes i una selecció dels seus treballs han estat escollits per l\'equip d\'osu! per ser genials i adequats per a mapping. Alguns d\'aquests artistes destacats també van crear noves cançons exclusives per al seu ús a osu!.

    Totes les cançons en aquesta secció són proporcionades com a fitxers .osz amb ritme prèviament calculat i han estat llicenciades oficialment per al seu ús en osu! i contingut relacionat amb osu!.', + 'description' => 'Els artistes destacats són artistes amb els quals col·laborem per a brindar-li música nova i original a osu!. Aquests artistes i una selecció dels seus treballs han estat triats per l\'equip de osu! per ser genials i adequats per a mapping. Alguns d\'aquests artistes destacats també van crear noves cançons exclusives per al seu ús en osu!.

    Totes les cançons en aquesta secció són proporcionades com a arxius .osz amb ritme prèviament calculat i han estat llicenciades oficialment per al seu ús en osu! i contingut relacionat amb osu!.', ], 'links' => [ diff --git a/resources/lang/ca-ES/authorization.php b/resources/lang/ca-ES/authorization.php index c51ae3ced7d..cfa5fda30b7 100644 --- a/resources/lang/ca-ES/authorization.php +++ b/resources/lang/ca-ES/authorization.php @@ -41,7 +41,7 @@ 'beatmap_discussion_post' => [ 'destroy' => [ 'not_owner' => 'Només podeu eliminar les vostres publicacions.', - 'resolved' => 'No podeu eliminar una publicació d\'una discussió resolta.', + 'resolved' => 'No podeu suprimir una publicació d\'una discussió resolta.', 'system_generated' => 'La publicació generada automàticament no es pot eliminar.', ], @@ -68,9 +68,9 @@ 'friends_only' => 'L\'usuari està bloquejant missatges de persones que no estan a la seva llista d\'amics.', 'moderated' => 'Aquest canal està actualment moderat.', 'no_access' => 'No tens accés a aquest canal.', - 'receive_friends_only' => 'És possible que l\'usuari no pugui respondre perquè només accepteu missatges de persones de la vostra llista d\'amics.', - 'restricted' => 'No pots enviar missatges mentre estiguis silenciat, restringit o prohibit.', - 'silenced' => 'No pots enviar missatges mentre estiguis silenciat, restringit o prohibit.', + 'receive_friends_only' => 'És possible que l\'usuari no pugui respondre perquè només accepta missatges de persones de la llista d\'amics.', + 'restricted' => 'No podeu enviar missatges mentre estigui silenciat, restringit o banejat.', + 'silenced' => 'No podeu enviar missatges mentre estigui silenciat, restringit o banejat.', ], 'comment' => [ diff --git a/resources/lang/ca-ES/beatmapsets.php b/resources/lang/ca-ES/beatmapsets.php index 8b0fb80a51f..f50eb186975 100644 --- a/resources/lang/ca-ES/beatmapsets.php +++ b/resources/lang/ca-ES/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Inicia sessió per a guardar el beatmap a favorits', 'logged-out' => 'Necessites iniciar sessió abans de descarregar qualsevol beatmap!', 'mapped_by' => 'mapejat per :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Desmarcar com a favorit', 'updated_timeago' => 'actualitzat per últim cop :timeago', diff --git a/resources/lang/ca-ES/home.php b/resources/lang/ca-ES/home.php index debebc6edad..9af05547d70 100644 --- a/resources/lang/ca-ES/home.php +++ b/resources/lang/ca-ES/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "endavant
    comencem!", 'action' => 'Descarrega l\'osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'usuaris de macOS', + 'mirror' => 'enllaç alternatiu', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "endavant
    comencem!", + 'video-guide' => 'guia en vídeo', 'help' => [ '_' => 'si trobes un problema començant el joc o registrant un compte, :help_forum_link o :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'per a macOS', 'linux' => 'per a Linux', ], - 'mirror' => 'enllaç alternatiu', - 'macos-fallback' => 'usuaris de macOS', 'steps' => [ 'register' => [ 'title' => 'crea un compte', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'guia en vídeo', ], 'user' => [ diff --git a/resources/lang/ca-ES/mail.php b/resources/lang/ca-ES/mail.php index 8ad5b66e763..2cc7b63c096 100644 --- a/resources/lang/ca-ES/mail.php +++ b/resources/lang/ca-ES/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Gràcies a aquesta persona, vostè té accés a osu!direct i altres beneficis d\'osu!supporter durant :duration.', 'features' => 'Pots trobar més detalls sobre aquests beneficis aquí:', 'gifted' => 'Algú t\'ha regalat l\'etiqueta d\'osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'La persona que t\'ha regalat aquesta etiqueta t\'ha deixat un missatge:', 'subject' => 'Algú t\'ha regalat l\'etiqueta d\'osu!supporter!', ], diff --git a/resources/lang/ca-ES/page_title.php b/resources/lang/ca-ES/page_title.php index 1d4bf8d2a6a..c8d9eea6345 100644 --- a/resources/lang/ca-ES/page_title.php +++ b/resources/lang/ca-ES/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informació del jugador', + 'create' => '', 'disabled' => 'avís', ], 'wiki_controller' => [ diff --git a/resources/lang/ca-ES/store.php b/resources/lang/ca-ES/store.php index 224b34ba6d2..6be84bf8667 100644 --- a/resources/lang/ca-ES/store.php +++ b/resources/lang/ca-ES/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Fes clic aquí per a editar-ho.', 'declined' => 'El pagament s\'ha cancel·lat.', 'delayed_shipping' => 'Ara mateix no podem atendre totes les comandes! La teva compra és benvinguda, però considera un **retard addicional de 1-2 setmanes** mentre ens posem al dia amb les comandes actuals.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Amaga totes les etiquetes osu!supporter en aquesta ordre de la meva activitat', 'old_cart' => 'La vostra cistella sembla desactualitzada i s\'ha reiniciat, torna-ho a intentar.', 'pay' => 'Pagament amb Paypal', 'title_compact' => 'pagament', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Com que el seu pagament va ser un eCheck, si us plau permeti fins a 10 dies addicionals perquè el pagament es faci a través de PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Les etiquetes d\'osu!supporter en aquesta ordre no es mostren a les vostres activitats recents.', 'title_compact' => 'factura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Missatge: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'regalar a un jugador', - 'gift_message' => '', + 'gift_message' => 'afegeix un missatge opcional al teu regal! (fins a :length caràcters)', 'require_login' => [ '_' => 'Has de ser :link per obtenir una etiqueta d\'osu!supporter!', diff --git a/resources/lang/ca-ES/users.php b/resources/lang/ca-ES/users.php index 904a82126f0..24a672feddd 100644 --- a/resources/lang/ca-ES/users.php +++ b/resources/lang/ca-ES/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Enviar missatge', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Vaja! Sembla que el teu compte ha estat desactivat.', 'warning' => "En cas que hi hagi trencat una regla, tingueu en compte que generalment hi ha un període d'espera d'un mes durant el qual no considerarem cap sol·licitud d'amnistia. Després d'aquest període, podeu contactar amb nosaltres si ho considereu necessari. Tingueu en compte que la creació de comptes nous després d'haver tingut un desactivat resultarà en una extensió d'aquest període d'espera d'un mes. Si us plau, també tingueu en compte que per cada compte que creeu, estarà violant més regles. Us suggerim que no seguiu aquest camí!", @@ -451,6 +467,8 @@ 'offline' => 'Sense connexió', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Usuari creat', ], 'verify' => [ diff --git a/resources/lang/cs/beatmapsets.php b/resources/lang/cs/beatmapsets.php index a7bd805818d..b86443f0c5d 100644 --- a/resources/lang/cs/beatmapsets.php +++ b/resources/lang/cs/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Pro přidání beatmapy do oblíbených se přihlas', 'logged-out' => 'Pro stahování beatmap musíš být přihlášen!', 'mapped_by' => 'beatmapu vytvořil :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Odebrat z mých oblíbených', 'updated_timeago' => 'naposledy aktualizováno :timeago', @@ -124,7 +125,7 @@ 'genre' => 'Žánr', 'language' => 'Jazyk', 'no_scores' => 'Data se vypočítávají...', - 'nominators' => '', + 'nominators' => 'Nominátoři', 'nsfw' => 'Explicitní obsah', 'offset' => 'Online offset', 'points-of-failure' => 'Body neúspěchů', diff --git a/resources/lang/cs/contest.php b/resources/lang/cs/contest.php index c2748a1e686..2f12754188a 100644 --- a/resources/lang/cs/contest.php +++ b/resources/lang/cs/contest.php @@ -50,7 +50,7 @@ 'beatmap' => 'Pouze .osu soubory jsou přijímány pro tuto soutěž.', 'music' => 'Pouze .mp3 soubory jsou přijímány pro tuto soutěž.', ], - 'wrong_dimensions' => '', + 'wrong_dimensions' => 'Příspěvky do soutěže musí mít rozměry :widthx:height', 'too_big' => 'Možné vstupy pro tuto soutěž jsou :limit-krát.', ], 'beatmaps' => [ diff --git a/resources/lang/cs/home.php b/resources/lang/cs/home.php index c1cb3019ac0..552882be469 100644 --- a/resources/lang/cs/home.php +++ b/resources/lang/cs/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "pusťme se
    do toho!", 'action' => 'Stáhnout osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS uživatelé', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "pusťme se
    do toho!", + 'video-guide' => 'videonávod', 'help' => [ '_' => 'pokud máš problém se spuštěním hry nebo registrací účtu, tak :help_forum_link nebo :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'pro macOS', 'linux' => 'pro Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS uživatelé', 'steps' => [ 'register' => [ 'title' => 'založte si účet', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'videonávod', ], 'user' => [ diff --git a/resources/lang/cs/mail.php b/resources/lang/cs/mail.php index df6dd3340bf..57277af36aa 100644 --- a/resources/lang/cs/mail.php +++ b/resources/lang/cs/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Díky nim máte přístup k osu!direct a dalším osu!supporter výhod na další :duration.', 'features' => 'Více informací o těchto funkcích naleznete zde:', 'gifted' => 'Někdo vám právě daroval osu!supporter tag!', - 'gift_message' => '', + 'gift_message' => 'K tomuto dárku byla napsaná tato zpráva:', 'subject' => 'Dostal si status osu!podporovatele jako dárek!', ], diff --git a/resources/lang/cs/page_title.php b/resources/lang/cs/page_title.php index a29227eb546..f2b95646787 100644 --- a/resources/lang/cs/page_title.php +++ b/resources/lang/cs/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informace o hráči', + 'create' => '', 'disabled' => 'oznámení', ], 'wiki_controller' => [ diff --git a/resources/lang/cs/store.php b/resources/lang/cs/store.php index fc6653d9c74..703e849e302 100644 --- a/resources/lang/cs/store.php +++ b/resources/lang/cs/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Pro editaci klikni sem.', 'declined' => 'Tvá platba byla zrušena.', 'delayed_shipping' => 'V tuto chvíli jsme zahlceni objednávkami! Svou objednávku můžeš umístit, ale počítej prosím s **dalšími 1-2 týdny zpoždění** zatímco dokončíme už existující objednávky.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Schovat všechny osu!supporter tagy v této objednávce z mých aktivit', 'old_cart' => 'Obsah tvého košíku se zdá být zastaralý a proto byl znovu načten, zkus to prosím znovu.', 'pay' => 'Zaplatit přes PayPal', 'title_compact' => 'zaplatit', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Jelikož vaše platba byla prováděna službou eCheck, prosím, dejte nám až 10 dní na to, aby platba úspěšně prošla přes PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter tagy v této objednávce se nebudou zobrazovat v nedávných aktivitách.', 'title_compact' => 'faktura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Zpráva: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'darovat hráči', - 'gift_message' => '', + 'gift_message' => 'přidat volitelnou zprávu k dárku! (maximálně :length znaků)', 'require_login' => [ '_' => 'Pro obdržení štítku podporovatele se musíš :link!', diff --git a/resources/lang/cs/users.php b/resources/lang/cs/users.php index c9cde712262..64863ef9087 100644 --- a/resources/lang/cs/users.php +++ b/resources/lang/cs/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Odeslat zprávu', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Ale ne! Vypadá to, že váš účet byl zablokován.', 'warning' => "V případě porušení pravidla, Vezměte prosím na vědomí, že obecně existuje lhůta jednoho měsíce, během níž nebudeme zvažovat žádné žádosti o amnestii. Po tomto období nás můžete kontaktovat, pokud to považujete za nezbytné. Vezměte prosím v potaz, že vytvořením nových účtů poté, co budete mít jeden deaktivovaný, dojde k prodloužení jedno měsíčné lhůty. Vezměte prosím na vědomí, že pro každý účet, který vytváříte, dále porušujete pravidla. Velmi doporučujeme, abyste se touto cestou neubírali!", @@ -218,7 +234,7 @@ 'title' => 'Oblíbené Beatmapy', ], 'nominated' => [ - 'title' => '', + 'title' => 'Nominované Hodnocené Beatmapy', ], 'pending' => [ 'title' => 'Čekající Beatmapy', @@ -417,7 +433,7 @@ 'country_simple' => 'Místní hodnocení', 'global' => 'Globální pozice pro :mode', 'global_simple' => 'Světové hodnocení', - 'highest' => '', + 'highest' => 'Nejvyšší rank :rank v :date', ], 'stats' => [ 'hit_accuracy' => 'Přesnost zásahů', @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Uživatelem vytvořen', ], 'verify' => [ diff --git a/resources/lang/da/beatmapsets.php b/resources/lang/da/beatmapsets.php index e7a1efe9607..e06bf1974bf 100644 --- a/resources/lang/da/beatmapsets.php +++ b/resources/lang/da/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Log ind for at favorisere dette beatmap', 'logged-out' => 'Du skal være logget ind for at kunne downloade beatmaps!', 'mapped_by' => 'mappet af :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Fjern dette beatmapset fra dine favoritter', 'updated_timeago' => 'sidst opdateret :timeago', diff --git a/resources/lang/da/home.php b/resources/lang/da/home.php index bd2a4746b86..6b2f3f8f531 100644 --- a/resources/lang/da/home.php +++ b/resources/lang/da/home.php @@ -74,8 +74,21 @@ ], 'download' => [ - 'tagline' => "lad os få
    dig i gang!", 'action' => 'Download osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS brugere', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "lad os få
    dig i gang!", + 'video-guide' => 'video-guide', 'help' => [ '_' => 'hvis du har problemer med at starte spillet eller registrere dig for konto, :help_forum_link eller :support_button.', @@ -88,8 +101,6 @@ 'macos' => 'til macOS', 'linux' => 'til Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS brugere', 'steps' => [ 'register' => [ 'title' => 'opret en bruger', @@ -107,7 +118,6 @@ ], ], ], - 'video-guide' => 'video-guide', ], 'user' => [ diff --git a/resources/lang/da/page_title.php b/resources/lang/da/page_title.php index ca552ad6dda..79f3c1abc8c 100644 --- a/resources/lang/da/page_title.php +++ b/resources/lang/da/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'spiller info', + 'create' => '', 'disabled' => 'notits', ], 'wiki_controller' => [ diff --git a/resources/lang/da/users.php b/resources/lang/da/users.php index 0ac1dbde00f..f53a9ec024b 100644 --- a/resources/lang/da/users.php +++ b/resources/lang/da/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Send besked', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh-oh! Det ser ud som om din account er blevet midlertidigt lukket.', 'warning' => "I tilfælde af at du har brudt en regel, bør du vide at der er en cool-down periode på en måned hvori vi ikke vil overveje nogen former for forespørgsler om lempelser eller ophævninger. Efter denne periode kan du kontakte os igen hvis du føler det er nødvendigt. Bemærk, hvis du laver flere konti efter at have fået en lukket vil det resultere i en forlængelse af din ene måneds cool-down. Bemærk også at for hver account du laver, bryder du reglerne yderligere. Vi anbefaler stærkt at du ikke gør dette!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Bruger Oprettet', ], 'verify' => [ diff --git a/resources/lang/de/accounts.php b/resources/lang/de/accounts.php index b5d09013969..6c77ac73f07 100644 --- a/resources/lang/de/accounts.php +++ b/resources/lang/de/accounts.php @@ -49,7 +49,7 @@ 'notifications' => [ 'beatmapset_discussion_qualified_problem' => 'erhalte benachrichtigungen für neue probleme auf qualifizierten beatmaps der folgenden modi', 'beatmapset_disqualify' => 'erhalte benachrichtigungen, wenn beatmaps der folgenden modi disqualifiziert werden', - 'comment_reply' => 'erhalte Benachrichtigungen für antworten auf deine Kommentare', + 'comment_reply' => 'Erhalte Benachrichtigungen für Antworten auf deine Kommentare', 'title' => 'Benachrichtigungen', 'topic_auto_subscribe' => 'automatisch benachrichtigungen zu den von dir erstellten forenthreads aktivieren', @@ -63,7 +63,7 @@ 'mail' => 'mail', 'mapping' => 'beatmap-mapper', 'push' => 'push', - 'user_achievement_unlock' => 'medaille freigeschaltet', + 'user_achievement_unlock' => 'Medaille freigeschaltet', ], ], diff --git a/resources/lang/de/beatmapsets.php b/resources/lang/de/beatmapsets.php index a2db9039406..63d7d230369 100644 --- a/resources/lang/de/beatmapsets.php +++ b/resources/lang/de/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Melde dich an, um diese Beatmap zu favorisieren', 'logged-out' => 'Zum Herunterladen von Beatmaps muss man eingeloggt sein!', 'mapped_by' => 'erstellt von :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Dieses Beatmapset von deinen Favoriten entfernen', 'updated_timeago' => 'zuletzt aktualisiert :timeago', @@ -124,7 +125,7 @@ 'genre' => 'Genre', 'language' => 'Sprache', 'no_scores' => 'Die Daten werden noch verarbeitet...', - 'nominators' => '', + 'nominators' => 'Nominatoren', 'nsfw' => 'Expliziter Inhalt', 'offset' => 'Online-Offset', 'points-of-failure' => 'Stellen, an denen Spieler gescheitert sind', diff --git a/resources/lang/de/home.php b/resources/lang/de/home.php index 8295eae8da9..8f79fd5387c 100644 --- a/resources/lang/de/home.php +++ b/resources/lang/de/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "lass uns
    loslegen!", 'action' => 'osu! herunterladen', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS-benutzer', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "lass uns
    loslegen!", + 'video-guide' => 'Videoanleitung (Englisch)', 'help' => [ '_' => 'wenn du probleme mit dem starten des spiels oder der registrierung deines accounts hast, :help_forum_link oder :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'für macOS', 'linux' => 'für Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS-benutzer', 'steps' => [ 'register' => [ 'title' => 'erstell einen account', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'Videoanleitung (Englisch)', ], 'user' => [ diff --git a/resources/lang/de/mail.php b/resources/lang/de/mail.php index c4ba54dd673..21b84bb8cd3 100644 --- a/resources/lang/de/mail.php +++ b/resources/lang/de/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Dank ihnen hast Du Zugriff auf osu!direct und andere osu!supporter-Vorteile für die nächsten :duration.', 'features' => 'Weitere Details zu diesen Funktionen findest Du hier:', 'gifted' => 'Jemand hat Dir gerade ein osu!supporter-Tag geschenkt!', - 'gift_message' => '', + 'gift_message' => 'Die Person, die dir dieses Tag geschenkt hat, hat dir eine Nachricht hinterlassen:', 'subject' => 'Dir wurde ein osu!supporter-Tag geschenkt!', ], diff --git a/resources/lang/de/page_title.php b/resources/lang/de/page_title.php index 2f33bd3ead6..8c0a953e31b 100644 --- a/resources/lang/de/page_title.php +++ b/resources/lang/de/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'spieler-info', + 'create' => '', 'disabled' => 'notiz', ], 'wiki_controller' => [ diff --git a/resources/lang/de/store.php b/resources/lang/de/store.php index 002e125cc7a..82045ed72a7 100644 --- a/resources/lang/de/store.php +++ b/resources/lang/de/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Klick hier, um ihn zu bearbeiten.', 'declined' => 'Der Bezahlvorgang wurde abgebrochen.', 'delayed_shipping' => 'Wir sind momentan etwas mit Bestellungen überfordert! Wir nehmen weiterhin Bestellungen an, allerdings muss mit **zusätzlichen 1-2 Wochen Verzögerung** gerechnet werden, während die aktuellen Bestellungen aufgearbeitet werden.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Alle osu!supporter-Tags in dieser Bestellung aus meiner Aktivität ausblenden', 'old_cart' => 'Dein Warenkorb war nicht aktuell und wurde erneut geladen, bitte versuche es erneut.', 'pay' => 'Mit Paypal bezahlen', 'title_compact' => 'zur Kasse', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Da es sich bei deiner Zahlung um einen eCheck handelt, kannst du bis zu 10 zusätzliche Tage einplanen, um die Zahlung über PayPal abzuwickeln!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter-Tags in dieser Bestellung werden nicht in deinen letzten Aktivitäten angezeigt.', 'title_compact' => 'rechnung', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Nachricht: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'an jemanden verschenken', - 'gift_message' => '', + 'gift_message' => 'füge eine optionale Nachricht zu deinem Geschenk hinzu! (bis zu :length Zeichen)', 'require_login' => [ '_' => 'Du musst :link sein, um ein osu!supporter-Tag zu erhalten!', diff --git a/resources/lang/de/users.php b/resources/lang/de/users.php index e1600de4a9b..0e2d4463d9e 100644 --- a/resources/lang/de/users.php +++ b/resources/lang/de/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Nachricht senden', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh, oh! Anscheinend wurde dein Konto deaktiviert.', 'warning' => "Falls Du gegen eine Regel verstoßen hast, beachte bitte, dass es in der Regel eine Frist von einem Monat gibt, in der wir keine Anträge berücksichtigen. Nach diesem Zeitraum kannst Du uns jederzeit kontaktieren, falls Du dies für erforderlich hältst. Beachte, dass das Erstellen neuer Konten nach dem Deaktivieren eines Kontos zu einer Verlängerung dieser einmonatigen Frist führt. Bitte beachte auch, dass du für jedes Konto, das du erstellst, weitere Regeln verletzt. Wir empfehlen Dir dringend, diesen Weg nicht zu gehen!", @@ -218,7 +234,7 @@ 'title' => 'Loved Beatmaps', ], 'nominated' => [ - 'title' => '', + 'title' => 'Nominierte Ranked Beatmaps', ], 'pending' => [ 'title' => 'Ausstehende Beatmaps', @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Benutzer erstellt', ], 'verify' => [ diff --git a/resources/lang/el/artist.php b/resources/lang/el/artist.php index 26898d8d26b..32ef70729f1 100644 --- a/resources/lang/el/artist.php +++ b/resources/lang/el/artist.php @@ -43,17 +43,17 @@ 'tracks' => [ 'index' => [ - '_' => '', + '_' => 'αναζήτηση κομματιών', 'form' => [ 'advanced' => '', - 'album' => '', - 'artist' => '', - 'bpm_gte' => '', - 'bpm_lte' => '', + 'album' => 'Άλμπουμ', + 'artist' => 'Καλλιτέχνης', + 'bpm_gte' => 'Ελάχιστο BPM', + 'bpm_lte' => 'Μέγιστο BPM', 'empty' => '', - 'genre' => '', - 'genre_all' => '', + 'genre' => 'Είδος', + 'genre_all' => 'Όλα', 'length_gte' => '', 'length_lte' => '', ], diff --git a/resources/lang/el/beatmapsets.php b/resources/lang/el/beatmapsets.php index 508d4289070..1e0bb63f7a8 100644 --- a/resources/lang/el/beatmapsets.php +++ b/resources/lang/el/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'Πρέπει να συνδεθείτε πριν κάνετε λήψη κάποιου beatmap!', 'mapped_by' => 'δημιουργήθηκε από :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Αφαιρέστε αυτό το beatmapset από τα αγαπημένα', 'updated_timeago' => 'τελευταία ενημέρωση :timeago', diff --git a/resources/lang/el/follows.php b/resources/lang/el/follows.php index a60899072c0..9d84e715b2b 100644 --- a/resources/lang/el/follows.php +++ b/resources/lang/el/follows.php @@ -7,11 +7,11 @@ 'comment' => [ 'empty' => '', 'page_title' => '', - 'title' => '', + 'title' => 'σχόλιο', 'table' => [ - 'latest_comment_empty' => '', - 'latest_comment_value' => '', + 'latest_comment_empty' => 'δεν υπάρχουν σχόλια', + 'latest_comment_value' => ':time από :username', ], ], @@ -20,7 +20,7 @@ ], 'index' => [ - 'title_compact' => '', + 'title_compact' => 'λίστες παρακολούθησης', ], 'mapping' => [ @@ -28,8 +28,8 @@ 'followers' => '', 'page_title' => '', 'title' => '', - 'to_0' => '', - 'to_1' => '', + 'to_0' => 'σταμάτα να με ειδοποιείς όταν αυτός ο χρήστης ανεβάζει νέο beatmap', + 'to_1' => 'ειδοποίησέ με όταν αυτός ο χρήστης ανεβάζει νέο beatmap', ], 'modding' => [ diff --git a/resources/lang/el/home.php b/resources/lang/el/home.php index a0bc3d37c98..caed101eec5 100644 --- a/resources/lang/el/home.php +++ b/resources/lang/el/home.php @@ -10,7 +10,7 @@ 'peak' => 'Κορύφωση, :count συνδεδεμένοι χρήστες', 'players' => ':count εγγεγραμμένοι παίκτες', 'title' => 'καλώς ήρθατε', - 'see_more_news' => '', + 'see_more_news' => 'δείτε περισσότερα νέα', 'slogan' => [ 'main' => 'το καλυτερότερο free-to-win ρυθμικό παιχνίδι', @@ -27,7 +27,7 @@ 'title' => 'Αναζήτηση', 'beatmapset' => [ - 'login_required' => '', + 'login_required' => 'Συνδεθείτε για να αναζητήσετε beatmaps', 'more' => ':count περισσότερα αποτελέσματα αναζήτησης beatmap', 'more_simple' => 'Δείτε περισσότερα αποτελέσματα αναζήτησης beatmap', 'title' => 'Beatmaps', @@ -57,7 +57,7 @@ ], 'user' => [ - 'login_required' => '', + 'login_required' => 'Συνδεθείτε για να αναζητήσετε χρήστες', 'more' => ':count περισσότερα αποτελέσματα αναζήτησης παίκτη', 'more_simple' => 'Δείτε περισσότερα αποτελέσματα αναζήτησης παίκτη', 'more_hidden' => 'Αναζήτηση παικτών περιορίζεται σε :max παίκτες. Δοκιμάστε να βελτιώσετε το ερώτημα αναζήτησης.', @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "ας
    αρχίσουμε!", 'action' => 'Λήψη osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'χρήστες macOS', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "ας
    αρχίσουμε!", + 'video-guide' => 'οδηγός βίντεο', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => 'για macOS', 'linux' => 'για Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'χρήστες macOS', 'steps' => [ 'register' => [ 'title' => 'αποκτήστε ένα λογαριασμό', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'οδηγός βίντεο', ], 'user' => [ @@ -124,7 +134,7 @@ 'beatmaps' => [ 'new' => 'Νέα Ranked Beatmaps', 'popular' => 'Δημοφιλή Beatmaps', - 'by_user' => '', + 'by_user' => 'από :user', ], 'buttons' => [ 'download' => 'Λήψη osu!', diff --git a/resources/lang/el/mail.php b/resources/lang/el/mail.php index cf4626a70af..08c9c11fc12 100644 --- a/resources/lang/el/mail.php +++ b/resources/lang/el/mail.php @@ -5,7 +5,7 @@ return [ 'beatmapset_update_notice' => [ - 'new' => '', + 'new' => 'Απλά σε ενημερώνουμε πως υπήρξε μια νέα ενημέρωση στο beatmap ":title" από την τελευταία σου επίσκεψη.', 'subject' => 'Νέα ενημέρωση για το beatmap ":title"', 'unwatch' => '', 'visit' => '', @@ -13,7 +13,7 @@ 'common' => [ 'closing' => '', - 'hello' => '', + 'hello' => 'Γεια σου :user,', 'report' => '', 'ignore' => '', ], @@ -33,8 +33,8 @@ 'support' => [ '_' => '', - 'first' => '', - 'repeat' => '', + 'first' => 'υποστήριξη', + 'repeat' => 'συνεχή υποστήριξη', ], ], @@ -97,7 +97,7 @@ ], 'user_verification' => [ - 'code' => '', + 'code' => 'Ο κωδικός επαλήθευσης σας είναι:', 'code_hint' => '', 'link' => '', 'report' => '', diff --git a/resources/lang/el/multiplayer.php b/resources/lang/el/multiplayer.php index dc8c7f1e291..99e7db65d48 100644 --- a/resources/lang/el/multiplayer.php +++ b/resources/lang/el/multiplayer.php @@ -12,19 +12,19 @@ 'room' => [ 'hosted_by' => '', - 'invalid_password' => '', + 'invalid_password' => 'Μη έγκυρος κωδικός δωματίου', 'map_count' => '', - 'player_count' => '', - 'time_left' => '', + 'player_count' => ':count_delimited παίκτης|:count_delimited παίκτες', + 'time_left' => 'απέμειναν :time', 'errors' => [ - 'duration_too_long' => '', + 'duration_too_long' => 'Η διάρκεια είναι πολύ μεγάλη.', ], 'status' => [ - 'active' => '', - 'ended' => '', - 'soon' => '', + 'active' => 'ενεργό', + 'ended' => 'έληξε', + 'soon' => 'λήγει σύντομα', ], ], ]; diff --git a/resources/lang/el/page_title.php b/resources/lang/el/page_title.php index e7760bd9d31..53fc03c676b 100644 --- a/resources/lang/el/page_title.php +++ b/resources/lang/el/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/el/paypal/errors.php b/resources/lang/el/paypal/errors.php index 0099cc4eaf1..3bd3920159a 100644 --- a/resources/lang/el/paypal/errors.php +++ b/resources/lang/el/paypal/errors.php @@ -6,8 +6,8 @@ return [ 'instrument_declined' => 'Η επιλεγμένη μέθοδος πληρωμής απορρίφθηκε από την Paypal.', 'invalid_resource_id' => 'Δεν βρέθηκαν πληροφορίες πληρωμής.', - 'invalid_token' => '', - 'old_format' => '', - 'resource_not_found' => '', + 'invalid_token' => 'Υπήρξε πρόβλημα στην ολοκλήρωση της πληρωμής σας.', + 'old_format' => 'Ο σύνδεσμος της πληρωμής έχει λήξει, παρακαλώ προσπαθήστε ξανά.', + 'resource_not_found' => 'Δε βρέθηκαν πληροφορίες πληρωμής.', 'unknown' => "Η πληρωμή απορρίφθηκε, αλλά δεν είμαστε σίγουροι γιατί.", ]; diff --git a/resources/lang/el/users.php b/resources/lang/el/users.php index 1a5b2e8ebc7..2847b5222bd 100644 --- a/resources/lang/el/users.php +++ b/resources/lang/el/users.php @@ -52,6 +52,22 @@ 'send_message' => 'αποστολή μηνύματος', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => 'Αποσυνδεδεμένοι', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Ο χρήστης δημιουργήθηκε', ], 'verify' => [ diff --git a/resources/lang/el/wiki.php b/resources/lang/el/wiki.php index 802e7e98a98..ea550fd6a91 100644 --- a/resources/lang/el/wiki.php +++ b/resources/lang/el/wiki.php @@ -6,13 +6,13 @@ return [ 'show' => [ 'fallback_translation' => 'Η σελίδα δεν είναι ακόμα μεταφρασμένη στην επιλεγμένη γλώσσα (:language). Αλλαγή στην Αγγλική έκδοση.', - 'incomplete_or_outdated' => '', + 'incomplete_or_outdated' => 'Το περιεχόμενο σε αυτήν τη σελίδα είναι ελλιπές ή παρωχημένο. Αν μπορείτε να βοηθήσετε, παρακαλούμε να ενημερώσετε το άρθρο!', 'missing' => 'Η σελίδα ":keyword" δεν βρέθηκε.', 'missing_title' => 'Δεν Βρέθηκε', 'missing_translation' => 'Η σελίδα που ζητήσατε δεν βρέθηκε για την επιλεγμένη γλώσσα.', - 'needs_cleanup_or_rewrite' => '', + 'needs_cleanup_or_rewrite' => 'Αυτή η σελίδα δεν καλύπτει τις προϋποθέσεις του osu! wiki και χρειάζεται να καθαριστεί ή να ξαναγραφεί. Αν μπορείτε να βοηθήσετε, παρακαλούμε να ενημερώσετε το άρθρο!', 'search' => 'Αναζήτηση υπάρχουσων σελίδων για :link.', - 'stub' => '', + 'stub' => 'Το άρθρο είναι ελλιπές και αναμένουμε κάποιον να το επεκτείνει.', 'toc' => 'Περιεχόμενα', 'edit' => [ diff --git a/resources/lang/es/beatmaps.php b/resources/lang/es/beatmaps.php index 5b4a35ec9c1..2515727727e 100644 --- a/resources/lang/es/beatmaps.php +++ b/resources/lang/es/beatmaps.php @@ -283,35 +283,35 @@ 'genre' => [ 'any' => 'Cualquier', 'unspecified' => 'No especificado', - 'video-game' => 'videojuego', - 'anime' => 'anime', - 'rock' => 'rock', - 'pop' => 'pop', - 'other' => 'otro', - 'novelty' => 'novedad', - 'hip-hop' => 'hip hop', - 'electronic' => 'electrónica', - 'metal' => 'metal', + 'video-game' => 'Videojuego', + 'anime' => 'Anime', + 'rock' => 'Rock', + 'pop' => 'Pop', + 'other' => 'Otro', + 'novelty' => 'Novedad', + 'hip-hop' => 'Hip Hop', + 'electronic' => 'Electrónica', + 'metal' => 'Metal', 'classical' => 'Clásica', - 'folk' => 'folk', - 'jazz' => 'jazz', + 'folk' => 'Folk', + 'jazz' => 'Jazz', ], 'language' => [ 'any' => 'Cualquiera', - 'english' => 'inglés', - 'chinese' => 'chino', - 'french' => 'francés', - 'german' => 'alemán', - 'italian' => 'italiano', - 'japanese' => 'japonés', - 'korean' => 'coreano', - 'spanish' => 'español', - 'swedish' => 'sueco', - 'russian' => 'ruso', - 'polish' => 'polaco', - 'instrumental' => 'instrumental', - 'other' => 'otro', - 'unspecified' => 'no especificado', + 'english' => 'Inglés', + 'chinese' => 'Chino', + 'french' => 'Francés', + 'german' => 'Alemán', + 'italian' => 'Italiano', + 'japanese' => 'Japonés', + 'korean' => 'Coreano', + 'spanish' => 'Español', + 'swedish' => 'Sueco', + 'russian' => 'Ruso', + 'polish' => 'Polaco', + 'instrumental' => 'Instrumental', + 'other' => 'Otro', + 'unspecified' => 'No especificado', ], 'nsfw' => [ diff --git a/resources/lang/es/beatmapsets.php b/resources/lang/es/beatmapsets.php index ac25a1894d6..22baa552052 100644 --- a/resources/lang/es/beatmapsets.php +++ b/resources/lang/es/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Inicie sesión para marcar este mapa como favorito', 'logged-out' => '¡Necesitas iniciar sesión antes de descargar cualquier mapa!', 'mapped_by' => 'mapeado por :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Desmarcar como favorito', 'updated_timeago' => 'actualizado por última vez :timeago', diff --git a/resources/lang/es/home.php b/resources/lang/es/home.php index a67ea9fccfb..ac1cd8ce052 100644 --- a/resources/lang/es/home.php +++ b/resources/lang/es/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "¡vamos a
    empezar!", 'action' => 'Descargar osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'usuarios de macOS', + 'mirror' => 'link alternativo', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "¡vamos a
    empezar!", + 'video-guide' => 'guía en vídeo', 'help' => [ '_' => 'si tiene problemas para iniciar el juego o para obtener una cuenta, :help_forum_link o :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'para macOS', 'linux' => 'para Linux', ], - 'mirror' => 'link alternativo', - 'macos-fallback' => 'usuarios de macOS', 'steps' => [ 'register' => [ 'title' => 'obtener una cuenta', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'guía en vídeo', ], 'user' => [ diff --git a/resources/lang/es/mail.php b/resources/lang/es/mail.php index ce3d06e25f2..80fe5cd3fd6 100644 --- a/resources/lang/es/mail.php +++ b/resources/lang/es/mail.php @@ -62,12 +62,12 @@ ], 'supporter_gift' => [ - 'anonymous_gift' => 'La persona que le regaló este tag puede optar por permanecer en el anonimato, por lo que no se ha mencionado en esta notificación.', + 'anonymous_gift' => 'La persona que le regaló este tag puede optar por permanecer en el anonimato, por lo que no se le ha mencionado en esta notificación.', 'anonymous_gift_maybe_not' => 'Pero es probable que ya sepas quién es ;).', 'duration' => 'Gracias a esa persona, usted tiene acceso a osu!direct y a otros beneficios de osu!supporter durante :duration.', 'features' => 'Puede encontrar más detalles sobre estas características aquí:', 'gifted' => '¡Alguien le acaba de regalar un tag de osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'La persona que le regaló este tag le dejó un mensaje:', 'subject' => '¡Le han regalado un tag de osu!supporter!', ], diff --git a/resources/lang/es/page_title.php b/resources/lang/es/page_title.php index e95c049540a..26fee745181 100644 --- a/resources/lang/es/page_title.php +++ b/resources/lang/es/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'información del jugador', + 'create' => '', 'disabled' => 'aviso', ], 'wiki_controller' => [ diff --git a/resources/lang/es/paypal/errors.php b/resources/lang/es/paypal/errors.php index d903d715736..61f109e3a81 100644 --- a/resources/lang/es/paypal/errors.php +++ b/resources/lang/es/paypal/errors.php @@ -5,9 +5,9 @@ return [ 'instrument_declined' => 'El método de pago seleccionado fue rechazado por PayPal.', - 'invalid_resource_id' => 'No se encontró ninguna información de pago.', + 'invalid_resource_id' => 'No se encontró información de pago.', 'invalid_token' => 'Hubo un error al completar su pago.', 'old_format' => 'El enlace de pago ha caducado, inténtelo de nuevo.', - 'resource_not_found' => 'No se encontró ninguna información de pago.', + 'resource_not_found' => 'No se encontró información de pago.', 'unknown' => "El pago fue rechazado, pero no sabemos por qué.", ]; diff --git a/resources/lang/es/store.php b/resources/lang/es/store.php index 40cf1a5ba02..8291972df54 100644 --- a/resources/lang/es/store.php +++ b/resources/lang/es/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Haz clic aquí para editarlo.', 'declined' => 'El pago ha sido cancelado.', 'delayed_shipping' => '¡Ahora mismo estamos sobresaturados de pedidos! Eres bienvenido a solicitar tu orden, pero considera un **retraso adicional de 1-2 semanas** mientras nos ponemos al día con órdenes ya existentes.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ocultar todos los tags de osu!supporter en esta orden de mi actividad', 'old_cart' => 'Tu carrito parecía estar desactualizado y fue reiniciado, por favor intenta de nuevo.', 'pay' => 'Pagar con PayPal', 'title_compact' => 'caja', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Como su pago fue un eCheck, ¡por favor permita hasta 10 días adicionales para que el pago se realice a través de PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'los tags de osu!supporter en esta orden no se muestran en sus actividades recientes.', 'title_compact' => 'factura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mensaje: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'regalar al jugador', - 'gift_message' => '', + 'gift_message' => '¡añade un mensaje opcional a tu regalo! (hasta :length caracteres) ', 'require_login' => [ '_' => '¡Tienes que :link para obtener un tag de osu!supporter!', diff --git a/resources/lang/es/users.php b/resources/lang/es/users.php index c80557a1b00..46893891334 100644 --- a/resources/lang/es/users.php +++ b/resources/lang/es/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Enviar mensaje', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '¡Oh, oh! Parece que su cuenta ha sido desactivada.', 'warning' => "En el caso de que haya roto una regla, tenga en cuenta que generalmente hay un período de espera de un mes durante el cual no consideraremos ninguna solicitud de amnistía. Después de este período, puede contactar con nosotros si lo considera necesario. Tenga en cuenta que la creación de nuevas cuentas después de haber tenido una desactivada resultará en una extensión de este período de espera de un mes. Por favor, también tenga en cuenta que por cada cuenta que cree, estará violando más reglas. ¡Le sugerimos que no siga este camino!", @@ -451,6 +467,8 @@ 'offline' => 'Sin conexión', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Usuario creado', ], 'verify' => [ diff --git a/resources/lang/fa-IR/beatmap_discussions.php b/resources/lang/fa-IR/beatmap_discussions.php index 70e1adc6c7a..c11d564779f 100644 --- a/resources/lang/fa-IR/beatmap_discussions.php +++ b/resources/lang/fa-IR/beatmap_discussions.php @@ -6,26 +6,26 @@ return [ 'authorizations' => [ 'update' => [ - 'null_user' => '', - 'system_generated' => '', - 'wrong_user' => '', + 'null_user' => 'برای ویرایش باید وارد شده باشید.', + 'system_generated' => 'پست هایی که توسط سیستم ساخته شده اند قابل ویرایش نیستند.', + 'wrong_user' => 'برای ویرایش پست باید صاحب آن باشید.', ], ], 'events' => [ - 'empty' => '', + 'empty' => 'هنوز چیزی رخ نداده است.', ], 'index' => [ - 'deleted_beatmap' => '', - 'none_found' => '', - 'title' => '', + 'deleted_beatmap' => 'حذف شده', + 'none_found' => 'هیچ گفتگویی منطبق با جستجوی شما یافت نشد.', + 'title' => 'گفتگو در مورد بیت مپ', 'form' => [ - '_' => '', - 'deleted' => '', - 'mode' => '', - 'only_unresolved' => '', + '_' => 'جستجو', + 'deleted' => 'شامل شدن گفتگو های پاک شده', + 'mode' => 'حالت بیت مپ', + 'only_unresolved' => 'فقط نمایش گفتگو های حل نشده', 'types' => 'نوع پیام', 'username' => 'نام کاربری', @@ -53,27 +53,27 @@ ], 'nearby_posts' => [ - 'confirm' => '', - 'notice' => '', - 'unsaved' => '', + 'confirm' => 'هیچکدام از این مطالب مشکل من را حل نکرد', + 'notice' => 'پست هایی (:existing_timestamps ) حوالی :timestamp وجود دارند. لطفا قبل از پست کردن آنها را بررسی کنید.', + 'unsaved' => ':count در این بازدید', ], 'owner_editor' => [ - 'button' => '', - 'reset_confirm' => '', - 'user' => '', - 'version' => '', + 'button' => 'صاحب درجه سختی', + 'reset_confirm' => 'بازنشانی صاحب این درجه سختی؟', + 'user' => 'صاحب', + 'version' => 'درجه سختی', ], 'reply' => [ 'open' => [ - 'guest' => '', - 'user' => '', + 'guest' => 'برای پاسخ دادن وارد شوید', + 'user' => 'پاسخ', ], ], 'review' => [ - 'block_count' => '', + 'block_count' => ':used از :max بلاک استفاده شده', 'go_to_parent' => '', 'go_to_child' => '', 'validation' => [ @@ -84,13 +84,13 @@ 'invalid_discussion_type' => '', 'minimum_issues' => '', 'missing_text' => '', - 'too_many_blocks' => '', + 'too_many_blocks' => 'مرور ها باید :count پاراگراف یا مسئله داشته باشند|مرور ها باید حداکثر :count پاراگراف / مسئله داشته باشند', ], ], 'system' => [ 'resolved' => [ - 'true' => '', + 'true' => 'توسط :user حل شده در نظر گرفته شد', 'false' => '', ], ], @@ -102,6 +102,6 @@ 'user_filter' => [ 'everyone' => '', - 'label' => '', + 'label' => 'فیلتر بر اساس کاربر', ], ]; diff --git a/resources/lang/fa-IR/beatmappacks.php b/resources/lang/fa-IR/beatmappacks.php index 377c2d13241..531976a08c9 100644 --- a/resources/lang/fa-IR/beatmappacks.php +++ b/resources/lang/fa-IR/beatmappacks.php @@ -11,16 +11,16 @@ 'blurb' => [ 'important' => '***قبل از دانلود این را بخوانید***', - 'install_instruction' => '', + 'install_instruction' => 'نصب: هر گاه یک پک دانلود شد، محتویات آن را به پوشه songs در osu! بازگشایی کنید و بقیه کار را به osu! بسپارید.', 'note' => [ - '_' => '', - 'scary' => '', + '_' => 'همچنین توجه کنید که توصیه میشود تا :scary. به این دلیل که مپ های قدیمی تر معمولا کیفیت خیلی پایین تری نسبت به مپ های جدید تر دارند.', + 'scary' => 'پک ها را از جدیدترین به قدیمی ترین دانلود کنید', ], ], ], 'show' => [ - 'download' => '', + 'download' => 'دانلود', 'item' => [ 'cleared' => '', 'not_cleared' => '', diff --git a/resources/lang/fa-IR/beatmapsets.php b/resources/lang/fa-IR/beatmapsets.php index ae316c9717d..339dfe089a5 100644 --- a/resources/lang/fa-IR/beatmapsets.php +++ b/resources/lang/fa-IR/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => '', 'mapped_by' => '', + 'mapped_by_guest' => '', 'unfavourite' => '', 'updated_timeago' => '', diff --git a/resources/lang/fa-IR/home.php b/resources/lang/fa-IR/home.php index 8d9146ae013..601b913023a 100644 --- a/resources/lang/fa-IR/home.php +++ b/resources/lang/fa-IR/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "", 'action' => '', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => '', + 'mirror' => '', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "", + 'video-guide' => '', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => '', 'linux' => '', ], - 'mirror' => '', - 'macos-fallback' => '', 'steps' => [ 'register' => [ 'title' => '', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '', ], 'user' => [ diff --git a/resources/lang/fa-IR/page_title.php b/resources/lang/fa-IR/page_title.php index 88375e7c77d..eb16a2f3172 100644 --- a/resources/lang/fa-IR/page_title.php +++ b/resources/lang/fa-IR/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/fa-IR/users.php b/resources/lang/fa-IR/users.php index dc24d3241ec..0c6cbb5648c 100644 --- a/resources/lang/fa-IR/users.php +++ b/resources/lang/fa-IR/users.php @@ -52,6 +52,22 @@ 'send_message' => 'ارسال پیام', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'اوه اوه! به نظر میرسد حساب کاربری شما غیرفعال شده است.', 'warning' => "در صورتی که یک قانون را زیر پا گذاشته اید، توجه داشته باشید که معمولا یک دوره یکماهه وجود دارد که در آن مدت ما هیچ درخواست بخششی را قبول نمی کنیم. بعد این دوره شما میتوانید در صورت ضرورت با ما تماس بگیرید. توجه داشته باشید که ساخت حساب جدید بعد غیرفعال شدن یکی، میتواند منجر به اضافه شدن یک ماه دیگر به این دوره شود همچنین توجه داشته باشید برای هر حساب جدیدی که می سازید، دارید بیشتر قوانین را زیر پا می گذارید. به شدت پیشنهاد میکنیم که این راه را پیش نروید!", @@ -451,6 +467,8 @@ 'offline' => 'آفلاین', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'کاربر ایجاد شده', ], 'verify' => [ diff --git a/resources/lang/fi/beatmapsets.php b/resources/lang/fi/beatmapsets.php index 5987e7b56e9..effd2bdb79f 100644 --- a/resources/lang/fi/beatmapsets.php +++ b/resources/lang/fi/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'Sinun täytyy kirjautua sisään ladataksesi beatmappeja!', 'mapped_by' => 'luonut: :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Poista tämä beatmapkokoelma suosikeista', 'updated_timeago' => 'päivitetty viimeksi :timeago', diff --git a/resources/lang/fi/home.php b/resources/lang/fi/home.php index a930d7fbbbd..86756de2050 100644 --- a/resources/lang/fi/home.php +++ b/resources/lang/fi/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "laitetaan sinut
    liikkeelle!", 'action' => 'Lataa osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS-käyttäjät', + 'mirror' => 'vaihtoehtoinen lataus', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "laitetaan sinut
    liikkeelle!", + 'video-guide' => 'video-opas', 'help' => [ '_' => 'jos sinulla on ongelmia pelin käynnistämisessä tai tilin rekisteröinnissä, :help_forum_link tai :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'macOS:lle', 'linux' => 'Linuxille', ], - 'mirror' => 'vaihtoehtoinen lataus', - 'macos-fallback' => 'macOS-käyttäjät', 'steps' => [ 'register' => [ 'title' => 'luo tili', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video-opas', ], 'user' => [ diff --git a/resources/lang/fi/page_title.php b/resources/lang/fi/page_title.php index 6cfe7c0a817..f0ac8309348 100644 --- a/resources/lang/fi/page_title.php +++ b/resources/lang/fi/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'pelaajatiedot', + 'create' => '', 'disabled' => 'ilmoitus', ], 'wiki_controller' => [ diff --git a/resources/lang/fi/users.php b/resources/lang/fi/users.php index ad6698ee7cb..3bb066de797 100644 --- a/resources/lang/fi/users.php +++ b/resources/lang/fi/users.php @@ -52,6 +52,22 @@ 'send_message' => 'lähetä viesti', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Jaahas. Käyttäjätilisi taitaa olla lukittu.', 'warning' => "Jos olet rikkonut sääntöä huomaa, että yleensä on yksi kuukausi, jolloin emme ota huomioon armahduspyyntöjä. Tämän ajanjakson jälkeen voit ottaa meihin yhteyttä, jos pidät sitä tarpeellisena. Huomaa, että uusien tilien luominen sen jälkeen, kun yksi on poistettu käytöstä, johtaa tämän kuukauden jäähdytyksen jatkamiseen . Huomaa myös, että jokaisella luomallasi tilillä rikot edelleen sääntöjä . Suosittelemme, ettet mene tätä polkua!", @@ -451,6 +467,8 @@ 'offline' => 'Poissa', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Käyttäjä luotu', ], 'verify' => [ diff --git a/resources/lang/fil-PH/beatmapsets.php b/resources/lang/fil-PH/beatmapsets.php index 4325d30182f..c647b193ed9 100644 --- a/resources/lang/fil-PH/beatmapsets.php +++ b/resources/lang/fil-PH/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Mag-sign in para i-favourite ang beatmap na ito', 'logged-out' => 'Kailangan mong mag-sign-in bago ka pwedeng mag-download ng mga beatmap!', 'mapped_by' => 'minapa ni :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'I-unfavorite ang beatmap na ito', 'updated_timeago' => 'huling na-update sa :timeago', diff --git a/resources/lang/fil-PH/home.php b/resources/lang/fil-PH/home.php index 6e25d067aef..9a6ded489f9 100644 --- a/resources/lang/fil-PH/home.php +++ b/resources/lang/fil-PH/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "tayo nang
    simulan ito!", 'action' => 'I-download ang osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'mga gumagamit ng macOS', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "tayo nang
    simulan ito!", + 'video-guide' => 'video na panggabay', 'help' => [ '_' => 'kung may problema ka sa pagbukas ng laro o sa paggawa ng account, :help_forum_link o :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'para sa macOS', 'linux' => 'para sa Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'mga gumagamit ng macOS', 'steps' => [ 'register' => [ 'title' => 'gumawa ng account', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video na panggabay', ], 'user' => [ diff --git a/resources/lang/fil-PH/mail.php b/resources/lang/fil-PH/mail.php index 816f33e23c8..b9a6a538d3d 100644 --- a/resources/lang/fil-PH/mail.php +++ b/resources/lang/fil-PH/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Salamat sa kanila, may access ka na sa osu!direct at iba pang osu!supporter na benepisyo para sa sususnod na :duration.', 'features' => 'Maaari mong malaman ang higit pang mga detalye tungkol sa mga features dito:', 'gifted' => 'May nagregalo sa\'yo ng osu!supporter tag!', - 'gift_message' => '', + 'gift_message' => 'Ang taong nagbigay sa iyo ng tag na ito ay ng-iwan sa iyo ng mensahe:', 'subject' => 'Ikaw ay binigyan ng osu!supporter tag!', ], diff --git a/resources/lang/fil-PH/page_title.php b/resources/lang/fil-PH/page_title.php index 4d22f2eb6b0..2808995a570 100644 --- a/resources/lang/fil-PH/page_title.php +++ b/resources/lang/fil-PH/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'player info', + 'create' => '', 'disabled' => 'abiso', ], 'wiki_controller' => [ diff --git a/resources/lang/fil-PH/store.php b/resources/lang/fil-PH/store.php index 4341a6245a1..2f5c4b81aed 100644 --- a/resources/lang/fil-PH/store.php +++ b/resources/lang/fil-PH/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Mag-click dito para i-edit ito.', 'declined' => 'Nakansela ang bayad.', 'delayed_shipping' => 'Kami ay punong puno ng mga order! Maari kang maglagay ng order, pero maaring mahintulot ang iyong order ng mga 1-2 linggo habang inaasikaso namin ang mga order sa ngayon.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Itago ang lahat ng mga tag ng osu!supporter sa pagkakasunud-sunod na ito mula sa aking aktibidad', 'old_cart' => 'Dahil matagal na panahon na ang lumipas, ini-load muli ang iyong kariton, mangyaring subukang muli.', 'pay' => 'Paglabas gamit ang Paypal', 'title_compact' => 'checkout', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Dahil ang pagbayad ay eCheck, maari pong magantay ng 10 araw para dumaan ng PayPal ang iyong bayarin!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'ang mga tag ng osu!supporter sa pagkakasunud-sunod na ito ay hindi ipinapakita sa iyong kamakailang mga aktibidad.', 'title_compact' => 'invoice', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mensahe: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'regalo sa manlalaro', - 'gift_message' => '', + 'gift_message' => 'magdagdag ng opsyonal na mensahe sa iyong regalo! (hanggang sa :length ka mga karakter)', 'require_login' => [ '_' => 'Kailangan mong :link upang makakuha ng osu! Supporter tag!', diff --git a/resources/lang/fil-PH/users.php b/resources/lang/fil-PH/users.php index 7fd92cb832d..b69b720bb55 100644 --- a/resources/lang/fil-PH/users.php +++ b/resources/lang/fil-PH/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Ipadala ang mensahe', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Naku po! Mukhang ang iyong account ay hindi magagamit.', 'warning' => "Sa kaso na ikaw ay nakalabag sa rules, alamin na mayroong isang buwan na hindi namin bibigyang konsiderasyon ang anumang request sa amnestiya. Pagkatapos ng sinabing isang buwan ay maaari na kaming i-contact kung kinakailangan. Binibigyang paalala namin na ang paglikha ng bagong account matapos magkaroon ng disabled account ay magreresulta sa pagdagdag sa isang buwan na cool-down. Sa bawat isang account na iyong nilikha ikaw ay lalong lumalabag sa rules. ", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Ginawa ng user', ], 'verify' => [ diff --git a/resources/lang/fr/beatmapsets.php b/resources/lang/fr/beatmapsets.php index 954186178af..e394839a999 100644 --- a/resources/lang/fr/beatmapsets.php +++ b/resources/lang/fr/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Connectez-vous pour ajouter cette beatmap aux favoris', 'logged-out' => 'Vous devez vous connecter pour pouvoir télécharger des beatmaps !', 'mapped_by' => 'mappée par :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Retirer cette beatmapset des favoris', 'updated_timeago' => 'dernière mise à jour le :timeago', diff --git a/resources/lang/fr/home.php b/resources/lang/fr/home.php index 8986dc2af06..eb4bcee4cbc 100644 --- a/resources/lang/fr/home.php +++ b/resources/lang/fr/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "c'est parti
    lancez-vous !", 'action' => 'Télécharger osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'utilisateurs macOS', + 'mirror' => 'miroir', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "c'est parti
    lancez-vous !", + 'video-guide' => 'guide vidéo', 'help' => [ '_' => 'si vous avez des problèmes pour démarrer le jeu ou pour créer un compte, :help_forum_link ou :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'pour macOS', 'linux' => 'pour Linux', ], - 'mirror' => 'miroir', - 'macos-fallback' => 'utilisateurs macOS', 'steps' => [ 'register' => [ 'title' => 'créer un compte', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'guide vidéo', ], 'user' => [ diff --git a/resources/lang/fr/mail.php b/resources/lang/fr/mail.php index 94129f2d097..02decfb0ea0 100644 --- a/resources/lang/fr/mail.php +++ b/resources/lang/fr/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Grâce à cette personne, vous pouvez utiliser osu!direct et d\'autres avantages osu!supporter pour les prochains :duration.', 'features' => 'Vous trouverez plus de détails sur ces fonctionnalités ici :', 'gifted' => 'Quelqu\'un vient de vous offrir un tag osu!supporter !', - 'gift_message' => '', + 'gift_message' => 'La personne qui vous a donné ce tag vous a laissé un message :', 'subject' => 'On vous a offert un tag osu!supporter !', ], diff --git a/resources/lang/fr/page_title.php b/resources/lang/fr/page_title.php index e35cee59f92..0929963ddfd 100644 --- a/resources/lang/fr/page_title.php +++ b/resources/lang/fr/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informations du joueur', + 'create' => '', 'disabled' => 'remarque', ], 'wiki_controller' => [ diff --git a/resources/lang/fr/store.php b/resources/lang/fr/store.php index 8aa89dfc320..1bc5eed721c 100644 --- a/resources/lang/fr/store.php +++ b/resources/lang/fr/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Cliquez ici pour l\'éditer.', 'declined' => 'Le paiement a été annulé.', 'delayed_shipping' => 'Nous sommes actuellement submergés de commandes ! Vous pouvez tout de même commander, mais attendez-vous à **une à deux semaines de délai supplémentaire** le temps que nous puissions traiter toutes ces commandes.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Masquer tous les tags osu!supporter dans cette commande de mon activité', 'old_cart' => 'Votre panier semble être obsolète et a donc été actualisé, merci de réessayer.', 'pay' => 'Payer avec PayPal', 'title_compact' => 'commander', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Si votre paiement est en eCheck, comptez jusqu\'à 10 jours supplémentaires pour le paiement via PayPal !', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Les tags osu!supporter dans cette commande ne sont pas affichés dans vos activités récentes.', 'title_compact' => 'facture', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Message : :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'offrir à un joueur', - 'gift_message' => '', + 'gift_message' => 'ajouter un message optionnel à votre cadeau ! (jusqu\'à :length caractères)', 'require_login' => [ '_' => 'Vous devez être :link pour obtenir un tag osu!supporter !', diff --git a/resources/lang/fr/users.php b/resources/lang/fr/users.php index 42b43389255..80c03530506 100644 --- a/resources/lang/fr/users.php +++ b/resources/lang/fr/users.php @@ -52,6 +52,22 @@ 'send_message' => 'envoyer un message', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Oh-oh ! Il semble que votre compte ait été désactivé.', 'warning' => "Dans le cas où vous avez enfreint une règle, veuillez noter qu'il y a généralement une période d'un mois pendant laquelle nous n'accepterons aucune demande de réactivation. Après cette période, vous êtes libre de nous contacter si vous le jugez nécessaire. Veuillez noter que la création de nouveaux comptes entraînera une prolongation de ce délai de récupération d'un mois. Veuillez également noter que pour chaque compte que vous créez, vous enfreignez à nouveau les règles. Nous vous suggérons fortement de ne pas suivre cette voie !", @@ -451,6 +467,8 @@ 'offline' => 'Hors-ligne', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Utilisateur créé', ], 'verify' => [ diff --git a/resources/lang/he-IL/beatmapsets.php b/resources/lang/he-IL/beatmapsets.php index 54e72a182da..deaa6c6c025 100644 --- a/resources/lang/he-IL/beatmapsets.php +++ b/resources/lang/he-IL/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'אתה צריך להתחבר לפני הורדת מפות כלשהן!', 'mapped_by' => 'נוצרה על ידי :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'הסר מפה ממועדפות', 'updated_timeago' => 'עודכנה לאחרונה :timeago', diff --git a/resources/lang/he-IL/home.php b/resources/lang/he-IL/home.php index c2d918c1852..94a6b8b2493 100644 --- a/resources/lang/he-IL/home.php +++ b/resources/lang/he-IL/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "בוא
    נתחיל!", 'action' => 'הורד osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'משתמשי macOS', + 'mirror' => 'מראה', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "בוא
    נתחיל!", + 'video-guide' => 'מדריך וידאו', 'help' => [ '_' => 'אם ישנה בעיה עם הרצת המשחק או ההרשמה למשתמש, :help_forum_link או :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'עבור macOS', 'linux' => 'עבור Linux', ], - 'mirror' => 'מראה', - 'macos-fallback' => 'משתמשי macOS', 'steps' => [ 'register' => [ 'title' => 'השג חשבון', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'מדריך וידאו', ], 'user' => [ diff --git a/resources/lang/he-IL/page_title.php b/resources/lang/he-IL/page_title.php index 6ddd9e484b3..0eb6562e10b 100644 --- a/resources/lang/he-IL/page_title.php +++ b/resources/lang/he-IL/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'מידע שחקן', + 'create' => '', 'disabled' => 'שים לב', ], 'wiki_controller' => [ diff --git a/resources/lang/he-IL/users.php b/resources/lang/he-IL/users.php index 0abb8c528aa..d923855746c 100644 --- a/resources/lang/he-IL/users.php +++ b/resources/lang/he-IL/users.php @@ -52,6 +52,22 @@ 'send_message' => 'שלח הודעה', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'אוי לא! נראה שהחשבון שלך הושבת.', 'warning' => "במקרה ועברת על חוק, אנא הסבר כאן בצורה המפורטת ביותר כל מה שקרה בחודש האחרון או שלא נוכל לעשות שום דבר בנושא. לאחר פרק הזמן הזה, אתה מוזמן ליצור איתו קשר במידת הצורך. לתשומת ליבך, יצירת משתמש אחרי חסימה תוביל חסימה תמידית. אנא כתוב גם על כל משתמש שנוצר על ידך. אנו ממליצים בחום שלא תלך בדרך זו!", @@ -453,6 +469,8 @@ 'offline' => 'מנותק', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'משתמש נוצר', ], 'verify' => [ diff --git a/resources/lang/hr-HR/beatmapsets.php b/resources/lang/hr-HR/beatmapsets.php index d14c51b2404..eb8c8e1ca82 100644 --- a/resources/lang/hr-HR/beatmapsets.php +++ b/resources/lang/hr-HR/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Prijavi se kako bi označio/la ovu beatmapu kao omiljenu', 'logged-out' => 'Moraš se prijaviti prije preuzimanja beatmapa!', 'mapped_by' => 'mapirano od :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Ukloni beatmapu sa oznake omiljeno', 'updated_timeago' => 'zadnje ažurirano :timeago', diff --git a/resources/lang/hr-HR/home.php b/resources/lang/hr-HR/home.php index efc8d2a1d2c..bfc006bdb37 100644 --- a/resources/lang/hr-HR/home.php +++ b/resources/lang/hr-HR/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "idemo
    započeti!", 'action' => 'Preuzmi osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS korisnici', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "idemo
    započeti!", + 'video-guide' => 'video vodič', 'help' => [ '_' => 'ako imaš problema s pokretanjem igre ili registracijom računa, :help_forum_link ili :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'za macOS', 'linux' => 'za Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS korisnici', 'steps' => [ 'register' => [ 'title' => 'nabavi račun', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video vodič', ], 'user' => [ diff --git a/resources/lang/hr-HR/page_title.php b/resources/lang/hr-HR/page_title.php index 6bd3d620736..3298fb0961e 100644 --- a/resources/lang/hr-HR/page_title.php +++ b/resources/lang/hr-HR/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informacije o igraču', + 'create' => '', 'disabled' => 'napomena', ], 'wiki_controller' => [ diff --git a/resources/lang/hr-HR/users.php b/resources/lang/hr-HR/users.php index a1659fcc087..35ccdee62c9 100644 --- a/resources/lang/hr-HR/users.php +++ b/resources/lang/hr-HR/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Pošalji poruku', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh oh! Čini se da je tvoj račun onemogućen.', 'warning' => "U slučaju da si prekršio/la pravilo, imaj na umu da općenito postoji razdoblje mirovanja od mjesec dana tijekom kojeg nećemo razmatrati nikakve zahtjeve za amnestiju. Nakon tog razdoblja, slobodni ste nas kontaktirati ako smatrate da je potrebno. Imaj na umu da će stvaranje novih računa nakon što si jedan onemogućio/la rezultirati produženjem ovog jednomjesečnog hlađenja. Također imaj na umu da za svaki račun koji izradiš dodatno kršiš pravila. Toplo preporučamo da ne idete ovim putem!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Stvoreno od strane korisnika', ], 'verify' => [ diff --git a/resources/lang/hu/beatmapsets.php b/resources/lang/hu/beatmapsets.php index d1c095a453b..82b24e60bc7 100644 --- a/resources/lang/hu/beatmapsets.php +++ b/resources/lang/hu/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Jelentkezz be, hogy kedvencnek jelölt ezt beatmap-et', 'logged-out' => 'Beatmapek letöltéshez be kell jelentkezned!', 'mapped_by' => 'mappolva :mapper által', + 'mapped_by_guest' => '', 'unfavourite' => 'Beatmap eltávolitása a kedvencek közül', 'updated_timeago' => 'utóljára frissítve: :timeago', @@ -124,7 +125,7 @@ 'genre' => 'Műfaj', 'language' => 'Nyelv', 'no_scores' => 'Az adatok még számítás alatt...', - 'nominators' => '', + 'nominators' => 'Nominálók', 'nsfw' => 'Felnőtt tartalom', 'offset' => 'Online eltolás', 'points-of-failure' => 'Kibukási Alkalmak', diff --git a/resources/lang/hu/community.php b/resources/lang/hu/community.php index e315540f727..538b6b1bd3c 100644 --- a/resources/lang/hu/community.php +++ b/resources/lang/hu/community.php @@ -32,9 +32,9 @@ 'description' => 'A ti támogatásotok segíti, hogy a játék független legyen és teljesen hirdetésmentes szponzorok nélkül.', ], 'tournaments' => [ - 'title' => 'Hivatalos Versenyek', + 'title' => 'Hivatalos bajnokságok', 'description' => 'Támogasd a hivatalos osu! Világbajnokság rendezését (és díjait).', - 'link_text' => 'Versenyek felfedezése »', + 'link_text' => 'Bajnokságok felfedezése »', ], 'bounty-program' => [ 'title' => 'Nyílt forrású bounty program', diff --git a/resources/lang/hu/contest.php b/resources/lang/hu/contest.php index 30b35ad0c93..6fc0c04be89 100644 --- a/resources/lang/hu/contest.php +++ b/resources/lang/hu/contest.php @@ -34,7 +34,7 @@ 'requirement' => [ 'playlist_beatmapsets' => [ - 'incomplete_play' => '', + 'incomplete_play' => 'Szavazás előtt, először játszanod kell az összes beatmappel a kiválasztott játéklistákban', ], ], ], @@ -50,7 +50,7 @@ 'beatmap' => 'Csak .osu kiterjesztésű fájlok engedélyezettek erre a versenyre.', 'music' => 'Csak .mp3 kiterjesztésű fájlok engedélyezettek erre a versenyre.', ], - 'wrong_dimensions' => '', + 'wrong_dimensions' => 'A beküldéseknek erre a versenyre :widthx:height méretűnek kell lennie', 'too_big' => 'A jelentkezések száma erre a versenyre csak :limit lehet.', ], 'beatmaps' => [ diff --git a/resources/lang/hu/home.php b/resources/lang/hu/home.php index d2ccf3d0525..8be6a15ff77 100644 --- a/resources/lang/hu/home.php +++ b/resources/lang/hu/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "vágjunk
    bele!", 'action' => 'osu! letöltése', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS használók', + 'mirror' => 'tükör', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "vágjunk
    bele!", + 'video-guide' => 'videó útmutató', 'help' => [ '_' => 'ha meccs indításakor vagy fiók létrehozásánál problémába ütközöl, :help_forum_link vagy :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'macOS rendszerre', 'linux' => 'Linux rendszerre', ], - 'mirror' => 'tükör', - 'macos-fallback' => 'macOS használók', 'steps' => [ 'register' => [ 'title' => 'hozz létre fiókot', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'videó útmutató', ], 'user' => [ diff --git a/resources/lang/hu/layout.php b/resources/lang/hu/layout.php index 065814681b7..7a362b84f33 100644 --- a/resources/lang/hu/layout.php +++ b/resources/lang/hu/layout.php @@ -51,7 +51,7 @@ 'users' => [ 'modding' => 'modolás', - 'playlists' => 'lejátszási listák', + 'playlists' => 'játéklisták', 'realtime' => 'többjátékos', 'show' => 'információ', ], diff --git a/resources/lang/hu/mail.php b/resources/lang/hu/mail.php index 08df6044514..41b1f55e005 100644 --- a/resources/lang/hu/mail.php +++ b/resources/lang/hu/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Nekik köszönhetően, hozzáférésed van az osu!directhez és egyéb támogatói előnyökhöz egészen :duration-ig.', 'features' => 'További adatokat itt találhatsz:', 'gifted' => 'Valaki ajándékba adott egy osu!támogatói címet!', - 'gift_message' => '', + 'gift_message' => 'Az ajándékozód ezt az üzenetet hagyta: ', 'subject' => 'osu!támogatói címet kaptál!', ], diff --git a/resources/lang/hu/multiplayer.php b/resources/lang/hu/multiplayer.php index 4c5d7bd1de8..2460906a851 100644 --- a/resources/lang/hu/multiplayer.php +++ b/resources/lang/hu/multiplayer.php @@ -6,7 +6,7 @@ return [ 'empty' => [ '_' => 'Nem játszottál még egy osu!(lazer) :type_group játékot sem!', - 'playlists' => 'lejátszási lista', + 'playlists' => 'játéklista', 'realtime' => 'többjátékos', ], diff --git a/resources/lang/hu/notifications.php b/resources/lang/hu/notifications.php index c2c9d9e75d0..af46e35a427 100644 --- a/resources/lang/hu/notifications.php +++ b/resources/lang/hu/notifications.php @@ -241,7 +241,7 @@ 'user_beatmapset_new' => [ 'user_beatmapset_new' => ':username új beatmapeket hozott létre', - 'user_beatmapset_revive' => '', + 'user_beatmapset_revive' => ':username újraélesztett beatmepeket', ], ], ], diff --git a/resources/lang/hu/page_title.php b/resources/lang/hu/page_title.php index 72f6ac140d7..57c638f14d5 100644 --- a/resources/lang/hu/page_title.php +++ b/resources/lang/hu/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'játékos információi', + 'create' => '', 'disabled' => 'értesítés', ], 'wiki_controller' => [ diff --git a/resources/lang/hu/scores.php b/resources/lang/hu/scores.php index aef2cc83acb..f699ab8b0b4 100644 --- a/resources/lang/hu/scores.php +++ b/resources/lang/hu/scores.php @@ -24,7 +24,7 @@ 'status' => [ 'non_best' => 'Csak a legjobb személyes pontszámok adnak pp-t', - 'non_passing' => '', + 'non_passing' => 'Csak sikeres eredmények jutalmaznak pp-t', 'processing' => 'Ez a pontszám még értékelés alatt van és hamarosan mutatva lesz', ], ]; diff --git a/resources/lang/hu/store.php b/resources/lang/hu/store.php index b8a0691e5b1..4417f35d6e5 100644 --- a/resources/lang/hu/store.php +++ b/resources/lang/hu/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Kattints ide a szerkesztéséhez.', 'declined' => 'A fizetés meg lett szakítva.', 'delayed_shipping' => 'Jelenleg túlnyomóan sok rendelésünk van. Szívesen fogadjuk rendelésed, viszont arra számíts, hogy **további 1-2 hét késés** is lehet míg elérünk a jelenlegi rendelésekig.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Rejtse el ezeknek az osu!supporter címkék vásárlását az aktivitásomból', 'old_cart' => 'A kosarad réginek tűnik és újra lett töltve, kérlek próbáld újra.', 'pay' => 'Fizetés Paypal használatával', 'title_compact' => 'fizetés', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Mivel a fizetésed egy eCheck volt, engedj meg neki legalább 10 napot a PayPal-es feldolgozásra!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'ebben a vásárlásban szereplő osu!supporter címkék nem jelennek meg a legutóbbi aktivitásaid között.', 'title_compact' => 'számla', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Üzenet: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'játékosnak ajándékozás', - 'gift_message' => '', + 'gift_message' => 'adj egy üzenetet az ajándékodhoz, amennyiben szeretnél! (legfeljebb :length karakterű)', 'require_login' => [ '_' => 'Az osu!támogatói cím megszerzéséhez :link kell lenned!', diff --git a/resources/lang/hu/users.php b/resources/lang/hu/users.php index e5065bdb152..86dec6fd2d5 100644 --- a/resources/lang/hu/users.php +++ b/resources/lang/hu/users.php @@ -33,13 +33,13 @@ 'blocks' => [ 'banner_text' => 'Blokkoltad ezt a felhasználót.', - 'comment_text' => '', + 'comment_text' => 'Ez a hozzászólás rejtett.', 'blocked_count' => '(:count) blokkolt felhasználók', 'hide_profile' => 'profil elrejtése', - 'hide_comment' => '', + 'hide_comment' => 'elrejtés', 'not_blocked' => 'Ez a felhasználó nincs blokkolva.', 'show_profile' => 'profil megjelenítése', - 'show_comment' => '', + 'show_comment' => 'mutatás', 'too_many' => 'Blokkolási limit elérve.', 'button' => [ 'block' => 'tiltás', @@ -52,6 +52,22 @@ 'send_message' => 'üzenet küldése', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh-oh! Úgy tűnik a fiókod le lett tiltva.', 'warning' => "Abban az esetben, ha megszegsz egy szabályt, kérlek vedd figyelembe, hogy van egy általános egy hónapos időszak, amiben nem fogadunk el amnesztiával kapcsolatos kéréseket. Ezután az időszak után, szabadon kapcsolatba léphetsz velünk, ha szükségesnek láttod. Kérlek vedd figyelembe, hogy ha egy új fiókot hozol létre, ha már volt legalább egy letiltott fiókod, ez egy újabb hónap meghosszabitást eredményez. Vedd azt is figyelembe, hogy minnél több fiókot hozol létre, annál több büntetésed lesz. Nagyon ajánljuk, hogy ne menj el ebbe az írányba!", @@ -218,7 +234,7 @@ 'title' => 'Szeretett beatmapek', ], 'nominated' => [ - 'title' => '', + 'title' => 'Nominált rangsorolt beatmapek', ], 'pending' => [ 'title' => 'Függő beatmapek', @@ -315,7 +331,7 @@ 'title' => 'Medálok', ], 'playlists' => [ - 'title' => 'Lejátszási listás játékok', + 'title' => 'Játéklistás játékok', ], 'posts' => [ 'title' => 'Bejegyzések', @@ -375,7 +391,7 @@ 'actions' => [ 'restriction' => 'Kitiltás', 'silence' => 'Némítás', - 'tournament_ban' => '', + 'tournament_ban' => 'Bajnoksági kitiltás', 'note' => 'Megjegyzés', ], ], @@ -417,7 +433,7 @@ 'country_simple' => 'Országos Rangsor', 'global' => 'Globális rank a :mode-ra/re', 'global_simple' => 'Globális Rangsor', - 'highest' => '', + 'highest' => 'Legnagyobb rank: :rank elérve :date dátumkor', ], 'stats' => [ 'hit_accuracy' => 'Találati Pontosság', @@ -451,6 +467,8 @@ 'offline' => 'Nem elérhető', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Felhasználó létrehozva', ], 'verify' => [ diff --git a/resources/lang/id/accounts.php b/resources/lang/id/accounts.php index ad9cd505f48..236b2ae92a9 100644 --- a/resources/lang/id/accounts.php +++ b/resources/lang/id/accounts.php @@ -10,7 +10,7 @@ 'avatar' => [ 'title' => 'Avatar', - 'rules' => 'Pastikan avatar Anda tunduk pada :link yang berlaku.
    Dengan kata lain, avatar Anda harus cocok untuk segala usia tanpa mengandung unsur apa pun yang tidak dibenarkan seperti cacian, hinaan, atau hal yang bersifat sugestif.', + 'rules' => 'Pastikan avatarmu tunduk pada :link yang berlaku.
    Dengan kata lain, avatarmu harus cocok untuk segala usia tanpa mengandung unsur apa pun yang tidak dibenarkan seperti cacian, hinaan, atau hal yang bersifat sugestif.', 'rules_link' => 'peraturan komunitas', ], @@ -49,9 +49,9 @@ 'notifications' => [ 'beatmapset_discussion_qualified_problem' => 'terima notifikasi pada saat terdapat masalah baru pada beatmap yang berstatus Qualified pada mode', 'beatmapset_disqualify' => 'terima notifikasi pada saat terdapat beatmap yang terdiskualifikasi pada mode', - 'comment_reply' => 'terima notifikasi pada saat terdapat balasan baru pada komentar Anda', + 'comment_reply' => 'terima notifikasi pada saat terdapat balasan baru pada komentar yang kamu tulis', 'title' => 'Notifikasi', - 'topic_auto_subscribe' => 'aktifkan notifikasi secara otomatis untuk topik forum baru yang Anda buat', + 'topic_auto_subscribe' => 'aktifkan notifikasi secara otomatis untuk topik forum baru yang kamu buat', 'options' => [ '_' => 'kirimkan notifikasi melalui', @@ -69,7 +69,7 @@ 'oauth' => [ 'authorized_clients' => 'klien yang terizin', - 'own_clients' => 'klien yang Anda miliki', + 'own_clients' => 'klien yang dimiliki', 'title' => 'OAuth', ], @@ -96,14 +96,14 @@ 'privacy' => [ 'friends_only' => 'Blokir pesan pribadi dari orang yang tidak ada dalam daftar teman Anda', - 'hide_online' => 'sembunyikan status online Anda', + 'hide_online' => 'sembunyikan keberadaan online Anda', 'title' => 'Kebijakan Privasi', ], 'security' => [ 'current_session' => 'saat ini', 'end_session' => 'Akhiri Sesi', - 'end_session_confirmation' => 'Tindakan ini akan secara otomatis mengakhiri sesi Anda pada perangkat yang bersangkutan. Apakah Anda yakin?', + 'end_session_confirmation' => 'Tindakan ini akan secara otomatis mengakhiri sesimu pada perangkat yang bersangkutan. Apakah kamu yakin?', 'last_active' => 'Terakhir aktif:', 'title' => 'Keamanan', 'web_sessions' => 'sesi web', @@ -118,7 +118,7 @@ ], 'verification_completed' => [ - 'text' => 'Anda dapat menutup laman ini sekarang', + 'text' => 'Kamu dapat menutup tab/jendela ini sekarang', 'title' => 'Verifikasi selesai', ], diff --git a/resources/lang/id/api.php b/resources/lang/id/api.php index c767b65c0d9..dfdf23a87f0 100644 --- a/resources/lang/id/api.php +++ b/resources/lang/id/api.php @@ -8,26 +8,26 @@ 'chat' => [ 'empty' => 'Tidak dapat mengirim pesan kosong.', 'limit_exceeded' => 'Anda mengirim pesan terlalu cepat, harap tunggu sebentar sebelum mencoba lagi.', - 'too_long' => 'Pesan yang hendak Anda kirim terlalu panjang.', + 'too_long' => 'Pesan yang ingin dikirim terlalu panjang.', ], ], 'scopes' => [ 'bot' => 'Bertindak selaku chat bot.', - 'identify' => 'Mengenali diri Anda dan membaca profil publik Anda.', + 'identify' => 'Mengenali dirimu dan membaca profil publik milikmu.', 'chat' => [ - 'write' => 'Mengirim pesan atas nama akun Anda.', + 'write' => 'Mengirim pesan atas nama akunmu.', ], 'forum' => [ - 'write' => 'Membuat dan menyunting topik forum serta postingan forum atas nama akun Anda.', + 'write' => 'Membuat dan menyunting topik forum serta postingan forum atas nama akunmu.', ], 'friends' => [ - 'read' => 'Melihat siapa saja yang Anda ikuti.', + 'read' => 'Melihat siapa saja yang kamu ikuti.', ], - 'public' => 'Membaca data yang bersifat publik atas nama akun Anda.', + 'public' => 'Membaca data yang bersifat publik atas nama akunmu.', ], ]; diff --git a/resources/lang/id/artist.php b/resources/lang/id/artist.php index 3e6da538584..52e7d49fd4e 100644 --- a/resources/lang/id/artist.php +++ b/resources/lang/id/artist.php @@ -51,7 +51,7 @@ 'artist' => 'Artis', 'bpm_gte' => 'BPM Minimal', 'bpm_lte' => 'BPM Maksimal', - 'empty' => 'Tidak ada lagu yang sesuai dengan kriteria pencarian Anda.', + 'empty' => 'Tidak ada lagu yang sesuai dengan kriteria pencarian yang ditentukan.', 'genre' => 'Aliran', 'genre_all' => 'Semua', 'length_gte' => 'Durasi Minimal', diff --git a/resources/lang/id/authorization.php b/resources/lang/id/authorization.php index 7c03ad50a86..38d5f9ea8c2 100644 --- a/resources/lang/id/authorization.php +++ b/resources/lang/id/authorization.php @@ -4,9 +4,9 @@ // See the LICENCE file in the repository root for full licence text. return [ - 'play_more' => 'Mengapa Anda tidak mencoba untuk bermain osu! terlebih dahulu?', + 'play_more' => 'Mengapa kamu tidak mencoba untuk bermain terlebih dahulu?', 'require_login' => 'Silakan masuk untuk melanjutkan.', - 'require_verification' => 'Silakan verifikasi diri Anda untuk melanjutkan.', + 'require_verification' => 'Silakan verifikasi untuk melanjutkan.', 'restricted' => "Tidak dapat melakukan hal itu saat dibatasi.", 'silenced' => "Tidak dapat melakukan hal itu saat dibungkam.", 'unauthorized' => 'Akses ditolak.', @@ -20,7 +20,7 @@ 'exhausted' => 'Anda telah mencapai batas nominasi Anda untuk hari ini, silakan coba lagi besok.', 'incorrect_state' => 'Terjadi kesalahan pada saat melangsungkan tindakan. Silakan muat ulang laman.', 'owner' => "Tidak dapat menominasikan beatmap buatan sendiri.", - 'set_metadata' => 'Anda harus terlebih dahulu mengatur aliran dan bahasa sebelum beatmap ini dapat dinominasikan.', + 'set_metadata' => 'Kamu harus terlebih dahulu menentukan aliran dan bahasa sebelum menominasikan beatmap.', ], 'resolve' => [ 'not_owner' => 'Hanya pemilik topik dan beatmap yang dapat menyelesaikan diskusi.', @@ -40,14 +40,14 @@ 'beatmap_discussion_post' => [ 'destroy' => [ - 'not_owner' => 'Anda hanya dapat menghapus postingan milik Anda sendiri.', - 'resolved' => 'Anda tidak dapat menghapus postingan pada topik diskusi yang telah terjawab.', + 'not_owner' => 'Kamu hanya dapat menghapus postingan milik diri sendiri.', + 'resolved' => 'Kamu tidak dapat menghapus postingan pada topik diskusi yang telah ditandai terjawab.', 'system_generated' => 'Postingan yang dibuat otomatis tidak dapat dihapus.', ], 'edit' => [ 'not_owner' => 'Hanya pemilik topik yang diperbolehkan untuk menyunting kiriman.', - 'resolved' => 'Anda tidak dapat menyunting postingan pada topik diskusi yang telah terjawab.', + 'resolved' => 'Kamu tidak dapat menyunting postingan pada topik diskusi yang telah terjawab.', 'system_generated' => 'Post yang dihasilkan secara otomatis tidak dapat disunting.', ], @@ -58,19 +58,19 @@ 'beatmapset' => [ 'metadata' => [ - 'nominated' => 'Anda tidak dapat mengubah pengaturan metadata pada beatmap yang telah dinominasikan sebelumnya. Harap hubungi BN atau NAT apabila Anda merasa ada suatu hal yang perlu diubah.', + '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.', ], ], 'chat' => [ 'annnonce_only' => 'Kanal ini hanya dikhususkan untuk pengumuman.', - 'blocked' => 'Tidak dapat mengirim pesan kepada pengguna yang diblokir atau memblokir Anda.', + 'blocked' => 'Pesan tidak dapat dikirim kepada pengguna yang kamu blokir atau memblokir dirimu.', 'friends_only' => 'Pengguna memblokir pesan dari orang yang tidak dalam daftar temannya.', 'moderated' => 'Kanal percakapan ini sedang dimoderasi.', 'no_access' => 'Anda tidak memiliki akses ke kanal percakapan ini.', - 'receive_friends_only' => 'Pengguna ini tidak akan dapat membalas pesan Anda karena Anda hanya menerima pesan dari nama-nama yang tertera pada daftar teman Anda.', - 'restricted' => 'Anda tidak dapat mengirim pesan pada saat akun Anda sedang di-silence, di-restrict, atau di-ban.', - 'silenced' => 'Anda tidak dapat mengirim pesan pada saat akun Anda sedang di-silence, di-restrict, atau di-ban.', + 'receive_friends_only' => 'Pengguna ini tidak akan dapat membalas pesanmu karena kamu hanya menerima pesan dari nama-nama yang tertera pada daftar temanmu.', + 'restricted' => 'Kamu tidak dapat mengirim pesan pada saat akunmu sedang di-silence, di-restrict, atau di-ban.', + 'silenced' => 'Kamu tidak dapat mengirim pesan pada saat akunmu sedang di-silence, di-restrict, atau di-ban.', ], 'comment' => [ @@ -86,8 +86,8 @@ 'voting_over' => 'Anda tidak dapat mengubah pilihan Anda setelah periode pemungutan suara untuk kontes ini telah berakhir.', 'entry' => [ - 'limit_reached' => 'Anda telah mencapai batas entri untuk kontes ini', - 'over' => 'Terima kasih telah mengirimkan entri Anda! Meskipun demikian, dengan sangat menyesal kami harus memberi tahu Anda bahwa tahapan penyerahan entri untuk kontes ini telah berakhir. Mohon maaf sebelumnya!', + 'limit_reached' => 'Kamu telah mencapai batas entri untuk kontes ini', + 'over' => 'Terima kasih telah mengirimkan entrimu! Submisi untuk kontes ini telah ditutup dan pemungutan suara akan segera berlangsung.', ], ], @@ -100,59 +100,59 @@ 'delete' => [ 'only_last_post' => 'Hanya kiriman terakhir yang dapat dihapus.', 'locked' => 'Tidak dapat menghapus kiriman di topik yang telah dikunci.', - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang ingin Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', 'not_owner' => 'Hanya pemilik topik yang dapat menghapus kiriman.', ], 'edit' => [ 'deleted' => 'Tidak dapat menyunting postingan yang telah dihapus.', 'locked' => 'Topik telah dikunci, sehingga penyuntingan kiriman tidak lagi dapat dilakukan.', - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang ingin Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', 'not_owner' => 'Hanya pemilik topik yang dapat menyunting kiriman.', 'topic_locked' => 'Tidak dapat menyunting kiriman di topik yang telah dikunci.', ], 'store' => [ - 'play_more' => 'Anda harus terlebih dahulu bermain sebelum Anda dapat membuat post di forum! Apabila Anda mengalami masalah saat bermain, silakan kunjungi forum Help & Support.', - 'too_many_help_posts' => "Anda harus lebih banyak bermain sebelum Anda dapat membuat postingan tambahan. Apabila Anda masih membutuhkan bantuan lebih lanjut, silakan kirim email ke support@ppy.sh", // FIXME: unhardcode email address. + 'play_more' => 'Kamu harus terlebih dahulu bermain sebelum kamu dapat membuat postingan pada forum! Apabila kamu mengalami masalah saat bermain, silakan kunjungi forum Help & Support.', + 'too_many_help_posts' => "Kamu harus lebih banyak bermain sebelum kamu dapat membuat postingan tambahan. Apabila kamu masih memerlukan bantuan lebih lanjut, silakan kirim email ke support@ppy.sh", // FIXME: unhardcode email address. ], ], 'topic' => [ 'reply' => [ - 'double_post' => 'Mohon sunting postingan terakhir Anda alih-alih membuat postingan baru.', + 'double_post' => 'Mohon sunting postingan terakhirmu alih-alih membuat postingan baru.', 'locked' => 'Tidak dapat mengirimkan balasan pada topik yang telah dikunci.', - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang ingin Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', 'no_permission' => 'Tidak memiliki izin untuk membalas.', 'user' => [ 'require_login' => 'Silakan masuk untuk membalas.', - 'restricted' => "Anda tidak dapat mengirimkan balasan ketika akun Anda sedang di-restrict.", - 'silenced' => "Anda tidak dapat mengirimkan balasan ketika akun Anda sedang di-silence.", + 'restricted' => "Kamu tidak dapat mengirimkan balasan ketika akunmu sedang di-restrict.", + 'silenced' => "Kamu tidak dapat mengirimkan balasan ketika akunmu sedang di-silence.", ], ], 'store' => [ - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang ingin Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', 'no_permission' => 'Tidak memiliki izin untuk membuat topik baru.', 'forum_closed' => 'Forum ditutup sehingga tidak dapat membuat postingan.', ], 'vote' => [ - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang ingin Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', 'over' => 'Polling selesai dan tidak dapat dipilih lagi.', - 'play_more' => 'Anda harus lebih banyak bermain sebelum Anda dapat memberikan suara pada forum.', + 'play_more' => 'Kamu harus lebih banyak bermain sebelum kamu dapat memberikan suara pada forum.', 'voted' => 'Pengubahan suara tidak diizinkan.', 'user' => [ 'require_login' => 'Silakan masuk untuk memberikan suara.', - 'restricted' => "Anda tidak dapat memberikan suara ketika akun Anda sedang di-restrict.", + 'restricted' => "Kamu tidak dapat memberikan suara ketika akunmu sedang di-restrict.", 'silenced' => "Tidak dapat memberikan suara saat di-silence.", ], ], 'watch' => [ - 'no_forum_access' => 'Anda tidak memiliki akses ke forum yang hendak Anda tuju.', + 'no_forum_access' => 'Kamu tidak memiliki akses ke forum yang dituju.', ], ], diff --git a/resources/lang/id/beatmap_discussions.php b/resources/lang/id/beatmap_discussions.php index 4152e4da0dc..5425cea3c92 100644 --- a/resources/lang/id/beatmap_discussions.php +++ b/resources/lang/id/beatmap_discussions.php @@ -6,7 +6,7 @@ return [ 'authorizations' => [ 'update' => [ - 'null_user' => 'Anda harus masuk untuk dapat menyunting.', + 'null_user' => 'Kamu harus masuk untuk menyunting.', 'system_generated' => 'Post yang dibuat secara otomatis tidak dapat disunting.', 'wrong_user' => 'Hanya pembuat post yang diperbolehkan untuk menyunting post.', ], @@ -53,8 +53,8 @@ ], 'nearby_posts' => [ - 'confirm' => 'Saya tidak menemukan adanya postingan yang membahas isu yang hendak saya angkat', - 'notice' => 'Terdapat postingan lain di sekitar :timestamp (:existing_timestamps). Harap periksa apakah isu yang hendak Anda angkat telah dibahas oleh pengguna lain sebelumnya.', + 'confirm' => 'Saya tidak menemukan adanya postingan yang membahas isu yang ingin saya angkat', + 'notice' => 'Terdapat postingan lain di sekitar :timestamp (:existing_timestamps). Harap periksa apakah isu yang ingin kamu angkat telah dibahas oleh pengguna lain sebelumnya.', 'unsaved' => ':count pada kajian ini', ], diff --git a/resources/lang/id/beatmappacks.php b/resources/lang/id/beatmappacks.php index 095d9abee50..9ff45e42118 100644 --- a/resources/lang/id/beatmappacks.php +++ b/resources/lang/id/beatmappacks.php @@ -11,9 +11,9 @@ 'blurb' => [ 'important' => 'BACA INI SEBELUM MENGUNDUH', - 'install_instruction' => 'Petunjuk Pemasangan: Setelah paket beatmap selesai diunduh, ekstrak berkas. rar yang Anda peroleh ke dalam folder Songs yang terdapat pada direktori osu! Anda.', + 'install_instruction' => 'Petunjuk Pemasangan: Setelah paket beatmap selesai diunduh, ekstrak berkas. rar yang kamu peroleh ke dalam folder Songs yang terdapat pada direktori osu! milikmu.', 'note' => [ - '_' => 'Kami menyarankan Anda untuk :scary karena pada umumnya beatmap keluaran terdahulu memiliki kualitas yang jauh lebih rendah dibanding beatmap modern.', + '_' => 'Kami menyarankanmu untuk :scary karena beatmap keluaran terdahulu pada umumnya memiliki kualitas yang jauh lebih rendah dibanding beatmap modern.', 'scary' => 'mengunduh paket beatmap mulai dari yang paling baru hingga yang paling awal', ], ], @@ -26,8 +26,8 @@ 'not_cleared' => 'belum dimainkan', ], 'no_diff_reduction' => [ - '_' => 'Anda tidak dapat menggunakan :link untuk menuntaskan paket beatmap ini.', - 'link' => 'mod pengurang kesulitan', + '_' => ':link tidak dapat digunakan untuk menuntaskan paket beatmap ini.', + 'link' => 'Mod pengurang kesulitan', ], ], @@ -39,7 +39,7 @@ ], 'require_login' => [ - '_' => 'Anda harus :link untuk mengunduh', + '_' => 'Kamu harus :link untuk mengunduh', 'link_text' => 'masuk', ], ]; diff --git a/resources/lang/id/beatmaps.php b/resources/lang/id/beatmaps.php index 4e79ffd5e38..905b47907e4 100644 --- a/resources/lang/id/beatmaps.php +++ b/resources/lang/id/beatmaps.php @@ -22,10 +22,10 @@ 'kudosu_denied' => 'Perolehan kudosu ditolak.', 'message_placeholder_deleted_beatmap' => 'Tingkat kesulitan ini telah dihapus sehingga diskusi lebih lanjut tidak lagi diperkenankan.', 'message_placeholder_locked' => 'Laman diskusi pada beatmap ini telah ditutup.', - 'message_placeholder_silenced' => "Anda tidak dapat membuka topik diskusi baru ketika akun Anda sedang di-silence.", + 'message_placeholder_silenced' => "Kamu tidak dapat membuka topik diskusi baru ketika akunmu sedang di-silence.", 'message_type_select' => 'Pilih Jenis Komentar', 'reply_notice' => 'Tekan enter untuk membalas.', - 'reply_placeholder' => 'Ketik balasan Anda di sini', + 'reply_placeholder' => 'Ketik balasanmu di sini', 'require-login' => 'Silakan masuk untuk membuka topik bahasan baru atau mengirimkan balasan', 'resolved' => 'Terjawab', 'restore' => 'pulihkan', @@ -50,7 +50,7 @@ 'prompt' => [ 'lock' => 'Alasan penguncian', - 'unlock' => 'Apakah Anda yakin untuk membuka kembali topik diskusi ini?', + 'unlock' => 'Apakah kamu yakin untuk membuka kunci topik diskusi ini?', ], ], @@ -92,7 +92,7 @@ 'new' => [ 'pin' => 'Sematkan', 'timestamp' => 'Keterangan Waktu', - 'timestamp_missing' => 'salin (ctrl+c) objek-objek yang Anda kehendaki di editor dan tempelkan (ctrl+v) pada boks di atas untuk membubuhkan keterangan waktu!', + 'timestamp_missing' => 'salin (ctrl+c) objek di editor dan tempelkan (ctrl+v) pada boks di atas untuk membubuhkan keterangan waktu!', 'title' => 'Topik Diskusi Baru', 'unpin' => 'Lepas sematan', ], @@ -105,7 +105,7 @@ 'unlink' => 'Hapus Tautan', 'unsaved' => 'Belum Tersimpan', 'timestamp' => [ - 'all-diff' => 'Anda tidak dapat membubuhkan keterangan waktu pada topik diskusi yang tertuju pada "Umum (Seluruh tingkat kesulitan)".', + 'all-diff' => 'Kamu tidak dapat membubuhkan keterangan waktu pada topik diskusi yang tertuju pada "Umum (Seluruh tingkat kesulitan)".', 'diff' => 'Apabila terdapat keterangan waktu pada :type ini, topik diskusi yang bersangkutan akan muncul pada Linimasa.', ], ], @@ -160,11 +160,11 @@ 'hype' => [ 'button' => 'Berikan Hype!', 'button_done' => 'Telah di-Hype!', - 'confirm' => "Apakah Anda yakin? Dengan ini, Anda akan memberikan 1 hype kepada beatmap ini dari :n hype yang Anda miliki saat ini. Tindakan ini tidak dapat diurungkan.", - 'explanation' => 'Berikanlah hype Anda untuk membawa beatmap ini lebih dekat menuju Ranked!', + 'confirm' => "Apakah kamu yakin? Dengan ini, kamu akan memberikan 1 hype kepada beatmap ini dari :n hype yang kamu miliki saat ini. Tindakan ini tidak dapat diurungkan.", + 'explanation' => 'Berikan hype-mu untuk membawa beatmap ini lebih dekat menuju Ranked!', 'explanation_guest' => 'Masuk dan berikan hype kepada beatmap ini agar beatmap ini dapat segera dinominasikan dan di-rank!', 'new_time' => "Anda akan mendapatkan hype tambahan :new_time.", - 'remaining' => 'Anda memiliki :remaining hype tersisa.', + 'remaining' => 'Kamu memiliki :remaining hype tersisa.', 'required_text' => 'Hype: :current/:required', 'section_title' => 'Hype Train', 'title' => 'Hype', @@ -176,8 +176,8 @@ 'nominations' => [ 'delete' => 'Hapus', - 'delete_own_confirm' => 'Apa Anda yakin? Beatmap yang dipilih akan dihapus dan Anda akan dialihkan kembali ke profil Anda.', - 'delete_other_confirm' => 'Apa Anda yakin? Beatmap yang dipilih akan dihapus dan Anda akan dialihkan kembali ke profil pengguna.', + 'delete_own_confirm' => 'Apakah kamu yakin? Beatmap yang dipilih akan dihapus dan kamu akan dialihkan kembali ke laman profilmu.', + 'delete_other_confirm' => 'Apakah kamu yakin? Beatmap yang dipilih akan dihapus dan kamu akan dialihkan kembali ke laman profil pengguna yang bersangkutan.', 'disqualification_prompt' => 'Alasan diskualifikasi?', 'disqualified_at' => 'Didiskualifikasi pada :time_ago (:reason).', 'disqualified_no_reason' => 'tidak ada alasan yang diberikan', @@ -209,9 +209,9 @@ ], 'reset_confirm' => [ - 'disqualify' => 'Apakah Anda yakin? Tindakan ini akan melepas beatmap ini dari kategori Qualified dan mengulang proses nominasi dari awal.', - 'nomination_reset' => 'Apakah Anda yakin? Memposting masalah baru akan mengulang proses nominasi.', - 'problem_warning' => 'Apakah Anda yakin untuk melaporkan masalah yang terdapat pada beatmap ini? Tindakan ini akan memperingatkan seluruh anggota Beatmap Nominator.', + 'disqualify' => 'Apakah kamu yakin? Tindakan ini akan melepas beatmap ini dari kategori Qualified dan mengulang proses nominasi dari awal.', + 'nomination_reset' => 'Apakah kamu yakin? Memposting masalah baru akan mengulang proses nominasi.', + 'problem_warning' => 'Apakah kamu yakin untuk melaporkan masalah yang terdapat pada beatmap ini? Tindakan ini akan memperingatkan seluruh anggota Beatmap Nominator.', ], ], diff --git a/resources/lang/id/beatmapset_events.php b/resources/lang/id/beatmapset_events.php index 5aa1f26a4f4..585eb3c508a 100644 --- a/resources/lang/id/beatmapset_events.php +++ b/resources/lang/id/beatmapset_events.php @@ -36,7 +36,7 @@ 'remove_from_loved' => 'Dilepas dari Loved oleh :user. (:text)', 'nsfw_toggle' => [ - 'to_0' => 'Tanda eksplisit telah dilepas', + 'to_0' => 'Tanda eksplisit dilepas', 'to_1' => 'Ditandai eksplisit', ], ], diff --git a/resources/lang/id/beatmapset_watches.php b/resources/lang/id/beatmapset_watches.php index 72f6335c3e5..b98bc997d79 100644 --- a/resources/lang/id/beatmapset_watches.php +++ b/resources/lang/id/beatmapset_watches.php @@ -5,7 +5,7 @@ return [ 'index' => [ - 'description' => 'Berikut merupakan laman diskusi beatmap yang tengah Anda ikuti. Anda akan menerima notifikasi setiap kali terdapat perkembangan baru pada laman diskusi yang bersangkutan.', + 'description' => 'Berikut merupakan laman diskusi beatmap yang tengah diikuti. Kamu akan menerima notifikasi setiap kali terdapat perkembangan baru pada laman diskusi yang tertera di bawah ini.', 'title_compact' => 'daftar pengamatan beatmap', 'counts' => [ @@ -14,7 +14,7 @@ ], 'table' => [ - 'empty' => 'Anda tidak sedang mengikuti laman diskusi beatmap manapun.', + 'empty' => 'Kamu tidak sedang mengikuti laman diskusi beatmap manapun.', 'last_update' => 'Pembaruan terakhir', 'open_issues' => 'Isu yang belum terjawab', 'state' => 'Status', diff --git a/resources/lang/id/beatmapsets.php b/resources/lang/id/beatmapsets.php index a9e1c4f3586..b19da196d70 100644 --- a/resources/lang/id/beatmapsets.php +++ b/resources/lang/id/beatmapsets.php @@ -16,7 +16,7 @@ ], 'download' => [ - 'limit_exceeded' => 'Jangan terlalu bernafsu dalam mengunduh. Mainkan beatmap yang telah Anda miliki terlebih dahulu.', + 'limit_exceeded' => 'Jangan terlalu bernafsu dalam mengunduh. Mainkan beatmap yang telah kamu miliki terlebih dahulu.', ], 'featured_artist_badge' => [ @@ -40,16 +40,16 @@ ], 'nominate' => [ - 'hybrid_requires_modes' => 'Pada beatmap hybrid, Anda harus memilih setidaknya satu mode permainan untuk dinominasikan.', - 'incorrect_mode' => 'Anda tidak memiliki hak untuk memberikan nominasi pada mode permainan: :mode', - 'full_bn_required' => 'Anda harus berstatus sebagai nominator penuh (full nominator) untuk dapat menominasikan beatmap ini.', + 'hybrid_requires_modes' => 'Pada beatmap hybrid, kamu harus memilih setidaknya satu mode permainan untuk dinominasikan.', + 'incorrect_mode' => 'Kamu tidak memiliki hak untuk memberikan nominasi pada mode permainan: :mode', + 'full_bn_required' => 'Kmau harus berstatus sebagai nominator penuh (full nominator) untuk menominasikan beatmap ini.', 'too_many' => 'Persyaratan nominasi telah terpenuhi.', 'dialog' => [ - 'confirmation' => 'Apakah Anda yakin untuk menominasikan beatmap ini?', + 'confirmation' => 'Apakah kamu yakin untuk menominasikan beatmap ini?', 'header' => 'Nominasikan Beatmap', - 'hybrid_warning' => 'catatan: Anda hanya dapat memberikan satu nominasi, sehingga pastikan Anda memberikan nominasi pada mode permainan yang memang Anda kehendaki', - 'which_modes' => 'Mode permainan mana yang hendak Anda nominasikan?', + 'hybrid_warning' => 'catatan: kamu hanya dapat memberikan satu nominasi, sehingga pastikan kamu memberikan nominasi pada mode permainan yang memang dikehendaki', + 'which_modes' => 'Mode permainan mana yang ingin dinominasikan?', ], ], @@ -66,6 +66,7 @@ 'favourite_login' => 'Silakan masuk untuk menambahkan beatmap ini ke Beatmap Favorit', 'logged-out' => 'Anda harus masuk sebelum mengunduh beatmap!', 'mapped_by' => 'dibuat oleh :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Hapus beatmap ini dari daftar Beatmap Favorit', 'updated_timeago' => 'terakhir diperbarui :timeago', @@ -92,11 +93,11 @@ ], 'favourites' => [ - 'limit_reached' => 'Anda memiliki terlalu banyak beatmap yang telah Anda favoritkan! Mohon hapus beberapa beatmap dari daftar favorit Anda sebelum melanjutkan.', + 'limit_reached' => 'Kamu memiliki terlalu banyak beatmap yang telah difavoritkan! Mohon hapus beberapa beatmap dari daftar favoritmu sebelum melanjutkan.', ], 'hype' => [ - 'action' => 'Apabila Anda menyukai beatmap ini, berikanlah hype Anda agar beatmap ini dapat selangkah lebih dekat menuju status Ranked.', + 'action' => 'Apabila kamu menyukai beatmap ini, berikanlah hype-mu agar beatmap ini dapat selangkah lebih dekat menuju status Ranked.', 'current' => [ '_' => 'Beatmap ini sedang berstatus :status.', @@ -109,11 +110,11 @@ ], 'disqualify' => [ - '_' => 'Apabila Anda menemukan suatu masalah pada beatmap ini, mohon diskualifikasi beatmap yang bersangkutan melalui :link.', + '_' => 'Apabila kamu menemukan suatu masalah pada beatmap ini, mohon diskualifikasi beatmap yang bersangkutan melalui :link.', ], 'report' => [ - '_' => 'Apabila Anda menemukan suatu masalah pada beatmap ini, mohon laporkan kepada tim kami melalui :link.', + '_' => 'Apabila kamu menemukan suatu masalah pada beatmap ini, mohon laporkan kepada tim kami melalui :link.', 'button' => 'Laporkan Masalah', 'link' => 'tautan ini', ], @@ -136,7 +137,7 @@ ], 'nsfw_warning' => [ - 'details' => 'Beatmap ini ditenggarai mengandung konten yang bersifat eksplisit dan/atau konten yang dapat dianggap menyinggung bagi kalangan tertentu. Apakah Anda tetap ingin melihat beatmap ini?', + 'details' => 'Beatmap ini mengandung konten yang bersifat eksplisit dan/atau konten yang dapat dianggap menyinggung bagi kalangan tertentu. Apakah kamu tetap ingin melihat beatmap ini?', 'title' => 'Konten Eksplisit', 'buttons' => [ @@ -152,8 +153,8 @@ 'error' => 'Gagal memuat peringkat', 'friend' => 'Peringkat Teman', 'global' => 'Peringkat Global', - 'supporter-link' => 'Klik di sini untuk melihat seluruh fitur menarik yang akan Anda dapatkan!', - 'supporter-only' => 'Anda harus menjadi supporter untuk mengakses fitur peringkat teman dan negara!', + 'supporter-link' => 'Klik di sini untuk melihat seluruh fitur menarik yang akan kamu peroleh!', + 'supporter-only' => 'Kamu harus menjadi osu!supporter untuk mengakses papan peringkat teman, negara, atau mod!', 'title' => 'Papan Skor', 'headers' => [ @@ -172,17 +173,17 @@ 'no_scores' => [ 'country' => 'Tidak seorang pun dari negara Anda yang memiliki skor di map ini!', - 'friend' => 'Anda tidak memiliki teman yang telah menorehkan skor di map ini!', - 'global' => 'Belum ada skor yang tercatat pada beatmap ini. Mungkin Anda tertarik untuk mencetak skor Anda sendiri?', + 'friend' => 'Kamu tidak memiliki teman yang telah menorehkan skor pada map ini!', + 'global' => 'Belum ada skor yang tercatat. Mungkin kamu tertarik untuk mencetak skormu sendiri?', 'loading' => 'Memuat skor...', 'unranked' => 'Beatmap ini tidak berstatus Ranked.', ], 'score' => [ 'first' => 'Di Posisi Pertama', - 'own' => 'Skor Terbaik Anda', + 'own' => 'Skor Terbaikmu', ], 'supporter_link' => [ - '_' => 'Klik :here untuk melihat seluruh fitur menarik yang akan Anda dapatkan!', + '_' => 'Klik :here untuk melihat seluruh fitur menarik yang akan kamu peroleh!', 'here' => 'di sini', ], ], diff --git a/resources/lang/id/changelog.php b/resources/lang/id/changelog.php index 52077215c29..0f3f28c3110 100644 --- a/resources/lang/id/changelog.php +++ b/resources/lang/id/changelog.php @@ -33,8 +33,8 @@ 'support' => [ 'heading' => 'Suka dengan pembaruan ini?', - 'text_1' => 'Dukung osu! agar dapat terus berkembang dan :link sekarang juga!', + 'text_1' => 'Dukung osu! untuk terus berkembang dan :link sekarang juga!', 'text_1_link' => 'jadilah seorang osu!supporter', - 'text_2' => 'Di samping mempercepat pengembangan, Anda juga akan memperoleh berbagai fitur tambahan dan opsi personalisasi lainnya!', + 'text_2' => 'Di samping mempercepat pengembangan, kamu juga akan memperoleh berbagai fitur tambahan dan opsi personalisasi lainnya!', ], ]; diff --git a/resources/lang/id/chat.php b/resources/lang/id/chat.php index 70ba665d975..c5db2617591 100644 --- a/resources/lang/id/chat.php +++ b/resources/lang/id/chat.php @@ -10,12 +10,12 @@ 'title_compact' => 'chat', 'cannot_send' => [ - 'channel' => 'Anda sedang tidak dapat mengirimkan pesan pada channel ini.', - 'user' => 'Anda sedang tidak dapat mengirimkan pesan kepada pengguna ini.', + 'channel' => 'Kamu sedang tidak dapat mengirimkan pesan pada kanal percakapan ini.', + 'user' => 'Kamu sedang tidak dapat mengirimkan pesan kepada pengguna ini.', ], 'channels' => [ - 'confirm_part' => 'Apakah Anda ingin menyembunyikan kanal percakapan ini? Anda akan tetap menerima pesan dari kanal percakapan ini.', + 'confirm_part' => 'Apakah kamu ingin menyembunyikan kanal percakapan ini? Kamu akan tetap menerima pesan dari kanal percakapan ini.', 'create' => 'buat pengumuman', 'list' => [ @@ -41,7 +41,7 @@ ], 'not_found' => [ - 'message' => 'Tidak ada apa-apa di sini. Mungkin Anda telah meninggalkan kanal percakapan ini atau kanal yang hendak Anda tuju sudah tidak ada...', + 'message' => 'Tidak ada apa-apa di sini. Mungkin kamu telah meninggalkan kanal percakapan ini atau kanal yang ingin kamu tuju sudah tidak ada...', 'title' => 'kanal percakapan tidak ditemukan', ], @@ -55,7 +55,7 @@ 'no-conversations' => [ 'howto' => "Mulailah percakapan baru melalui tombol yang tertera pada laman profil atau kartu pop-up pengguna.", - 'lazer' => 'Kanal percakapan publik yang Anda buka melalui osu!lazer juga akan terlihat di sini.', + 'lazer' => 'Kanal percakapan publik yang kamu buka melalui osu!lazer juga akan terlihat di sini.', 'title' => 'belum ada percakapan', ], ]; diff --git a/resources/lang/id/client_verifications.php b/resources/lang/id/client_verifications.php index 1b9687bc50b..82726dd0719 100644 --- a/resources/lang/id/client_verifications.php +++ b/resources/lang/id/client_verifications.php @@ -7,7 +7,7 @@ 'completed' => [ 'home' => 'Buka dasbor', 'logout' => 'Keluar', - 'text' => 'Anda dapat menutup laman ini sekarang', + 'text' => 'Kamu dapat menutup tab/jendela ini sekarang', 'title' => 'verifikasi klien osu! berhasil', ], diff --git a/resources/lang/id/comments.php b/resources/lang/id/comments.php index 6eedd0eef17..cdf8020ed58 100644 --- a/resources/lang/id/comments.php +++ b/resources/lang/id/comments.php @@ -24,7 +24,7 @@ 'editor' => [ 'textarea_hint' => [ - '_' => 'Tekan enter untuk mengirimkan :action Anda. Gunakan shift+enter untuk memulai baris baru.', + '_' => 'Tekan enter untuk mengirimkan :action. Gunakan shift+enter untuk memulai baris baru.', 'edit' => 'simpan', 'new' => 'komentar', 'reply' => 'balas', @@ -45,7 +45,7 @@ 'placeholder' => [ 'edit' => 'Sunting komentar di sini', 'new' => 'Ketik komentar baru di sini', - 'reply' => 'Ketik balasan Anda di sini', + 'reply' => 'Ketik balasanmu di sini', ], 'show' => [ diff --git a/resources/lang/id/common.php b/resources/lang/id/common.php index 83eeddd11e6..f52f1026275 100644 --- a/resources/lang/id/common.php +++ b/resources/lang/id/common.php @@ -4,8 +4,8 @@ // See the LICENCE file in the repository root for full licence text. return [ - 'confirmation' => 'Apakah Anda yakin?', - 'confirmation_unsaved' => 'Segala perubahan yang tidak disimpan akan hilang. Apakah Anda yakin?', + 'confirmation' => 'Apakah kamu yakin?', + 'confirmation_unsaved' => 'Segala perubahan yang tidak disimpan akan hilang. Apakah kamu yakin?', 'saved' => 'Tersimpan', 'array_and' => [ @@ -157,7 +157,7 @@ ], 'wrong_user' => [ - '_' => 'Anda terdaftar masuk sebagai :user. :logout_link.', + '_' => 'Kamu terdaftar masuk sebagai :user. :logout_link.', 'logout_link' => 'Klik di sini untuk masuk sebagai pengguna lain', ], ]; diff --git a/resources/lang/id/contest.php b/resources/lang/id/contest.php index 82720ce7f84..533333f59c6 100644 --- a/resources/lang/id/contest.php +++ b/resources/lang/id/contest.php @@ -19,13 +19,13 @@ 'show_voted_only' => 'Tampilkan pilihan', 'best_of' => [ - 'none_played' => "Sepertinya Anda belum pernah memainkan beatmap manapun yang terdaftar pada kontes ini!", + 'none_played' => "Sepertinya kamu belum memainkan beatmap mana pun yang terdaftar pada kontes ini!", ], 'button' => [ 'add' => 'Pilih', 'remove' => 'Hapus pilihan', - 'used_up' => 'Anda telah mempergunakan seluruh hak suara yang Anda miliki', + 'used_up' => 'Kamu telah menggunakan seluruh hak suara yang kamu miliki', ], 'progress' => [ @@ -34,16 +34,16 @@ 'requirement' => [ 'playlist_beatmapsets' => [ - 'incomplete_play' => 'Anda harus memainkan seluruh beatmap yang tertera pada playlist yang ditentukan untuk dapat memberikan suara', + 'incomplete_play' => 'Seluruh beatmap yang terkandung pada playlist yang ditentukan harus terlebih dahulu dimainkan sebelum memberikan suara', ], ], ], 'entry' => [ '_' => 'entri', 'login_required' => 'Silakan masuk untuk mengikuti kontes.', - 'silenced_or_restricted' => 'Anda tidak dapat mengikuti kontes ketika akun Anda sedang di-restrict atau di-silence.', + 'silenced_or_restricted' => 'Kamu tidak dapat mengikuti kontes ketika kamu sedang di-restrict atau di-silence.', 'preparation' => 'Kami sedang mempersiapkan kontes ini. Harap bersabar!', - 'drop_here' => 'Letakkan entri Anda di sini', + 'drop_here' => 'Letakkan entrimu di sini', 'download' => 'Unduh .osz', 'wrong_type' => [ 'art' => 'Kontes ini hanya menerima berkas dengan ekstensi .jpg dan .png.', diff --git a/resources/lang/id/errors.php b/resources/lang/id/errors.php index d27e8fe361c..2c6418bcdd9 100644 --- a/resources/lang/id/errors.php +++ b/resources/lang/id/errors.php @@ -5,8 +5,8 @@ return [ 'missing_route' => 'URL yang dituju tidak valid, atau terdapat suatu masalah dalam proses pengambilan data dari server.', - 'no_restricted_access' => 'Anda tidak dapat melakukan tindakan ini ketika akun Anda sedang di-restrict.', - 'supporter_only' => 'Anda harus menjadi seorang osu!supporter untuk dapat menggunakan fitur ini.', + 'no_restricted_access' => 'Kamu tidak dapat melakukan tindakan ini ketika akunmu sedang di-restrict.', + 'supporter_only' => 'Kamu harus menjadi seorang osu!supporter untuk dapat menggunakan fitur ini.', 'unknown' => 'Terdapat masalah yang tidak diketahui.', 'codes' => [ @@ -21,7 +21,7 @@ ], ], 'beatmaps' => [ - 'invalid_mode' => 'Mode permainan yang dikehendaki tidak valid.', + 'invalid_mode' => 'Mode permainan yang ditentukan tidak valid.', 'standard_converts_only' => 'Tidak ada skor yang tercatat pada mode permainan yang dikehendaki di tingkat kesulitan ini.', ], 'checkout' => [ diff --git a/resources/lang/id/events.php b/resources/lang/id/events.php index e8d3a250b1e..95d6271d9e9 100644 --- a/resources/lang/id/events.php +++ b/resources/lang/id/events.php @@ -14,8 +14,8 @@ 'empty' => "Pengguna ini tidak melakukan aktivitas apa pun baru-baru ini!", 'rank' => ':user telah meraih peringkat #:rank pada :beatmap (:mode)', 'rank_lost' => ':user telah kehilangan peringkat pertama pada :beatmap (:mode)', - 'user_support_again' => ':user telah memutuskan untuk kembali mendukung osu! - terima kasih atas kemurahan hati Anda!', - 'user_support_first' => ':user telah menjadi seorang osu!supporter - terima kasih atas kemurahan hati Anda!', + 'user_support_again' => ':user telah memutuskan untuk kembali mendukung osu! - terima kasih atas kemurahan hatimu!', + 'user_support_first' => ':user telah menjadi seorang osu!supporter - terima kasih atas kemurahan hatimu!', 'user_support_gift' => ':user telah dihadiahkan osu! supporter!', 'username_change' => ':previousUsername telah mengubah nama penggunanya menjadi :user!', diff --git a/resources/lang/id/follows.php b/resources/lang/id/follows.php index bf009bd740c..b6884672293 100644 --- a/resources/lang/id/follows.php +++ b/resources/lang/id/follows.php @@ -24,7 +24,7 @@ ], 'mapping' => [ - 'empty' => 'Tidak ada pemeta yang diikuti.', + 'empty' => 'Kamu tidak sedang mengikuti siapapun.', 'followers' => 'pengikut mapping', 'page_title' => 'mapper yang diikuti', 'title' => 'mapper', diff --git a/resources/lang/id/forum.php b/resources/lang/id/forum.php index 63dda0c6831..891c46b9a36 100644 --- a/resources/lang/id/forum.php +++ b/resources/lang/id/forum.php @@ -15,12 +15,12 @@ 'create' => [ '_' => 'Pasang gambar sampul', 'button' => 'Unggah gambar sampul', - 'info' => 'Ukuran gambar sampul yang disarankan adalah :dimensions. Anda juga dapat meletakkan gambar Anda di sini untuk mengunggahnya.', + 'info' => 'Ukuran gambar sampul yang disarankan adalah :dimensions. Kamu juga dapat meletakkan gambar di sini untuk mengunggahnya.', ], 'destroy' => [ '_' => 'Hapus gambar sampul', - 'confirm' => 'Apakah Anda yakin ingin menghapus gambar sampul ini?', + 'confirm' => 'Apakah kamu yakin untuk menghapus gambar sampul ini?', ], ], @@ -38,13 +38,13 @@ 'mark_as_read' => [ 'forum' => 'Tandai forum ini sebagai telah dibaca', - 'forums' => 'Tandai forum-forum ini sebagai telah dibaca', + 'forums' => 'Tandai forum yang dipilih sebagai telah dibaca', 'busy' => 'Menandai sebagai telah dibaca...', ], 'post' => [ - 'confirm_destroy' => 'Apakah Anda yakin untuk menghapus post ini?', - 'confirm_restore' => 'Apakah Anda yakin untuk memulihkan post ini?', + 'confirm_destroy' => 'Apakah kamu yakin untuk menghapus post ini?', + 'confirm_restore' => 'Apakah kamu yakin untuk memulihkan post ini?', '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.', 'posted_at' => 'diposting :when', 'posted_by' => 'di-post oleh :username', @@ -75,11 +75,11 @@ ], 'topic' => [ - 'confirm_destroy' => 'Apakah Anda yakin untuk menghapus topik ini?', - 'confirm_restore' => 'Apakah Anda yakin untuk memulihkan topik ini?', + 'confirm_destroy' => 'Apakah kamu yakin untuk menghapus topik ini?', + 'confirm_restore' => 'Apakah kamu yakin untuk memulihkan topik ini?', 'deleted' => 'topik yang dihapus', 'go_to_latest' => 'lihat postingan terbaru', - 'has_replied' => 'Anda telah mengirimkan balasan pada topik ini', + 'has_replied' => 'Kamu telah mengirimkan balasan pada topik ini', 'in_forum' => 'pada forum :forum', 'latest_post' => ':when oleh :user', 'latest_reply_by' => 'balasan terbaru oleh :user', @@ -105,16 +105,16 @@ 'submit' => 'Kirim', 'necropost' => [ - 'default' => 'Topik ini sudah tidak lagi aktif. Harap untuk tidak membuat balasan baru pada topik ini kecuali apabila Anda memiliki alasan khusus untuk melakukannya.', + 'default' => 'Topik ini sudah tidak lagi aktif. Harap untuk tidak membuka balasan baru pada topik ini kecuali apabila kamu memiliki alasan khusus untuk melakukannya.', 'new_topic' => [ - '_' => "Topik ini sudah tidak lagi aktif. Apabila Anda tidak memiliki alasan khusus untuk membuat balasan baru pada topik ini, harap :create.", + '_' => "Topik ini sudah tidak lagi aktif. Apabila kamu tidak memiliki alasan khusus untuk membuka balasan baru pada topik ini, harap :create.", 'create' => 'buat topik baru', ], ], 'placeholder' => [ - 'body' => 'Ketik konten post Anda di sini', + 'body' => 'Ketik konten post di sini', 'title' => 'Klik di sini untuk mengatur judul', ], ], @@ -192,8 +192,8 @@ ], 'info' => [ - 'total' => 'Anda berlangganan :total topik.', - 'unread' => 'Anda memiliki :unread pesan balasan yang belum dibaca pada topik-topik yang Anda langgan.', + 'total' => 'Kamu berlangganan ke :total topik.', + 'unread' => 'Kamu memiliki :unread balasan yang belum dibaca pada topik yang kamu langgan.', ], ], @@ -230,11 +230,11 @@ 'hide_results_info' => 'Apabila diaktifkan, hasil suara baru akan tersedia setelah jajak pendapat berakhir.', 'length' => 'Jalankan jajak pendapat selama', 'length_days_suffix' => 'hari', - 'length_info' => 'Kosongkan apabila Anda tidak ingin menerapkan tenggat waktu pada jajak pendapat ini', + 'length_info' => 'Kosongkan apabila jajak pendapat ini tidak memiliki tenggat waktu akhir', 'max_options' => 'Pilihan per pengguna', 'max_options_info' => 'Jumlah pilihan yang dapat dipilih oleh masing-masing pengguna.', 'options' => 'Pilihan', - 'options_info' => 'Tempatkan masing-masing pilihan pada baris baru. Anda dapat menyertakan hingga 10 pilihan.', + 'options_info' => 'Tempatkan masing-masing pilihan pada baris baru. Kamu dapat menyertakan hingga 10 pilihan.', 'title' => 'Pertanyaan', 'vote_change' => 'Izinkan pemilihan ulang.', 'vote_change_info' => 'Apabila diaktifkan, para pengguna akan dapat mengubah pilihan mereka.', @@ -253,44 +253,44 @@ 'issue_tag_added' => [ 'to_0' => 'Hapus tag "added"', - 'to_0_done' => 'Tag "added" telah dihapus', + 'to_0_done' => 'Tag "added" dihapus', 'to_1' => 'Sematkan tag "added"', - 'to_1_done' => 'Tag "added" telah disematkan', + 'to_1_done' => 'Tag "added" disematkan', ], 'issue_tag_assigned' => [ 'to_0' => 'Hapus tag "assigned"', - 'to_0_done' => 'Tag "assigned" telah dihapus', + 'to_0_done' => 'Tag "assigned" dihapus', 'to_1' => 'Sematkan tag "assigned"', - 'to_1_done' => 'Tag "assigned" telah disematkan', + 'to_1_done' => 'Tag "assigned" disematkan', ], 'issue_tag_confirmed' => [ 'to_0' => 'Hapus tag "confirmed"', - 'to_0_done' => 'Tag "confirmed" telah dihapus', + 'to_0_done' => 'Tag "confirmed" dihapus', 'to_1' => 'Sematkan tag "confirmed"', - 'to_1_done' => 'Tag "confirmed" telah disematkan', + 'to_1_done' => 'Tag "confirmed" disematkan', ], 'issue_tag_duplicate' => [ 'to_0' => 'Hapus tag "duplicate"', - 'to_0_done' => 'Tag "duplilcate" telah dihapus', + 'to_0_done' => 'Tag "duplilcate" dihapus', 'to_1' => 'Sematkan tag "duplicate"', - 'to_1_done' => 'Tag "duplicate" telah disematkan', + 'to_1_done' => 'Tag "duplicate" disematkan', ], 'issue_tag_invalid' => [ 'to_0' => 'Hapus tag "invalid"', - 'to_0_done' => 'Tag "invalid" telah dihapus', + 'to_0_done' => 'Tag "invalid" dihapus', 'to_1' => 'Sematkan tag "invalid"', - 'to_1_done' => 'Tag "invalid" telah disematkan', + 'to_1_done' => 'Tag "invalid" disematkan', ], 'issue_tag_resolved' => [ 'to_0' => 'Hapus tag "resolved"', - 'to_0_done' => 'Tag "resolved" telah dihapus', + 'to_0_done' => 'Tag "resolved" dihapus', 'to_1' => 'Sematkan tag "resolved"', - 'to_1_done' => 'Tag "resolved" telah disematkan', + 'to_1_done' => 'Tag "resolved" disematkan', ], 'lock' => [ @@ -316,7 +316,7 @@ 'to_1_done' => 'Topik telah disematkan', 'to_2' => 'Sematkan topik dan tandai sebagai pengumuman', 'to_2_confirm' => 'Sematkan topik dan tandai sebagai pengumuman?', - 'to_2_done' => 'Topik telah disematkan dan ditandai sebagai pengumuman', + 'to_2_done' => 'Topik disematkan dan ditandai sebagai pengumuman', ], 'moderate_toggle_deleted' => [ @@ -340,8 +340,8 @@ 'user' => [ 'count' => '{0} tidak ada suara|{1} :count_delimited suara|[2,*] :count_delimited suara', - 'current' => 'Anda memiliki :votes tersisa.', - 'not_enough' => "Anda tidak memiliki hak suara yang tersisa", + 'current' => 'Kamu memiliki :votes tersisa.', + 'not_enough' => "Kamu tidak memiliki hak suara yang tersisa", ], ], diff --git a/resources/lang/id/home.php b/resources/lang/id/home.php index 1d8915454de..c8b8a15ce69 100644 --- a/resources/lang/id/home.php +++ b/resources/lang/id/home.php @@ -44,7 +44,7 @@ 'forum' => 'cari di forum', 'forum_children' => 'sertakan subforum', 'topic_id' => 'topik #', - 'username' => 'pemilik', + 'username' => 'pembuat post', ], ], @@ -60,7 +60,7 @@ 'login_required' => 'Masuk untuk mencari pengguna', 'more' => ':count hasil pencarian pengguna lainnya', 'more_simple' => 'Lihat hasil pencarian pengguna lainnya', - 'more_hidden' => 'Pencarian pengguna terbatas hanya untuk :max pengguna. Cobalah untuk mempersempit kriteria pencarian Anda.', + 'more_hidden' => 'Pencarian pengguna terbatas hanya untuk :max pengguna. Cobalah untuk mempersempit kriteria pencarian.', 'title' => 'Pengguna', ], @@ -72,11 +72,24 @@ ], 'download' => [ - 'tagline' => "mari persiapkan
    diri Anda!", 'action' => 'Unduh osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'osu! untuk pengguna macOS', + 'mirror' => 'tautan alternatif', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "mari persiapkan
    dirimu!", + 'video-guide' => 'panduan video', 'help' => [ - '_' => 'apabila Anda menemui suatu masalah di saat Anda hendak memulai permainan atau mendaftarkan akun, harap :help_forum_link atau :support_button.', + '_' => 'apabila kamu menemui masalah pada saat kamu ingin memulai permainan atau mendaftarkan akun, harap :help_forum_link atau :support_button.', 'help_forum_link' => 'kunjungi sub-forum Help', 'support_button' => 'hubungi layanan dukungan kami', ], @@ -86,8 +99,6 @@ 'macos' => 'untuk macOS', 'linux' => 'untuk Linux', ], - 'mirror' => 'tautan alternatif', - 'macos-fallback' => 'osu! untuk pengguna macOS', 'steps' => [ 'register' => [ 'title' => 'buat akun', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'panduan video', ], 'user' => [ diff --git a/resources/lang/id/layout.php b/resources/lang/id/layout.php index 8db6cc3e924..b9302823fe6 100644 --- a/resources/lang/id/layout.php +++ b/resources/lang/id/layout.php @@ -126,19 +126,19 @@ ], '404' => [ 'error' => 'Laman Tidak Ditemukan', - 'description' => "Maaf, namun laman yang Anda minta tidak ada di sini!", + 'description' => "Maaf, namun laman yang kamu minta tidak ada di sini!", ], '403' => [ - 'error' => "Anda tidak seharusnya berada di sini.", - 'description' => 'Anda dapat mencoba untuk kembali ke halaman sebelumnya.', + 'error' => "Kamu tidak seharusnya berada di sini.", + 'description' => 'Kamu dapat mencoba untuk kembali ke halaman sebelumnya.', ], '401' => [ - 'error' => "Anda tidak seharusnya berada di sini.", - 'description' => 'Anda dapat mencoba untuk kembali ke halaman sebelumnya. Atau mungkin coba untuk masuk terlebih dahulu.', + 'error' => "Kamu tidak seharusnya berada di sini.", + 'description' => 'Kamu dapat mencoba untuk kembali ke halaman sebelumnya. Atau mungkin coba untuk masuk terlebih dahulu.', ], '405' => [ 'error' => 'Laman Tidak Ditemukan', - 'description' => "Maaf, namun laman yang Anda minta tidak ada di sini!", + 'description' => "Maaf, namun laman yang kamu minta tidak ada di sini!", ], '422' => [ 'error' => 'Parameter yang diminta tidak valid', @@ -165,7 +165,7 @@ ], ], // used by sentry if it returns an error - 'reference' => "Untuk berjaga-jaga, berikut kode yang dapat Anda berikan kepada layanan dukungan kami!", + 'reference' => "Untuk berjaga-jaga, berikut kode yang dapat kamu berikan kepada layanan dukungan kami!", ], 'popup_login' => [ @@ -185,7 +185,7 @@ 'register' => [ 'download' => 'Unduh', - 'info' => 'Unduh osu! untuk membuat akun Anda!', + 'info' => 'Unduh osu! untuk membuat akunmu!', 'title' => "Belum memiliki akun?", ], ], diff --git a/resources/lang/id/livestreams.php b/resources/lang/id/livestreams.php index 35d9bad3ccb..b64c92df0d0 100644 --- a/resources/lang/id/livestreams.php +++ b/resources/lang/id/livestreams.php @@ -5,8 +5,8 @@ return [ 'promote' => [ - 'pin' => 'Apakah Anda yakin untuk mempromosikan siaran langsung ini?', - 'unpin' => "Apakah Anda yakin untuk menghentikan promosi siaran langsung ini?", + 'pin' => 'Apakah kamu yakin untuk mempromosikan siaran langsung ini?', + 'unpin' => "Apakah kamu yakin untuk menghentikan promosi siaran langsung ini?", ], 'top-headers' => [ diff --git a/resources/lang/id/mail.php b/resources/lang/id/mail.php index da134f290b2..1dbb395d172 100644 --- a/resources/lang/id/mail.php +++ b/resources/lang/id/mail.php @@ -5,106 +5,106 @@ return [ 'beatmapset_update_notice' => [ - 'new' => 'Kami ingin memberitahukan bahwa beatmap ":title" telah diperbarui sejak kunjungan terakhir Anda.', + 'new' => 'Kami ingin memberitahukan bahwa beatmap ":title" telah diperbarui sejak kunjungan terakhirmu.', 'subject' => 'Pembaruan baru untuk beatmap ":title"', - 'unwatch' => 'Apabila Anda tidak lagi ingin mengikuti beatmap ini, Anda dapat memberhentikan pengamatan Anda melalui tautan "Berhenti Ikuti" yang tertera di atas atau melalui laman Daftar Pengamatan berikut:', + 'unwatch' => 'Apabila kamu tidak lagi ingin mengikuti beatmap ini, kamu dapat memberhentikan pengamatan Anda melalui tautan "Berhenti Ikuti" yang tertera di atas atau melalui laman Daftar Pengamatan berikut:', 'visit' => 'Kunjungi laman diskusi beatmap ini di sini:', ], 'common' => [ 'closing' => 'Salam,', 'hello' => 'Hai :user,', - 'report' => 'Harap balas email ini DENGAN SEGERA apabila Anda tidak merasa melakukan tindakan ini.', - 'ignore' => 'Apabila Anda tidak mengirim permintaan ini, Anda dapat mengabaikan email ini.', + 'report' => 'Harap balas email ini DENGAN SEGERA apabila kamu tidak merasa melakukan tindakan ini.', + 'ignore' => 'Apabila kamu tidak mengirim permintaan ini, kamu dapat mengabaikan email ini.', ], 'donation_thanks' => [ 'benefit_more' => 'Di samping itu, para pemilik supporter tag juga akan mendapatkan berbagai keutamaan baru seiring waktunya!', - 'feedback' => "Apabila Anda memiliki pertanyaan atau saran lebih lanjut, jangan sungkan untuk membalas email ini; Saya akan menghubungi Anda kembali sesegera mungkin!", - 'keep_free' => 'Berkat orang-orang seperti Anda, osu! dapat mewujudkan lingkungan permainan dan komunitas yang terbebas dari iklan dan sistem pembayaran yang mengganggu.', - 'keep_running' => 'Dukungan Anda membuat osu! dapat berjalan selama sekitar :minutes! Angka ini mungkin tidak terlihat besar, namun dukungan sekecil apa pun akan tetap berarti bagi kami :).', + 'feedback' => "Apabila kamu memiliki pertanyaan atau saran lebih lanjut, jangan sungkan untuk membalas email ini; Saya akan menghubungimu kembali sesegera mungkin!", + 'keep_free' => 'Berkat orang-orang sepertimu, osu! dapat mewujudkan lingkungan permainan dan komunitas yang terbebas dari iklan dan sistem pembayaran yang mengganggu.', + 'keep_running' => 'Dukunganmu membuat osu! dapat berjalan selama sekitar :minutes! Angka ini mungkin tidak terlihat besar, namun dukungan sekecil apa pun akan tetap berarti bagi kami :).', 'subject' => 'Terima kasih, osu! mencintaimu', 'translation' => 'Sebagai bahan rujukan, tersedia terjemahan dari komunitas di bawah ini:', 'benefit' => [ - 'gift' => 'Para pengguna yang Anda hadiahkan kini dapat mengakses osu!direct dan berbagai fitur supporter lainnya.', - 'self' => 'Anda kini dapat mengakses osu!direct dan berbagai fitur supporter lainnya selama :duration.', + 'gift' => 'Para pengguna yang kamu hadiahkan kini dapat menikmati akses osu!direct dan berbagai kelebihan supporter lainnya.', + 'self' => 'Kamu kini dapat menikmati akses osu!direct dan berbagai kelebihan supporter lainnya selama :duration.', ], 'support' => [ - '_' => 'Terima kasih banyak atas :support yang telah Anda berikan untuk osu!.', + '_' => 'Terima kasih banyak atas :support yang telah kamu berikan kepada osu!.', 'first' => 'dukungan', 'repeat' => 'dukungan berkelanjutan', ], ], 'forum_new_reply' => [ - 'new' => 'Kami ingin menginformasikan bahwa telah terdapat balasan baru pada ":title" sejak kunjungan terakhir Anda.', + 'new' => 'Kami ingin memberitahukan bahwa terdapat balasan baru pada ":title" sejak kunjungan terakhirmu.', 'subject' => '[osu!] Balasan baru pada topik ":title"', - 'unwatch' => 'Apabila Anda tidak lagi ingin mengikuti topik forum ini, Anda dapat memberhentikan pengamatan Anda melalui tautan "Berhenti Ikuti" yang tertera di atas atau melalui laman Daftar Pengamatan berikut:', - 'visit' => 'Anda dapat segera melihat balasan terbaru melalui link berikut:', + 'unwatch' => 'Apabila kamu tidak lagi ingin mengikuti topik forum ini, Anda dapat memberhentikan pengamatanmu melalui tautan "Berhenti Ikuti" yang tertera di atas atau melalui laman Daftar Pengamatan berikut:', + 'visit' => 'Kamu dapat segera melihat balasan terbaru melalui link berikut:', ], 'password_reset' => [ - 'code' => 'Kode verifikasi Anda adalah:', - 'requested' => 'Baik Anda atau seseorang yang berpura-pura menjadi diri Anda telah meminta agar kata sandi akun osu! milik Anda diatur ulang.', + 'code' => 'Kode verifikasi kamu adalah:', + 'requested' => 'Baik kamu atau seseorang yang berpura-pura menjadi dirimu telah meminta agar kata sandi akun osu! milikmu diatur ulang.', 'subject' => 'Pemulihan akun osu!', ], 'store_payment_completed' => [ - 'prepare_shipping' => 'Kami telah menerima pembayaran Anda, dan saat ini kami tengah mempersiapkan pesanan Anda untuk dikirim. Apabila kami sedang menerima banyak pesanan, kami mungkin butuh waktu beberapa hari untuk dapat memproses pesanan-pesanan yang ada. Anda dapat mengikuti perkembangan pesanan Anda di sini, termasuk rincian-rincian pelacakan yang terkait:', - 'processing' => 'Kami telah menerima pembayaran Anda, dan saat ini kami sedang memproses pesanan Anda lebih lanjut. Anda dapat mengikuti perkembangan pesanan Anda di sini:', - 'questions' => "Apabila Anda memiliki pertanyaan lebih lanjut, jangan sungkan untuk membalas email ini.", + 'prepare_shipping' => 'Kami telah menerima pembayaranmu, dan saat ini kami tengah mempersiapkan pesananmu untuk dikirim. Tergantung dari jumlah pesanan yang masuk, pesananmu dapat memerlukan waktu beberapa hari untuk dikirim. Kamu dapat melacak pesananmu beserta segala rincian tambahannya (apabila tersedia) pada tautan berikut:', + 'processing' => 'Kami telah menerima pembayaranmu, dan saat ini kami sedang memproses pesananmu lebih lanjut. Kamu dapat mengikuti perkembangan pesananmu di sini:', + 'questions' => "Apabila kamu memiliki pertanyaan lebih lanjut, jangan sungkan untuk membalas email ini.", 'shipping' => 'Pengiriman', - 'subject' => 'Kami telah menerima pesanan osu!store Anda!', - 'thank_you' => 'Terima kasih atas pemesanan osu!store Anda!', + 'subject' => 'Kami telah menerima pesanan osu!store milikmu!', + 'thank_you' => 'Terima kasih atas pemesananmu di osu!store!', 'total' => 'Total', ], 'supporter_gift' => [ - 'anonymous_gift' => 'Orang yang menghadiahkan Anda supporter tag ini memilih untuk tetap anonim, sehingga nama mereka tidak disebutkan pada notifikasi ini.', - 'anonymous_gift_maybe_not' => 'Tetapi Anda mungkin sudah tahu siapa itu ;).', - 'duration' => 'Berkat mereka, Anda kini dapat mengakses osu!direct dan berbagai fitur khusus osu!supporter lainnya selama :duration.', - 'features' => 'Anda dapat membaca rincian lebih lanjut mengenai fitur-fitur ini di sini:', - 'gifted' => 'Seseorang baru saja menghadiahkan Anda osu!supporter tag!', - 'gift_message' => '', - 'subject' => 'Anda telah dihadiahkan osu!supporter tag!', + 'anonymous_gift' => 'Pengguna yang menghadiahkanmu tag supporter ini memilih untuk tetap anonim, sehingga nama mereka tidak disebutkan pada email ini.', + 'anonymous_gift_maybe_not' => 'Tetapi kamu mungkin sudah tahu siapa itu ;).', + 'duration' => 'Berkat mereka, kamu kini dapat menikmati akses osu!direct dan berbagai fitur khusus osu!supporter lainnya selama :duration.', + 'features' => 'Kamu dapat membaca rincian lebih lanjut mengenai berbagai fitur ini di sini:', + 'gifted' => 'Seseorang baru saja menghadiahkanmu osu!supporter tag!', + 'gift_message' => 'Pengguna yang menghadiahkan tag ini menitipkan pesan berikut untukmu:', + 'subject' => 'Kamu telah dihadiahkan osu!supporter tag!', ], 'user_email_updated' => [ - 'changed_to' => 'Email ini merupakan bukti konfirmasi bahwa alamat email yang terhubung dengan akun osu! Anda telah diubah menjadi ":email".', - 'check' => 'Harap pastikan bahwa Anda menerima email ini di alamat email yang baru agar ke depannya Anda tidak kehilangan akses menuju akun osu! Anda.', - 'sent' => 'Demi alasan keamanan, email ini telah dikirim ke alamat email baru dan lama milik Anda.', + 'changed_to' => 'Email ini merupakan bukti konfirmasi bahwa alamat email yang terhubung dengan akun osu! milikmu telah diubah menjadi ":email".', + 'check' => 'Harap pastikan bahwa kamu menerima email ini pada alamat email yang baru agar ke depannya kamu tidak kehilangan akses menuju akun osu! milikmu.', + 'sent' => 'Demi alasan keamanan, email ini telah dikirim ke alamat email baru dan lama milikmu.', 'subject' => 'Konfirmasi perubahan email osu!', ], 'user_force_reactivation' => [ - 'main' => 'Akun Anda terindikasi berada dalam bahaya karena memiliki rekam jejak aktivitas yang mencurigakan baru-baru ini atau kata sandi yang SANGAT lemah. Oleh karenanya, kami meminta Anda untuk membuat kata sandi baru. Pastikan Anda memilih kata sandi yang LEBIH AMAN.', - 'perform_reset' => 'Anda dapat mengatur ulang kata sandi Anda melalui :url', + 'main' => 'Akunmu terindikasi telah disalahgunakan, memiliki rekam jejak aktivitas yang mencurigakan, atau memiliki kata sandi yang SANGAT lemah. Oleh karenanya, kami memintamu untuk menentukan kata sandi baru. Pastikan kamu memilih kata sandi yang LEBIH AMAN.', + 'perform_reset' => 'Kamu dapat mengatur ulang kata sandi akunmu melalui :url', 'reason' => 'Alasan:', 'subject' => 'Aktivasi Ulang Akun osu! Dibutuhkan', ], 'user_notification_digest' => [ - 'new' => 'Kami ingin menginformasikan bahwa telah terdapat perkembangan baru pada hal-hal yang Anda ikuti.', + 'new' => 'Kami ingin memberitahukan bahwa terdapat perkembangan baru pada berbagai hal yang kamu ikuti.', 'settings' => 'Ubah preferensi penerimaan notifikasi:', 'subject' => 'Notifikasi osu! baru', ], 'user_password_updated' => [ - 'confirmation' => 'Email ini merupakan bukti konfirmasi bahwa kata sandi akun osu! Anda telah diubah.', + 'confirmation' => 'Email ini merupakan bukti konfirmasi bahwa kata sandi akun osu! milikmu telah diubah.', 'subject' => 'Konfirmasi perubahan kata sandi osu!', ], 'user_verification' => [ - 'code' => 'Kode verifikasi Anda adalah:', - 'code_hint' => 'Anda dapat memasukkan kode tersebut baik dengan atau tanpa spasi.', - 'link' => 'Di samping itu, Anda juga dapat mengunjungi tautan di bawah ini untuk menyelesaikan proses verifikasi:', - 'report' => 'Apabila Anda tidak merasa meminta kode verifikasi dari kami, harap SEGERA BALAS email ini karena akun Anda mungkin sedang berada dalam bahaya.', + 'code' => 'Kode verifikasi kamu adalah:', + 'code_hint' => 'Kamu dapat memasukkan kode tersebut baik dengan atau tanpa spasi.', + 'link' => 'Di samping itu, kamu juga dapat mengunjungi tautan di bawah ini untuk menyelesaikan proses verifikasi:', + 'report' => 'Apabila kamu tidak merasa meminta kode verifikasi dari kami, harap SEGERA BALAS email ini karena akunmu mungkin sedang berada dalam bahaya.', 'subject' => 'Verifikasi akun osu!', 'action_from' => [ - '_' => 'Terdapat aktivitas baru dari :country pada akun Anda yang memerlukan verifikasi.', + '_' => 'Terdapat aktivitas baru dari :country pada akunmu yang memerlukan verifikasi.', 'unknown_country' => 'negara yang tidak diketahui', ], ], diff --git a/resources/lang/id/model_validation.php b/resources/lang/id/model_validation.php index b13d50d8e3e..59a4cdf1cbd 100644 --- a/resources/lang/id/model_validation.php +++ b/resources/lang/id/model_validation.php @@ -24,12 +24,12 @@ ], 'hype' => [ - 'discussion_locked' => "Anda tidak dapat memberikan hype karena laman diskusi beatmap ini tengah dikunci", - 'guest' => 'Anda harus masuk untuk dapat memberikan hype.', - 'hyped' => 'Anda telah memberikan hype untuk beatmap ini.', - 'limit_exceeded' => 'Anda telah mempergunakan seluruh hype yang Anda miliki.', + 'discussion_locked' => "Beatmap ini tidak dapat di-hype karena laman diskusi beatmap ini tengah dikunci", + 'guest' => 'Kamu harus masuk untuk memberikan hype.', + 'hyped' => 'Kamu telah memberikan hype pada beatmap ini.', + 'limit_exceeded' => 'Kamu telah menggunakan seluruh hype yang kamu miliki.', 'not_hypeable' => 'Beatmap ini tidak dapat di-hype', - 'owner' => 'Anda tidak dapat memberikan hype pada beatmap milik sendiri.', + 'owner' => 'Kamu tidak dapat memberikan hype pada beatmap milik sendiri.', ], 'timestamp' => [ @@ -48,7 +48,7 @@ ], 'comment' => [ - 'deleted_parent' => 'Anda tidak dapat membalas komentar yang telah dihapus.', + 'deleted_parent' => 'Kamu tidak dapat membalas komentar yang telah dihapus.', 'top_only' => 'Komentar balasan tidak dapat disematkan.', 'attributes' => [ @@ -75,7 +75,7 @@ 'beatmapset_post_no_edit' => 'Menyunting posting metadata beatmap tidak diizinkan.', 'first_post_no_delete' => 'Tidak dapat menghapus postingan awal', 'missing_topic' => 'Postingan ini tidak memiliki topik', - 'only_quote' => 'Balasan Anda hanya berisi kutipan.', + 'only_quote' => 'Balasanmu hanya berisi kutipan.', 'attributes' => [ 'post_text' => 'Isi postingan', @@ -89,7 +89,7 @@ ], 'topic_poll' => [ - 'duplicate_options' => 'Opsi ganda tidak diizinkan.', + 'duplicate_options' => 'Pilihan berganda tidak diizinkan.', 'grace_period_expired' => 'Tidak dapat menyunting sebuah jajak pendapat setelah melebihi :limit jam', 'hiding_results_forever' => 'Suara pada polling yang tidak memiliki batasan akhir waktu tidak dapat dirahasiakan.', 'invalid_max_options' => 'Pilihan per pengguna tidak boleh melebihi jumlah opsi yang tersedia.', @@ -104,7 +104,7 @@ 'topic_vote' => [ 'required' => 'Pilih opsi saat memilih.', - 'too_many' => 'Jumlah pilihan Anda lebih banyak dari yang diizinkan.', + 'too_many' => 'Jumlah pilihan yang dipilih lebih banyak dari yang diizinkan.', ], ], @@ -153,9 +153,9 @@ ], 'change_username' => [ - 'restricted' => 'Anda tidak dapat mengubah nama pengguna pada saat akun Anda sedang di-restrict.', + 'restricted' => 'Kamu tidak dapat mengubah nama pengguna pada saat akunmu sedang di-restrict.', 'supporter_required' => [ - '_' => 'Anda harus memiliki :link untuk dapat mengubah nama pengguna Anda!', + '_' => 'Kamu harus memiliki :link untuk mengubah nama penggunamu!', 'link_text' => 'osu!supporter', ], 'username_is_same' => 'Ini adalah nama penggunamu yang sekarang, duh!', @@ -163,9 +163,9 @@ ], 'user_report' => [ - 'no_ranked_beatmapset' => 'Anda tidak dapat melaporkan beatmap yang berstatus Ranked', + 'no_ranked_beatmapset' => 'Kamu tidak dapat melaporkan beatmap yang berstatus Ranked', 'reason_not_valid' => ':reason bukan merupakan alasan yang valid untuk jenis laporan ini.', - 'self' => "Anda tidak dapat melaporkan diri Anda sendiri!", + 'self' => "Kamu tidak dapat melaporkan diri sendiri!", ], 'store' => [ diff --git a/resources/lang/id/model_validation/fulfillments.php b/resources/lang/id/model_validation/fulfillments.php index 744963a4f9f..0005869ce7c 100644 --- a/resources/lang/id/model_validation/fulfillments.php +++ b/resources/lang/id/model_validation/fulfillments.php @@ -10,6 +10,6 @@ 'reverting_username_mismatch' => '', ], 'supporter_tag' => [ - 'insufficient_paid' => 'Donasi Anda tidak mencukupi untuk menghadiahkan tag osu!supporter (:actual > :expected)', + 'insufficient_paid' => 'Donasimu tidak mencukupi untuk menghadiahkan tag osu!supporter (:actual > :expected)', ], ]; diff --git a/resources/lang/id/model_validation/store/product.php b/resources/lang/id/model_validation/store/product.php index 9642a9561c1..a62e3d0d358 100644 --- a/resources/lang/id/model_validation/store/product.php +++ b/resources/lang/id/model_validation/store/product.php @@ -5,7 +5,7 @@ return [ 'insufficient_stock' => 'Stok yang tersedia tidak mencukupi atau sudah habis!', - 'must_separate' => 'Produk ini harus di-checkout secara terpisah dari produk-produk lainnya', + 'must_separate' => 'Produk ini harus di-checkout secara terpisah dari produk lainnya', 'not_available' => 'Produk ini tidak tersedia.', - 'too_many' => 'Anda hanya dapat memesan :count item dari produk ini per pemesanan.', + 'too_many' => 'Kamu hanya dapat memesan :count item dari produk ini per pemesanannya.', ]; diff --git a/resources/lang/id/notifications.php b/resources/lang/id/notifications.php index 4d52687f5bb..25dcd2056ce 100644 --- a/resources/lang/id/notifications.php +++ b/resources/lang/id/notifications.php @@ -11,7 +11,7 @@ 'none' => 'Tidak ada notifikasi', 'see_all' => 'Lihat riwayat notifikasi', 'see_channel' => 'Buka jendela chat', - 'verifying' => 'Harap verifikasi sesi Anda untuk dapat melihat notifikasi', + 'verifying' => 'Harap verifikasi sesi untuk melihat notifikasi', 'filters' => [ '_' => 'semua notifikasi', @@ -29,8 +29,8 @@ 'beatmap_owner_change' => [ '_' => 'Guest difficulty', - 'beatmap_owner_change' => 'Anda telah terdaftar sebagai pemilik tingkat kesulitan ":beatmap" pada beatmap ":title"', - 'beatmap_owner_change_compact' => 'Anda telah terdaftar sebagai pemilik dari tingkat kesulitan ":beatmap"', + 'beatmap_owner_change' => 'Kamu telah terdaftar sebagai pemilik tingkat kesulitan ":beatmap" pada beatmap ":title"', + 'beatmap_owner_change_compact' => 'Kamu telah terdaftar sebagai pemilik dari tingkat kesulitan ":beatmap"', ], 'beatmapset_discussion' => [ @@ -78,8 +78,8 @@ 'comment_new' => ':username berkomentar ":content" pada ":title"', 'comment_new_compact' => ':username berkomentar ":content"', - 'comment_reply' => ':username membalas komentar yang Anda tulis pada ":title" dengan ":content"', - 'comment_reply_compact' => ':username membalas komentar Anda dengan ":content"', + 'comment_reply' => ':username membalas komentar yang kamu tulis pada ":title" dengan ":content"', + 'comment_reply_compact' => ':username membalas komentarmu dengan ":content"', ], ], @@ -115,8 +115,8 @@ 'comment_new' => ':username berkomentar ":content" pada ":title"', 'comment_new_compact' => ':username berkomentar ":content"', - 'comment_reply' => ':username membalas komentar yang Anda tulis pada ":title" dengan ":content"', - 'comment_reply_compact' => ':username membalas komentar Anda dengan ":content"', + 'comment_reply' => ':username membalas komentar yang kamu tulis pada ":title" dengan ":content"', + 'comment_reply_compact' => ':username membalas komentarmu dengan ":content"', ], ], @@ -128,8 +128,8 @@ 'comment_new' => ':username berkomentar ":content" pada ":title"', 'comment_new_compact' => ':username berkomentar ":content"', - 'comment_reply' => ':username membalas komentar yang Anda tulis pada ":title" dengan ":content"', - 'comment_reply_compact' => ':username membalas komentar Anda dengan ":content"', + 'comment_reply' => ':username membalas komentar yang kamu tulis pada ":title" dengan ":content"', + 'comment_reply_compact' => ':username membalas komentarmu dengan ":content"', ], ], @@ -138,8 +138,8 @@ 'forum_topic_reply' => [ '_' => 'Balasan baru pada topik forum', - 'forum_topic_reply' => ':username membalas postingan Anda pada utas forum ":title"', - 'forum_topic_reply_compact' => ':username membalas postingan Anda', + 'forum_topic_reply' => ':username membalas postinganmu pada utas forum ":title"', + 'forum_topic_reply_compact' => ':username membalas postinganmu', ], ], @@ -171,7 +171,7 @@ 'user_achievement_unlock' => [ '_' => 'Medali baru', 'user_achievement_unlock' => '":title" terbuka!', - 'user_achievement_unlock_compact' => 'Anda berhasil mendapatkan medali ":title"!', + 'user_achievement_unlock_compact' => 'Medali ":title" terbuka!', 'user_achievement_unlock_group' => 'Medali terbuka!', ], ], @@ -180,7 +180,7 @@ 'mail' => [ 'beatmapset' => [ 'beatmap_owner_change' => [ - 'beatmap_owner_change' => 'Anda telah terdaftar sebagai pembuat guest difficulty pada beatmap ":title"', + 'beatmap_owner_change' => 'Kamu telah terdaftar sebagai pemilik guest difficulty pada beatmap ":title"', ], 'beatmapset_discussion' => [ @@ -210,7 +210,7 @@ 'channel' => [ 'channel' => [ - 'pm' => 'Anda menerima pesan baru dari :username', + 'pm' => 'Kamu menerima pesan baru dari :username', ], ], @@ -235,7 +235,7 @@ 'user' => [ 'user_achievement_unlock' => [ 'user_achievement_unlock' => ':username telah mendapatkan medali baru, ":title"!', - 'user_achievement_unlock_self' => 'Anda telah mendapatkan medali baru, ":title"!', + 'user_achievement_unlock_self' => 'Kamu telah membuka medali baru, ":title"!', ], 'user_beatmapset_new' => [ diff --git a/resources/lang/id/oauth.php b/resources/lang/id/oauth.php index dd146db72ff..d208874bf09 100644 --- a/resources/lang/id/oauth.php +++ b/resources/lang/id/oauth.php @@ -7,13 +7,13 @@ 'cancel' => 'Batal', 'authorise' => [ - 'request' => 'meminta izin untuk dapat mengakses akun Anda.', + 'request' => 'meminta izin untuk dapat mengakses akunmu.', 'scopes_title' => 'Ke depannya, aplikasi ini akan mampu untuk:', 'title' => 'Permohonan Otorisasi', ], 'authorized_clients' => [ - 'confirm_revoke' => 'Apakah anda yakin untuk mencabut izin akses klien ini?', + 'confirm_revoke' => 'Apakah kamu yakin untuk mencabut izin akses klien ini?', 'scopes_title' => 'Aplikasi ini dapat:', 'owned_by' => 'Dimiliki oleh :user', 'none' => 'Tidak Ada Klien', @@ -48,8 +48,8 @@ ], 'own_clients' => [ - 'confirm_delete' => 'Apakah Anda yakin untuk menghapus klien ini?', - 'confirm_reset' => 'Apakah Anda yakin untuk mengatur ulang client secret? Tindakan ini akan menganulir izin akses seluruh token yang telah diotorisir sebelumnya.', + 'confirm_delete' => 'Apakah kamu yakin untuk menghapus klien ini?', + 'confirm_reset' => 'Apakah kamu yakin untuk mengatur ulang client secret? Tindakan ini akan menganulir izin akses seluruh token yang telah diotorisir sebelumnya.', 'new' => 'Buat Izin Aplikasi Baru', 'none' => 'Tidak Ada Klien', diff --git a/resources/lang/id/page_title.php b/resources/lang/id/page_title.php index 48fa6c15f96..ac441dfbb25 100644 --- a/resources/lang/id/page_title.php +++ b/resources/lang/id/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'info pemain', + 'create' => '', 'disabled' => 'pemberitahuan', ], 'wiki_controller' => [ diff --git a/resources/lang/id/password_reset.php b/resources/lang/id/password_reset.php index 04e6c7eac29..de94f00af43 100644 --- a/resources/lang/id/password_reset.php +++ b/resources/lang/id/password_reset.php @@ -23,7 +23,7 @@ ], 'notice' => [ - 'sent' => 'Periksa email Anda untuk kode verifikasi.', + 'sent' => 'Periksa emailmu untuk menerima kode verifikasi.', 'saved' => 'Kata sandi baru berhasil disimpan!', ], diff --git a/resources/lang/id/paypal/errors.php b/resources/lang/id/paypal/errors.php index 66fd6714b78..d8011e94258 100644 --- a/resources/lang/id/paypal/errors.php +++ b/resources/lang/id/paypal/errors.php @@ -6,7 +6,7 @@ return [ 'instrument_declined' => 'Metode pembayaran yang dipilih ditolak oleh Paypal.', 'invalid_resource_id' => 'Informasi pembayaran tidak ditemukan.', - 'invalid_token' => 'Terdapat kesalahan dalam menyelesaikan pembayaran Anda.', + 'invalid_token' => 'Terdapat kesalahan dalam menyelesaikan pembayaranmu.', 'old_format' => 'Tautan pembayaran sudah tidak berlaku. Harap coba lagi.', 'resource_not_found' => 'Tidak ada rekam jejak pembayaran yang tercatat.', 'unknown' => "Pembayaran ditolak, tetapi kami tidak yakin mengapa.", diff --git a/resources/lang/id/store.php b/resources/lang/id/store.php index e1873480624..c14df287e0d 100644 --- a/resources/lang/id/store.php +++ b/resources/lang/id/store.php @@ -13,12 +13,12 @@ 'total' => 'total', 'errors_no_checkout' => [ - 'line_1' => 'Uh-oh, terdapat masalah dengan keranjang Anda yang menghalangi kami untuk dapat memproses pemesanan lebih lanjut!', + 'line_1' => 'Uh-oh, terdapat masalah dengan keranjangmu yang menghalangi proses checkout!', 'line_2' => 'Hapus atau perbarui item-item di atas untuk melanjutkan.', ], 'empty' => [ - 'text' => 'Keranjang anda masih kosong.', + 'text' => 'Keranjangmu masih kosong.', 'return_link' => [ '_' => 'Kembali ke tautan :link untuk mencari merchandise!', 'link_text' => 'etalase toko', @@ -27,40 +27,40 @@ ], 'checkout' => [ - 'cart_problems' => 'Aduh, ada masalah dengan pemesanan anda!', + 'cart_problems' => 'Uh oh, terdapat masalah dengan keranjangmu!', 'cart_problems_edit' => 'Klik di sini untuk menyuntingnya.', 'declined' => 'Pembayaran dibatalkan.', - 'delayed_shipping' => 'Kami sedang kebanjiran pesanan! Apabila Anda memesan sekarang, harap beri kami waktu tambahan **selama 1-2 minggu** untuk memproses pesanan Anda karena kami saat ini masih harus mengurus berbagai pesanan yang telah kami terima sebelumnya.', - 'hide_from_activity' => '', - 'old_cart' => 'Keranjang Anda nampaknya sudah kedaluwarsa dan telah dimuat ulang, silakan coba lagi.', + 'delayed_shipping' => 'Kami sedang kebanjiran pesanan! Apabila kamu memesan sekarang, harap beri kami waktu tambahan **selama 1-2 minggu** untuk memproses pesananmu karena kami saat ini masih harus mengurus pesanan yang telah kami terima sebelumnya.', + 'hide_from_activity' => 'Sembunyikan seluruh tag osu!supporter pada pesanan ini dari aktivitas saya', + 'old_cart' => 'Keranjangmu sepertinya telah kedaluwarsa dan telah dimuat ulang. Silakan coba lagi.', 'pay' => 'Checkout melalui Paypal', 'title_compact' => 'checkout', 'has_pending' => [ - '_' => 'Anda memiliki transaksi yang belum tuntas, klik :link untuk melihatnya.', + '_' => 'Kamu memiliki transaksi yang belum tuntas. Klik :link untuk melihatnya.', 'link_text' => 'di sini', ], 'pending_checkout' => [ - 'line_1' => 'Anda belum menuntaskan pembayaran sebelumnya.', - 'line_2' => 'Lanjutkan pembayaran Anda dengan memilih metode pembayaran.', + 'line_1' => 'Transaksi sebelumnya belum dituntaskan.', + 'line_2' => 'Lanjutkan pembayaranmu dengan memilih metode pembayaran.', ], ], 'discount' => 'hemat :percent%', 'invoice' => [ - 'echeck_delay' => 'Berhubung pembayaran Anda berupa eCheck, mohon tunggu hingga setidaknya 10 hari agar pembayaran Anda dapat diproses oleh PayPal!', - 'hide_from_activity' => '', + 'echeck_delay' => 'Berhubung pembayaranmu berupa eCheck, mohon tunggu hingga setidaknya 10 hari agar pembayaranmu dapat diproses oleh PayPal!', + 'hide_from_activity' => 'Tag osu!supporter yang dipesan melalui pesanan ini tidak akan ditampilkan pada riwayat aktivitas terkini milikmu.', 'title_compact' => 'faktur', 'status' => [ 'processing' => [ - 'title' => 'Pembayaran Anda belum terkonfirmasi!', - 'line_1' => 'Apabila Anda sebelumnya benar-benar telah membayar sesuai dengan jumlah yang tertagih, ada kemungkinan sistem kami masih memproses dan mengonfirmasi pembayaran Anda tersebut. Mohon tunggu beberapa menit dan muat ulang halaman ini!', + 'title' => 'Pembayaranmu belum terkonfirmasi!', + 'line_1' => 'Apabila kamu telah membayar sebelumnya, ada kemungkinan sistem kami masih memproses dan mengonfirmasi pembayaranmu. Silakan muat ulang halaman ini dalam beberapa menit!', 'line_2' => [ - '_' => 'Apabila Anda mengalami masalah dalam proses checkout, :link', - 'link_text' => 'klik di sini untuk melanjutkan transaksi Anda', + '_' => 'Apabila kamu mengalami masalah dalam proses checkout, :link', + 'link_text' => 'klik di sini untuk melanjutkan transaksimu', ], ], ], @@ -68,7 +68,7 @@ 'order' => [ 'cancel' => 'Batalkan Pesanan', - 'cancel_confirm' => 'Pesanan ini akan secara otomatis dibatalkan dan segala biaya yang telah Anda keluarkan tidak akan kami terima. Apakah Anda yakin?', + 'cancel_confirm' => 'Pesanan ini akan dibatalkan dan segala biaya yang telah kamu keluarkan tidak akan kami terima. Apakah kamu yakin?', 'cancel_not_allowed' => 'Pesanan ini tidak dapat dibatalkan pada saat ini.', 'invoice' => 'Lihat Faktur', 'no_orders' => 'Tidak ada pesanan yang tercatat.', @@ -84,18 +84,18 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Pesan: :message', ], ], 'not_modifiable_exception' => [ - 'cancelled' => 'Anda tidak dapat menyunting pesanan yang telah dibatalkan.', - 'checkout' => 'Anda tidak dapat menyunting pesanan yang sedang diproses.', // checkout and processing should have the same message. + 'cancelled' => 'Kamu tidak dapat menyunting pesanan yang telah dibatalkan.', + 'checkout' => 'Kamu tidak dapat menyunting pesanan yang sedang diproses.', // checkout and processing should have the same message. 'default' => 'Pesanan tidak dapat diubah', - 'delivered' => 'Anda tidak dapat menyunting pesanan yang telah dikirim.', - 'paid' => 'Anda tidak dapat menyunting pesanan yang telah dibayar.', - 'processing' => 'Anda tidak dapat menyunting pesanan yang sedang diproses.', - 'shipped' => 'Anda tidak dapat menyunting pesanan yang telah dikirim.', + 'delivered' => 'Kamu tidak dapat menyunting pesanan yang telah dikirim.', + 'paid' => 'Kamu tidak dapat menyunting pesanan yang telah dibayar.', + 'processing' => 'Kamu tidak dapat menyunting pesanan yang sedang diproses.', + 'shipped' => 'Kamu tidak dapat menyunting pesanan yang telah dikirim.', ], 'status' => [ @@ -119,7 +119,7 @@ 'add_to_cart' => 'Tambahkan ke Keranjang', 'notify' => 'Beri tahu saya bila telah tersedia!', - 'notification_success' => 'Anda akan diberitahu saat kami punya stok baru. klik :link untuk membatalkan', + 'notification_success' => 'kamu akan diberitahukan pada saat kami memiliki stok baru. klik :link untuk membatalkan', 'notification_remove_text' => 'di sini', 'notification_in_stock' => 'Produk ini telah tersedia!', @@ -127,10 +127,10 @@ 'supporter_tag' => [ 'gift' => 'hadiahkan ke pengguna lain', - 'gift_message' => '', + 'gift_message' => 'tambahkan pesan untuk melengkapi hadiahmu! (maksimal :length karakter)', 'require_login' => [ - '_' => 'Anda harus :link untuk dapat menerima osu!supporter tag!', + '_' => 'Kamu harus :link untuk menerima tag osu!supporter!', 'link_text' => 'masuk', ], ], diff --git a/resources/lang/id/tournament.php b/resources/lang/id/tournament.php index 0e1c2253d31..3aaeaeb46aa 100644 --- a/resources/lang/id/tournament.php +++ b/resources/lang/id/tournament.php @@ -24,7 +24,7 @@ 'show' => [ 'banner' => 'Dukung Tim Anda', - 'entered' => 'Anda telah mendaftarkan diri Anda pada turnamen ini.

    Harap dicatat bahwa hal ini tidak berarti bahwa Anda telah secara otomatis terdaftar sebagai peserta pada turnamen yang bersangkutan.

    Kami akan mengirimkan Anda instruksi lebih lanjut melalui email beberapa saat sebelum turnamen resmi dimulai, jadi pastikan alamat email yang terhubung dengan akun osu! Anda aktif dan valid!', + 'entered' => 'Kamu telah mendaftarkan diri pada turnamen ini.

    Harap dicatat bahwa hal ini tidak berarti bahwa kamu telah ditempatkan ke dalam tim tertentu.

    Kami akan mengirimkanmu instruksi lebih lanjut melalui email sebelum turnamen dimulai, jadi pastikan alamat email yang terhubung dengan akun osu! milikmu aktif dan valid!', 'info_page' => 'Laman Informasi', 'login_to_register' => 'Harap :login untuk melihat rincian pendaftaran!', 'not_yet_entered' => 'Anda tidak terdaftar pada turnamen ini.', diff --git a/resources/lang/id/user_verification.php b/resources/lang/id/user_verification.php index 23b769331b2..ed3a158f127 100644 --- a/resources/lang/id/user_verification.php +++ b/resources/lang/id/user_verification.php @@ -11,10 +11,10 @@ 'issuing' => 'Meminta kode baru...', 'info' => [ - 'check_spam' => "Pastikan untuk memeriksa folder spam apabila Anda tidak menemukan email yang dimaksud.", - 'recover' => "Apabila Anda tidak dapat mengakses email Anda atau sudah tidak lagi ingat alamat email yang Anda gunakan untuk mendaftar, mohon ikuti :link.", + 'check_spam' => "Pastikan untuk memeriksa folder spam apabila kamu tidak menemukan email yang dimaksud.", + 'recover' => "Apabila kamu tidak dapat mengakses emailmu atau sudah tidak lagi ingat alamat email yang kamu gunakan untuk mendaftar, silakan ikuti :link.", 'recover_link' => 'protokol pemulihan email berikut', - 'reissue' => 'Anda juga dapat :reissue_link atau :logout_link.', + 'reissue' => 'Kamu juga dapat :reissue_link atau :logout_link.', 'reissue_link' => 'meminta kode baru', 'logout_link' => 'keluar', ], diff --git a/resources/lang/id/users.php b/resources/lang/id/users.php index 95bc0a2e096..5fde5386d0b 100644 --- a/resources/lang/id/users.php +++ b/resources/lang/id/users.php @@ -32,7 +32,7 @@ ], 'blocks' => [ - 'banner_text' => 'Anda telah memblokir pengguna ini.', + 'banner_text' => 'Kamu telah memblokir pengguna ini.', 'comment_text' => 'Komentar ini disembunyikan.', 'blocked_count' => 'pengguna yang diblokir (:count)', 'hide_profile' => 'Sembunyikan profil', @@ -52,21 +52,37 @@ 'send_message' => 'Kirim pesan', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ - 'title' => 'Uh-oh! Sepertinya akun Anda telah dinonaktifkan.', - 'warning' => "Apabila Anda telah melanggar peraturan, akun Anda akan ditempatkan pada masa percobaan selama satu bulan di mana dalam rentang waktu ini kami tidak akan menanggapi segala permintaan yang terkait dengan akun Anda. Setelah masa percobaan ini berakhir, Anda baru akan dapat menghubungi kami untuk mengembalikan akun Anda. Mohon diperhatikan bahwa membuat akun baru hanya akan menambah masa hukuman Anda, dan masa hukuman Anda akan bertambah panjang untuk setiap akun baru yang Anda buat. Kami harap Anda dapat belajar dari kesalahan Anda!", + 'title' => 'Uh-oh! Sepertinya akunmu telah dinonaktifkan.', + 'warning' => "Apabila kamu melanggar peraturan, akunmu akan ditempatkan pada masa percobaan selama satu bulan, di mana dalam rentang waktu ini kami tidak akan menanggapi permintaan apa pun yang terkait dengan akun Anda. Setelah masa ini berakhir, Anda baru akan dapat menghubungi kami untuk mengembalikan akunmu. Mohon diperhatikan bahwa membuat akun baru hanya akan menambah masa hukumanmu, dan masa hukumanmu akan bertambah panjang untuk setiap akun baru yang kamu buat. Kami harap kamu dapat belajar dari kesalahanmu!", 'if_mistake' => [ - '_' => 'Apabila Anda merasa hal ini merupakan sebuah kesalahpahaman, Anda dianjurkan untuk mengontak kami (baik itu melalui :email atau tombol "?" yang terletak pada pojok kanan bawah laman ini) sesegera mungkin. Mohon diperhatikan bahwa segala keputusan yang kami ambil selalu berdasar pada data yang konkrit dan diambil dengan penuh keyakinan. Di samping itu, kami juga berhak untuk tidak menindaklanjuti aduan Anda lebih lanjut apabila kami merasa Anda dengan sengaja telah berbohong kepada kami.', + '_' => 'Apabila kamu merasa bahwa hal ini merupakan sebuah kesalahan, kamu disarankan untuk mengontak kami (baik melalui :email atau tombol "?" yang terletak pada pojok kanan bawah layar) sesegera mungkin. Mohon diperhatikan bahwa segala keputusan yang kami ambil selalu berdasar pada data yang konkrit dan diambil dengan penuh keyakinan. Di samping itu, kami juga berhak untuk tidak menindaklanjuti aduanmu lebih lanjut apabila kami merasa kamu dengan sengaja telah berbohong kepada kami.', 'email' => 'email', ], 'reasons' => [ - 'compromised' => 'Akun Anda terindikasi telah disalahgunakan oleh pihak lain. Akun Anda akan dinonaktifkan untuk sementara waktu hingga identitas pengguna akun telah terkonfirmasi.', - 'opening' => 'Ada sejumlah alasan yang dapat menyebabkan akun Anda dinonaktifkan:', + 'compromised' => 'Akunmu terindikasi telah disalahgunakan oleh pihak lain. Akun ini akan dinonaktifkan untuk sementara waktu hingga identitas pengguna akun telah terkonfirmasi.', + 'opening' => 'Terdapat sejumlah alasan yang dapat menyebabkan akunmu dinonaktifkan:', 'tos' => [ - '_' => 'Anda telah melakukan pelanggaran terhadap satu atau lebih poin yang tercantum pada :community_rules atau :tos kami.', + '_' => 'Kamu telah melakukan pelanggaran terhadap satu atau lebih poin yang tertera pada :community_rules atau :tos kami.', 'community_rules' => 'peraturan komunitas', 'tos' => 'ketentuan layanan', ], @@ -79,7 +95,7 @@ 'force_reactivation' => [ 'reason' => [ - 'inactive_different_country' => "Akun Anda telah lama tidak digunakan.", + 'inactive_different_country' => "Akunmu telah lama tidak digunakan.", ], ], @@ -87,11 +103,11 @@ '_' => 'Masuk', 'button' => 'Masuk', 'button_posting' => 'Mencoba masuk...', - 'email_login_disabled' => 'Anda tidak lagi dapat masuk dengan menggunakan alamat email. Silakan masuk dengan menggunakan nama pengguna.', + 'email_login_disabled' => 'Alamat email untuk saat ini tidak dapat digunakan untuk masuk. Silakan masuk dengan menggunakan nama pengguna.', 'failed' => 'Gagal masuk', 'forgot' => 'Lupa kata sandi?', 'info' => 'Silakan masuk untuk melanjutkan', - 'invalid_captcha' => 'Anda telah berulang kali gagal memasukkan kredensial pengguna yang valid. Harap selesaikan captcha berikut dan coba lagi. (Muat ulang laman ini apabila captcha tidak terlihat)', + 'invalid_captcha' => 'Kamu telah berulang kali gagal memasukkan kredensial pengguna yang valid. Harap selesaikan captcha yang muncul dan coba lagi. (Muat ulang laman ini apabila captcha tidak terlihat)', 'locked_ip' => 'Alamat IP Anda dikunci. Mohon tunggu beberapa menit.', 'password' => 'Kata Sandi', 'register' => "Belum memiliki akun osu!? Buat sekarang", @@ -113,15 +129,15 @@ 'login_link' => 'klik untuk masuk', 'login_text' => 'masuk', 'username' => 'Tamu', - 'error' => 'Anda harus masuk terlebih dahulu untuk dapat melakukan tindakan ini.', + 'error' => 'Kamu harus masuk untuk melakukan tindakan ini.', ], - 'logout_confirm' => 'Apakah Anda yakin ingin keluar? :(', + 'logout_confirm' => 'Apakah kamu yakin ingin keluar? :(', 'report' => [ 'button_text' => 'Laporkan', 'comments' => 'Komentar Tambahan', - 'placeholder' => 'Mohon berikan informasi apa pun yang Anda yakini dapat bermanfaat.', + 'placeholder' => 'Mohon berikan informasi apa pun yang kamu yakini dapat bermanfaat.', 'reason' => 'Alasan', - 'thanks' => 'Terima kasih atas laporan Anda!', + 'thanks' => 'Terima kasih atas laporanmu!', 'title' => 'Laporkan :username?', 'actions' => [ @@ -141,7 +157,7 @@ ], 'restricted_banner' => [ 'title' => 'Akun Anda telah di-restrict!', - 'message' => 'Selama dibatasi, Anda tidak dapat berinteraksi dengan pengguna lain dan skor Anda hanya akan terlihat oleh Anda. Hal ini biasanya terproses secara otomatis dan akan diangkat dalam 24 jam. Jika Anda ingin mengajukan atas pembatasan Anda, mohon hubungi layanan dukungan.', + 'message' => 'Selama di-restrict, kamu tidak dapat berinteraksi dengan pengguna lain dan skormu hanya akan dapat dilihat oleh dirimu sendiri. Hal ini biasanya terproses secara otomatis dan akan diangkat dalam 24 jam. Apabila kamu ingin mengajukan banding, mohon hubungi layanan dukungan.', ], 'show' => [ 'age' => ':age tahun', @@ -152,7 +168,7 @@ 'joined_at' => 'Bergabung pada :date', 'lastvisit' => 'Terakhir terlihat :date', 'lastvisit_online' => 'Saat ini online', - 'missingtext' => 'Mungkin Anda salah ketik! (atau pengguna ini telah di-ban)', + 'missingtext' => 'Mungkin kamu salah ketik! (atau pengguna ini telah di-ban)', 'origin_country' => 'Dari :country', 'previous_usernames' => 'sebelumnya dikenal sebagai', 'plays_with' => 'Bermain menggunakan :devices', @@ -174,7 +190,7 @@ 'broken_file' => 'Gagal memproses gambar. Mohon periksa kembali gambar yang diunggah dan coba lagi.', 'button' => 'Unggah gambar', 'dropzone' => 'Letakkan di sini untuk mengunggah', - 'dropzone_info' => 'Anda juga dapat meletakkan gambar Anda di sini untuk mengunggahnya', + 'dropzone_info' => 'Kamu juga dapat meletakkan gambar di sini untuk mengunggah', 'size_info' => 'Ukuran gambar sampul yang disarankan adalah 2400x640', 'too_large' => 'Berkas yang diunggah terlalu besar.', 'unsupported_format' => 'Format tidak didukung.', @@ -188,7 +204,7 @@ 'default_playmode' => [ 'is_default_tooltip' => 'mode permainan utama', - 'set' => 'atur :mode sebagai mode permainan utama Anda', + 'set' => 'atur :mode sebagai mode permainan utamamu', ], ], @@ -310,7 +326,7 @@ 'title' => 'saya!', ], 'medals' => [ - 'empty' => "Pengguna ini belum mendapatkannya. ;_;", + 'empty' => "Pengguna ini belum membuka medali apapun. ;_;", 'recent' => 'Terbaru', 'title' => 'Medali', ], @@ -393,18 +409,18 @@ 'not_found' => [ 'reason_1' => 'Pengguna ini telah mengubah nama penggunanya.', 'reason_2' => 'Pengguna ini telah dinonaktifkan untuk sementara waktu karena memiliki riwayat masalah yang berhubungan dengan keamanan atau penyalahgunaan akun.', - 'reason_3' => 'Atau mungkin Anda salah ketik!', + 'reason_3' => 'Atau mungkin kamu salah ketik!', 'reason_header' => 'Ada beberapa kemungkinan mengapa hal ini bisa terjadi:', 'title' => 'Pengguna tidak ditemukan! ;_;', ], 'page' => [ 'button' => 'Sunting laman profil', - 'description' => 'saya! adalah area pribadi yang dapat dimodifikasi di laman profil Anda.', + 'description' => 'saya! merupakan area pada laman profilmu yang dapat kamu modifikasi sesuka hati.', 'edit_big' => 'Sunting saya!', 'placeholder' => 'Ketik konten laman di sini', 'restriction_info' => [ - '_' => 'Anda harus menjadi seorang :link untuk dapat menggunakan fitur ini.', + '_' => 'Kamu harus menjadi seorang :link untuk menggunakan fitur ini.', 'link' => 'osu!supporter', ], ], @@ -441,8 +457,8 @@ ], 'silenced_banner' => [ - 'title' => 'Anda sedang di-silence.', - 'message' => 'Anda sedang tidak dapat melakukan tindakan-tindakan tertentu.', + 'title' => 'Kamu sedang di-silence.', + 'message' => 'Kamu sedang tidak dapat melakukan tindakan tertentu.', ], 'status' => [ @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Pengguna dibuat', ], 'verify' => [ diff --git a/resources/lang/id/wiki.php b/resources/lang/id/wiki.php index 5a43559c217..45bba4c0abc 100644 --- a/resources/lang/id/wiki.php +++ b/resources/lang/id/wiki.php @@ -6,13 +6,13 @@ return [ 'show' => [ 'fallback_translation' => 'Laman yang diminta belum diterjemahkan ke dalam bahasa yang dipilih (:language). Menampilkan versi Bahasa Inggris.', - 'incomplete_or_outdated' => 'Informasi yang tertera pada laman ini tidak lengkap atau telah kedaluwarsa. Apabila Anda berkenan, harap bantu kami untuk memperbarui artikel ini!', + 'incomplete_or_outdated' => 'Informasi yang tertera pada laman ini tidak lengkap atau telah kedaluwarsa. Apabila kamu berkenan, harap bantu kami untuk memperbarui artikel ini!', 'missing' => 'Laman ":keyword" yang diminta tidak dapat ditemukan.', 'missing_title' => 'Tidak Ditemukan', 'missing_translation' => 'Laman yang diminta tidak ditemukan untuk bahasa yang saat ini dipilih.', - 'needs_cleanup_or_rewrite' => 'Laman ini tidak memenuhi standar osu! wiki dan perlu dirapikan atau ditulis ulang. Apabila Anda berkenan, harap bantu kami untuk memperbarui artikel ini!', + 'needs_cleanup_or_rewrite' => 'Laman ini tidak memenuhi standar osu! wiki dan perlu dirapikan atau ditulis ulang. Apabila kamu berkenan, harap bantu kami untuk memperbarui artikel ini!', 'search' => 'Cari laman yang ada untuk :link.', - 'stub' => 'Artikel ini merupakan artikel rintisan (stub) yang sedang menunggu untuk dapat dikembangkan lebih lanjut. Informasi yang tertera pada artikel ini belum sepenuhnya lengkap.', + 'stub' => 'Artikel ini merupakan artikel rintisan yang sedang menunggu untuk dikembangkan lebih lanjut.', 'toc' => 'Konten', 'edit' => [ @@ -22,7 +22,7 @@ 'translation' => [ 'legal' => 'Terjemahan ini diberikan semata-mata hanya untuk memudahkan. :default dari artikel ini merupakan satu-satunya versi artikel yang mengikat secara hukum.', - 'outdated' => 'Laman ini mengandung terjemahan yang telah kedaluwarsa dari artikel aslinya. Harap periksa :default dari artikel ini untuk mendapatkan informasi yang paling akurat (dan apabila Anda berkenan, harap bantu kami untuk memperbarui artikel ini)!', + 'outdated' => 'Laman ini mengandung terjemahan yang telah kedaluwarsa dari artikel aslinya. Harap periksa :default dari artikel ini untuk mendapatkan informasi yang paling akurat (dan apabila kamu berkenan, harap bantu kami untuk memperbarui artikel ini)!', 'default' => 'Versi Bahasa Inggris', ], diff --git a/resources/lang/it/beatmapsets.php b/resources/lang/it/beatmapsets.php index 1af86b1623c..6d3a459d986 100644 --- a/resources/lang/it/beatmapsets.php +++ b/resources/lang/it/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Accedi per aggiungere questa beatmap ai preferiti', 'logged-out' => 'Devi avere effettuato il login prima di scaricare qualsiasi beatmap!', 'mapped_by' => 'mappata da :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Non mi piace questa beatmap', 'updated_timeago' => 'ultimo aggiornamento :timeago', diff --git a/resources/lang/it/home.php b/resources/lang/it/home.php index 3f77d5e7f1b..79f9038b0ea 100644 --- a/resources/lang/it/home.php +++ b/resources/lang/it/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "iniziamo
    subito!", 'action' => 'Scarica osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'utenti macOS', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "iniziamo
    subito!", + 'video-guide' => 'video guida', 'help' => [ '_' => 'se hai problemi ad avviare il gioco o a registrarti l\'account, :help_forum_link oppure :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'per macOS', 'linux' => 'per Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'utenti macOS', 'steps' => [ 'register' => [ 'title' => 'registrati', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video guida', ], 'user' => [ diff --git a/resources/lang/it/mail.php b/resources/lang/it/mail.php index bea75e2e35b..bb081e2f93e 100644 --- a/resources/lang/it/mail.php +++ b/resources/lang/it/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Grazie a loro, ora hai accesso ad osu!direct e ad altri benefici da osu!supporter per :duration.', 'features' => 'Puoi trovare ulteriori dettagli su queste funzionalità qui:', 'gifted' => 'Qualcuno ti ha appena regalato un tag osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'La persona che ti ha regalato questo tag ti ha lasciato un messaggio:', 'subject' => 'Ti hanno regalato un tag osu!supporter!', ], diff --git a/resources/lang/it/page_title.php b/resources/lang/it/page_title.php index 8f2e4abfa0b..397746cbebf 100644 --- a/resources/lang/it/page_title.php +++ b/resources/lang/it/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informazioni giocatore', + 'create' => '', 'disabled' => 'avviso', ], 'wiki_controller' => [ diff --git a/resources/lang/it/store.php b/resources/lang/it/store.php index 957759452ad..30c3b4a8507 100644 --- a/resources/lang/it/store.php +++ b/resources/lang/it/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Clicca qui per modificarlo.', 'declined' => 'Il pagamento è stato annullato.', 'delayed_shipping' => 'Attualmente siamo sommersi dagli ordini! Sei libero di effettuare ordini, ma per favore aspettati un **ritardo addizionale di 1-2 settimane** mentre completiamo gli ordini già esistenti.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Nascondi tutti i tag osu!supporter in questo ordine dalla mia attività', 'old_cart' => 'Il tuo carrello sembra essere obsoleto ed è stato ricaricato; per favore riprova.', 'pay' => 'Acquista con Paypal', 'title_compact' => 'pagamento', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Visto che il tuo pagamento era un eCheck, dovrai attendere altri 10 giorni per far passare il pagamento attraverso PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'I tag osu!supporter in questo ordine non verranno mostrati nella tua attività recente.', 'title_compact' => 'ricevuta', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Messaggio: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'regalo ad un giocatore', - 'gift_message' => '', + 'gift_message' => 'aggiungi un messaggio opzionale al tuo regalo (fino a :length caratteri)', 'require_login' => [ '_' => 'Devi :link per poter ottenere un tag supporter!', diff --git a/resources/lang/it/users.php b/resources/lang/it/users.php index 15cce7f4ec8..1af985fbae8 100644 --- a/resources/lang/it/users.php +++ b/resources/lang/it/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Invia messaggio', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh-oh! Sembra che il tuo account sia stato disattivato.', 'warning' => "Nel caso tu abbia violato una regola, è necessario evidenziare che si tratta di un periodo dalla durata di un mese dove non saranno considerate alcune richieste di scuse. Dopo questo periodo, sarai libero di contattarci se lo ritieni opportuno. La creazione di nuovi account dopo la disattivazione di un altro sarà punita con l'estensione del periodo di un mese. È necessario sottolineare che creando un nuovo account ogni volta, violi ancora di più le regole. Ti suggeriamo caldamente di non prendere questa strada!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Utente creato', ], 'verify' => [ diff --git a/resources/lang/ja/beatmapsets.php b/resources/lang/ja/beatmapsets.php index 52fe163e253..d17246c9ab5 100644 --- a/resources/lang/ja/beatmapsets.php +++ b/resources/lang/ja/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'ログインしてこのビートマップをお気に入りに登録する', 'logged-out' => 'ビートマップをダウンロードするにはログインが必要です!', 'mapped_by' => '作者 :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'このビートマップをお気に入りから削除する', 'updated_timeago' => '最終更新 :timeago', @@ -124,7 +125,7 @@ 'genre' => 'ジャンル', 'language' => '言語', 'no_scores' => 'データはまだ計算中です・・・', - 'nominators' => '推薦者', + 'nominators' => 'ノミネーター', 'nsfw' => '過激な表現を含むコンテンツ', 'offset' => 'オンラインオフセット', 'points-of-failure' => '失敗地点', diff --git a/resources/lang/ja/home.php b/resources/lang/ja/home.php index 84b19b36f79..14c2938037b 100644 --- a/resources/lang/ja/home.php +++ b/resources/lang/ja/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "さぁ、
    始めよう!", 'action' => 'osu!をダウンロード', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOSユーザー', + 'mirror' => 'ミラー', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "さぁ、
    始めよう!", + 'video-guide' => '説明動画', 'help' => [ '_' => 'ゲームの開始やアカウント登録に問題がある場合は、:help_forum_link または :support_button。', @@ -86,8 +99,6 @@ 'macos' => 'for macOS', 'linux' => 'for Linux', ], - 'mirror' => 'ミラー', - 'macos-fallback' => 'macOSユーザー', 'steps' => [ 'register' => [ 'title' => 'アカウントを作る', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '説明動画', ], 'user' => [ diff --git a/resources/lang/ja/mail.php b/resources/lang/ja/mail.php index 46582727fa3..80d09bb6195 100644 --- a/resources/lang/ja/mail.php +++ b/resources/lang/ja/mail.php @@ -69,7 +69,7 @@ 'duration' => 'それらのおかげで、次の:duration osu!directやその他のosu!サポーター特典を利用できます。', 'features' => 'これらの機能の詳細については、こちらをご覧ください:', 'gifted' => '誰かがあなたにosu!サポータータグをプレゼントしました!', - 'gift_message' => '', + 'gift_message' => 'このサポータータグを贈った人からのメッセージ:', 'subject' => 'あなたはosu!サポータータグを贈られました!', ], diff --git a/resources/lang/ja/page_title.php b/resources/lang/ja/page_title.php index 33e8b6a3a2c..aebb88de543 100644 --- a/resources/lang/ja/page_title.php +++ b/resources/lang/ja/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'プレイヤー情報', + 'create' => '', 'disabled' => '通知', ], 'wiki_controller' => [ diff --git a/resources/lang/ja/store.php b/resources/lang/ja/store.php index 4e0ddb148f3..da23135d19a 100644 --- a/resources/lang/ja/store.php +++ b/resources/lang/ja/store.php @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'メッセージ :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'プレイヤーにギフトを贈る', - 'gift_message' => '', + 'gift_message' => 'ギフトに任意のメッセージを追加 (最大 :length 文字)', 'require_login' => [ '_' => 'サポータータグを入手するには:linkが必要です!', diff --git a/resources/lang/ja/users.php b/resources/lang/ja/users.php index d85c6579481..ebd22f4245b 100644 --- a/resources/lang/ja/users.php +++ b/resources/lang/ja/users.php @@ -52,6 +52,22 @@ 'send_message' => 'メッセージの送信', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'ああ!アカウントが無効になっているようです。', 'warning' => "ルールに違反した場合は、通常1か月のクールダウン期間があり、その間のリクエストは考慮されません。この期間の後、必要と思われる場合はお気軽にお問い合わせください。無効にしたアカウントを1つ作成した後に新しいアカウントを作成すると、1か月のクールダウンが延長されることに注意してください。また、作成するすべてのアカウントが、さらなる規則に違反することに注意してください。この道をたどらないでください!", @@ -218,7 +234,7 @@ 'title' => 'Lovedされたビートマップ', ], 'nominated' => [ - 'title' => '推薦されたランクビートマップ', + 'title' => 'ノミネートしたRankedビートマップ', ], 'pending' => [ 'title' => 'Pendingビートマップ', @@ -451,6 +467,8 @@ 'offline' => 'オフライン', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'ユーザーが作成されました', ], 'verify' => [ diff --git a/resources/lang/ko/beatmapsets.php b/resources/lang/ko/beatmapsets.php index ce9b1be429c..329849e6f4b 100644 --- a/resources/lang/ko/beatmapsets.php +++ b/resources/lang/ko/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '로그인하여 이 비트맵을 즐겨찾기 하세요.', 'logged-out' => '로그인 후 비트맵을 다운로드하세요!', 'mapped_by' => ':mapper 님의 맵', + 'mapped_by_guest' => '', 'unfavourite' => '즐겨찾기 해제', 'updated_timeago' => ':timeago에 마지막으로 수정', diff --git a/resources/lang/ko/home.php b/resources/lang/ko/home.php index c8f0ddca42d..bc3e9cc8a3d 100644 --- a/resources/lang/ko/home.php +++ b/resources/lang/ko/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "시작해봐요!", 'action' => 'osu! 다운로드', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS 사용자', + 'mirror' => '미러', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "시작해봐요!", + 'video-guide' => '영상 가이드', 'help' => [ '_' => '게임을 시작하거나 계정을 등록하는데 문제가 있다면, :help_forum_link 하거나 :support_button 해보세요.', @@ -86,8 +99,6 @@ 'macos' => 'macOS 용', 'linux' => 'Linux 용', ], - 'mirror' => '미러', - 'macos-fallback' => 'macOS 사용자', 'steps' => [ 'register' => [ 'title' => '계정 만들기', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '영상 가이드', ], 'user' => [ diff --git a/resources/lang/ko/mail.php b/resources/lang/ko/mail.php index cccbeb13b98..5ea7a463b8f 100644 --- a/resources/lang/ko/mail.php +++ b/resources/lang/ko/mail.php @@ -67,7 +67,7 @@ 'duration' => '선물해주신 분 덕분에 :duration 동안 osu!direct를 비롯한 다른 osu! 서포터 혜택을 누리실 수 있습니다.', 'features' => '자세한 기능은 다음 링크를 통해 확인하실 수 있습니다:', 'gifted' => '누군가가 당신에게 osu! 서포터 태그를 선물했습니다!', - 'gift_message' => '', + 'gift_message' => '이 태그를 선물하신 분께서 메시지를 남기셨어요:', 'subject' => 'osu! 서포터 태그를 선물 받았습니다!', ], diff --git a/resources/lang/ko/page_title.php b/resources/lang/ko/page_title.php index 28b61c5fdc6..173dcff4092 100644 --- a/resources/lang/ko/page_title.php +++ b/resources/lang/ko/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '플레이어 정보', + 'create' => '', 'disabled' => '알림', ], 'wiki_controller' => [ diff --git a/resources/lang/ko/store.php b/resources/lang/ko/store.php index 10022637dc0..492ffa0e5b4 100644 --- a/resources/lang/ko/store.php +++ b/resources/lang/ko/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => '편집하려면 클릭하세요.', 'declined' => '결제가 취소되었습니다.', 'delayed_shipping' => '현재 주문이 밀려있습니다! 주문을 해주시는건 기쁘지만, 지금 주문을 처리하는데 **1~2 주 지연**될 수 있다는 걸 알려드립니다.', - 'hide_from_activity' => '', + 'hide_from_activity' => '나의 활동에서 이 주문에 있는 모든 osu! 서포터 태그 내역 숨기기', 'old_cart' => '장바구니가 오래되어 새로 고쳐졌습니다, 다시 시도해 주세요.', 'pay' => 'Paypal로 결제', 'title_compact' => '결제', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'eCheck로 결제하셨다면 10일까지 PayPal을 통해 결제할 수 있도록 허용해주세요.', - 'hide_from_activity' => '', + 'hide_from_activity' => '이 주문에 포함된 osu! 서포터 내역은 나의 최근 활동에 표시되지 않습니다.', 'title_compact' => '청구서', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => '메시지: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => '선물하기', - 'gift_message' => '', + 'gift_message' => '선물에 메시지를 남겨보세요! (최대 :length자)', 'require_login' => [ '_' => 'osu! 서포터 태그를 구매하려면 :link하셔야 합니다!', diff --git a/resources/lang/ko/users.php b/resources/lang/ko/users.php index b482d41a86d..5a7da90680d 100644 --- a/resources/lang/ko/users.php +++ b/resources/lang/ko/users.php @@ -52,6 +52,22 @@ 'send_message' => '메시지 보내기', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '이런! 계정이 비활성화 된 것 같네요.', 'warning' => "규칙을 어긴 경우, 일반적으로 한 달 동안 어떠한 사면 요청도 받고 있지 않습니다. 해당 기간이 끝난 후, 사면이 필요하다고 판단될 경우 언제든지 저희에게 연락하실 수 있습니다. 하나의 계정이 비활성화된 이후 새로운 계정을 만들면 한 달의 기간이 연장될 수 있음을 명심해주세요. 또한, 계정을 새로 만들 때마다 더욱 규칙 위반으로 간주한다는 것을 잊지 마세요. 이 길은 절대로 건너지 말아 주시기 바랍니다!", @@ -451,6 +467,8 @@ 'offline' => '오프라인', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '사용자 계정 생성됨', ], 'verify' => [ diff --git a/resources/lang/lt-LT/accounts.php b/resources/lang/lt-LT/accounts.php index c1f18189bea..14f36e28882 100644 --- a/resources/lang/lt-LT/accounts.php +++ b/resources/lang/lt-LT/accounts.php @@ -61,7 +61,7 @@ 'comment_new' => 'nauji komentarai', 'forum_topic_reply' => 'temos atsakymas', 'mail' => 'paštas', - 'mapping' => 'bitmapų maperis', + 'mapping' => 'bitmapo kūrėjas', 'push' => 'push', 'user_achievement_unlock' => 'žaidėjo medalis atrakintas', ], diff --git a/resources/lang/lt-LT/api.php b/resources/lang/lt-LT/api.php index ff6395e1022..2a34dba9892 100644 --- a/resources/lang/lt-LT/api.php +++ b/resources/lang/lt-LT/api.php @@ -17,11 +17,11 @@ 'identify' => 'Nustatyti jūsų tapatybę ir skaityti jūsų viešąjį profilį.', 'chat' => [ - 'write' => 'Siųskite žinutes jūsų vardu.', + 'write' => 'Siųsti žinutes jūsų vardu.', ], 'forum' => [ - 'write' => 'Kūrti ir redaguoti forumo temas ir žinutes jūsų vardu.', + 'write' => 'Kurti ir redaguoti forumo temas ir įrašus jūsų vardu.', ], 'friends' => [ diff --git a/resources/lang/lt-LT/artist.php b/resources/lang/lt-LT/artist.php index 135bf7a4149..0ed45fb97a3 100644 --- a/resources/lang/lt-LT/artist.php +++ b/resources/lang/lt-LT/artist.php @@ -13,12 +13,12 @@ 'beatmaps' => [ '_' => 'Bitmapai', - 'download' => 'Parsisiųsti Bitmapo šabloną', + 'download' => 'Atsisiųsti Bitmapo šabloną', 'download-na' => 'Bitmapo Šablonas dar nepasiekiamas', ], 'index' => [ - 'description' => 'Rekomenduojami atlikėjai - tai atlikėjai su kuriais mes bendradarbiaujame norit suteikti naujausią ir orginaliausią muziką osu! žaidime. Šie atlikėjai ir jų išskirtiniai kūriniai buvo išrinkti osu! komandos kaip geriausi ir labiausiai tinkami bitmapų kūrimui. Kai kurie atlikėjai sukūrė specialiai osu! skirtų kūrinių.

    Visi kūriniai šioje skiltyje yra pateikti jau su sureguliuotu tempu ir buvo oficialiai licenzijuoti naudojimui osu! žaidime ir su osu! žaidimu susijusiam turiniui.', + 'description' => 'Rekomenduojami atlikėjai - tai atlikėjai su kuriais mes bendradarbiaujame norit suteikti naujausią ir orginaliausią muziką osu! žaidime. Šie atlikėjai ir jų išskirtiniai kūriniai buvo išrinkti osu! komandos kaip geriausi ir labiausiai tinkami bitmapų kūrimui. Kai kurie atlikėjai sukūrė specialiai osu! skirtų kūrinių.

    Visi kūriniai šioje skiltyje yra pateikti jau su sureguliuotu tempu ir buvo oficialiai licencijuoti naudojimui osu! žaidime ir su osu! žaidimu susijusiam turiniui.', ], 'links' => [ diff --git a/resources/lang/lt-LT/authorization.php b/resources/lang/lt-LT/authorization.php index ab86f7f84b2..9b6c2a0a348 100644 --- a/resources/lang/lt-LT/authorization.php +++ b/resources/lang/lt-LT/authorization.php @@ -19,7 +19,7 @@ 'nominate' => [ 'exhausted' => 'Jau pasiekei dienos nominacijų limitą, pamėgink rytoj.', 'incorrect_state' => 'Įvyko klaida atliekant šį veiksmą, pamėgink atnaujinti puslapį.', - 'owner' => "Nominuoti savo bitmapo negali.", + 'owner' => " Savo bitmapo nominuoti negali.", 'set_metadata' => 'Jūs turite nustatyti žanrą ir kalbą prieš nominuojant.', ], 'resolve' => [ @@ -27,7 +27,7 @@ ], 'store' => [ - 'mapper_note_wrong_user' => 'Tik bitmapo kūrėjas ar nominatorius/NAT grupės narys gali rašyti į kūrėjo užrašus.', + 'mapper_note_wrong_user' => 'Tik bitmapo savininkas ar nominatorius/NAT grupės narys gali rašyti į kūrėjo užrašus.', ], 'vote' => [ @@ -40,15 +40,15 @@ 'beatmap_discussion_post' => [ 'destroy' => [ - 'not_owner' => 'Jūs galite ištrinti tik savo žinutes.', + 'not_owner' => 'Jūs galite ištrinti tik savo įrašus.', 'resolved' => 'Jūs negalite ištrinti įrašo kuris priklauso išspręstai diskusijai.', - 'system_generated' => 'Automatiškai sugeneruota žinutė negali būti ištrinta.', + 'system_generated' => 'Automatiškai sugeneruotas įrašas negali būti ištrintas.', ], 'edit' => [ - 'not_owner' => 'Tik žinutės autorius gali redaguoti žinutę.', + 'not_owner' => 'Tik įrašo autorius gali redaguoti įrašą.', 'resolved' => 'Jūs negalite redaguoti įrašo kuris priklauso išspręstai diskusijai.', - 'system_generated' => 'Automatiškai sugeneruotos žinutės negali būti redaguotos.', + 'system_generated' => 'Automatiškai sugeneruoti įrašai negali būti redaguojami.', ], 'store' => [ @@ -63,7 +63,7 @@ ], 'chat' => [ - 'annnonce_only' => 'Šis kanalas tik pranešimams.', + 'annnonce_only' => 'Šis kanalas tik skelbimams.', 'blocked' => 'Negalima išsiųsti žinučių vartotojui, kuris yra jūs užblokavęs, ar jūs esat užblokavę.', 'friends_only' => 'Vartotojas šiuo metu užblokavo žinutės iš žmonių, kurie nėra vartotojo draugų sąraše.', 'moderated' => 'Šiuo momentu šis kanalas yra prižiūrimas.', @@ -78,7 +78,7 @@ 'disabled' => 'Komentarai išjungti', ], 'update' => [ - 'deleted' => "Ištrintos žinutės negalima redaguoti.", + 'deleted' => "Ištrinto įrašo negalima redaguoti.", ], ], @@ -98,29 +98,29 @@ 'post' => [ 'delete' => [ - 'only_last_post' => 'Trinti galima tik paskutinę žinutę.', - 'locked' => 'Užrakintos temos žinučių trinti negalima.', + 'only_last_post' => 'Trinti galima tik paskutinį įrašą.', + 'locked' => 'Užrakintos temos įrašų trinti negalima.', 'no_forum_access' => 'Prieiga prie norimo forumo reikalauja papildomų teisių.', - 'not_owner' => 'Tik žinutės autorius gali ištrinti žinutę.', + 'not_owner' => 'Tik įrašo autorius gali ištrinti įrašą.', ], 'edit' => [ - 'deleted' => 'Ištrintos žinutės negalima redaguoti.', - 'locked' => 'Žinutės redagavimas buvo uždraustas.', + 'deleted' => 'Ištrinto įrašo negalima redaguoti.', + 'locked' => 'Įrašo redagavimas buvo uždraustas.', 'no_forum_access' => 'Prieiga prie norimo forumo reikalauja papildomų teisių.', - 'not_owner' => 'Tik žinutės autorius gali ištrinti žinutę.', - 'topic_locked' => 'Po temos užrakinimo trinti žinučių negalima.', + 'not_owner' => 'Tik įrašo autorius gali ištrinti įrašą.', + 'topic_locked' => 'Po temos užrakinimo trinti įrašų negalima.', ], 'store' => [ 'play_more' => 'Prašau pažaisk žaidimą prieš dalyvaujant forumuose! Jei kyla problemų su žaidimu, prašau kreiptis į Pagalbos ir Palaikymo forumą.', - 'too_many_help_posts' => "Tau reikia daugiau žaisti žaidimą prieš siunčiant daugiau žinučių. Jeigu vis dar kyla problemų žaidžiant, siųsk el. paštą į support@ppy.sh", // FIXME: unhardcode email address. + 'too_many_help_posts' => "Tau reikia daugiau žaisti žaidimą prieš publikuojant daugiau įrašų. Jeigu vis dar kyla problemų žaidžiant, siųsk el. laišką į support@ppy.sh", // FIXME: unhardcode email address. ], ], 'topic' => [ 'reply' => [ - 'double_post' => 'Prašome redaguoti paskutinę žinutė, nesunčiant jos dar kartą.', + 'double_post' => 'Prašome redaguoti paskutinį įrašą, vietoj publikavimo dar kartą.', 'locked' => 'Negalima atsakinėti į užrakintą temą.', 'no_forum_access' => 'Prieiga prie norimo forumo reikalauja papildomų teisių.', 'no_permission' => 'Atsakymui neturi leidimo.', diff --git a/resources/lang/lt-LT/beatmap_discussion_posts.php b/resources/lang/lt-LT/beatmap_discussion_posts.php index a1acb3d0f2b..bee01f6b79d 100644 --- a/resources/lang/lt-LT/beatmap_discussion_posts.php +++ b/resources/lang/lt-LT/beatmap_discussion_posts.php @@ -5,7 +5,7 @@ return [ 'index' => [ - 'title' => 'Bitmapo diskusijos žinutės', + 'title' => 'Bitmapo diskusijos Įrašai', ], 'item' => [ diff --git a/resources/lang/lt-LT/beatmap_discussions.php b/resources/lang/lt-LT/beatmap_discussions.php index 02d5e650b2d..d49fd54c49c 100644 --- a/resources/lang/lt-LT/beatmap_discussions.php +++ b/resources/lang/lt-LT/beatmap_discussions.php @@ -7,8 +7,8 @@ 'authorizations' => [ 'update' => [ 'null_user' => 'Redagavimui reikia prisijungti.', - 'system_generated' => 'Sistemos sugeneruotos žinutės negali būti redaguojamos.', - 'wrong_user' => 'Redaguoti gali tik žinutės siuntėjas.', + 'system_generated' => 'Sistemos sugeneruoti įrašai negali būti redaguojami.', + 'wrong_user' => 'Redaguoti gali tik įrašo siuntėjas.', ], ], @@ -46,15 +46,15 @@ ], 'item' => [ - 'created_at' => 'Pranešimo data', + 'created_at' => 'Publikavimo data', 'deleted_at' => 'Ištrynimo data', 'message_type' => 'Tipas', 'permalink' => 'Nuoroda', ], 'nearby_posts' => [ - 'confirm' => 'Nei viena žinutė neišsprendžia mano rūpesčių', - 'notice' => 'Šios žinutės išsiųstos :timestamp (:existing_timestamps). Peržiūrėk jas, prieš siunčiant naują.', + 'confirm' => 'Nei vienas įrašas neišsprendžia mano rūpesčių', + 'notice' => 'Šie įrašai išsiųsti :timestamp (:existing_timestamps). Peržiūrėk juos, prieš publikuojant naują.', 'unsaved' => ':count šioje apžvalgoje ', ], @@ -75,7 +75,7 @@ 'review' => [ 'block_count' => ':used / :max teksto laukų panaudota', - 'go_to_parent' => 'Žiūrėti Apžvalgos Publikacija + 'go_to_parent' => 'Žiūrėti Apžvalgos Įrašą ', 'go_to_child' => 'Peržiūrėti diskusiją ', diff --git a/resources/lang/lt-LT/beatmappacks.php b/resources/lang/lt-LT/beatmappacks.php index 4764aae6599..1020ff4a903 100644 --- a/resources/lang/lt-LT/beatmappacks.php +++ b/resources/lang/lt-LT/beatmappacks.php @@ -5,7 +5,7 @@ return [ 'index' => [ - 'description' => 'Beatmapų kolekcijos pagal temas.', + 'description' => 'Surinktos bitmapų kolekcijos pagal temas.', 'nav_title' => 'sąrašas', 'title' => 'Bitmapų Rinkiniai', diff --git a/resources/lang/lt-LT/beatmaps.php b/resources/lang/lt-LT/beatmaps.php index 55191bb3a65..058bb571666 100644 --- a/resources/lang/lt-LT/beatmaps.php +++ b/resources/lang/lt-LT/beatmaps.php @@ -22,7 +22,7 @@ 'kudosu_denied' => 'Uždrausta gauti kudosu.', 'message_placeholder_deleted_beatmap' => 'Šis sudėtingumas buvo ištrintas, todėl jo diskusijos nebegalimos.', 'message_placeholder_locked' => 'Šio bitmapo diskusijos buvo išjungtos.', - 'message_placeholder_silenced' => "Negali publikuoti diskusijose kol esi užtildytas.", + 'message_placeholder_silenced' => "Negali rašyti diskusijose, kol esi užtildytas.", 'message_type_select' => 'Pasirink Komentaro Tipą', 'reply_notice' => 'Spausk Enter norint atsakyti.', 'reply_placeholder' => 'Rašykite savo atsakymą čia', @@ -55,7 +55,7 @@ ], 'message_hint' => [ - 'in_general' => 'Ši žinutė bus perkeltą į bendrą bitmapo diskusiją. Sunkumo kritikavimui, pradėk žinutę su laiko žyma (pvz.: 00:12:345).', + 'in_general' => 'Šis įrašas bus perkeltas į bendrą bitmapo diskusiją. Sunkumo kritikavimui, pradėk žinutę su laiko žyma (pvz.: 00:12:345).', 'in_timeline' => 'Kad kritikuoti kelias laiko žymas, publikuok kelis kartus (vieną publikacija per laiko žymę).', ], @@ -105,7 +105,7 @@ 'unlink' => 'Atsieti', 'unsaved' => 'Neišsaugota', 'timestamp' => [ - 'all-diff' => 'Publikacijos tarp „Visi sunkumai“ negali būti pažymėtas laiko žyma.', + 'all-diff' => 'Įrašai tarp „Visi sunkumai“ negali būti pažymėti laiko žyma.', 'diff' => 'Jei šis :type prasideda su laiko žyma, jis bus rodomas Laiko Juostoje.', ], ], @@ -140,7 +140,7 @@ 'status-messages' => [ 'approved' => 'Šis bitmapas buvo patvirtintas :date!', 'graveyard' => "Šis bitmapas jau nebeatnaujinamas nuo :date ir greičiausiai buvo apleistas kūrėjo...", - 'loved' => 'Šis beatmapas buvo pridėtas kaip mylimas nuo :date!', + 'loved' => 'Šis bitmapas buvo pridėtas kaip mylimas nuo :date!', 'ranked' => 'Šis bitmapas buvo reitinguotas nuo :date!', 'wip' => 'Pastaba: Šis bitmapas yra kūrėjo pažymėtas kaip vis dar kuriamas.', ], @@ -210,7 +210,7 @@ 'reset_confirm' => [ 'disqualify' => 'Ar jūs užtikrintas? Tai pašalins bitmapą iš kvalifikuotų ir atstatis nominavimo procesą.', - 'nomination_reset' => 'Ar jūs užtikrintas? Naujos problemos publikavimas atstatis nominavimo procesą.', + 'nomination_reset' => 'Ar jūs užtikrintas? Naujos problemos publikavimas atstatys nominavimo procesą.', 'problem_warning' => 'Ar tiktai norite pranešti problemą šiame bitmape? Bitmapo nominuotojai bus informuoti apie problemą.', ], ], @@ -238,7 +238,7 @@ 'title' => 'Pavadinimas', 'artist' => 'Atlikėjas', 'difficulty' => 'Sunkumas', - 'favourites' => 'Mėgstamiausi', + 'favourites' => 'Mėgstami', 'updated' => 'Atnaujintas', 'ranked' => 'Reitinguotas', 'rating' => 'Įvertinimas', @@ -255,7 +255,7 @@ 'general' => [ 'converts' => 'Įtraukti konvertuotus bitmapus', 'featured_artists' => 'Rekomenduojami atlikėjai', - 'follows' => 'Sekami maperiai', + 'follows' => 'Sekami kūrėjai', 'recommended' => 'Rekomenduojamas sunkumas', 'spotlights' => 'Pasižymėję bitmapai', ], @@ -270,7 +270,7 @@ 'status' => [ 'any' => 'Bet kokie', 'approved' => 'Patvirtintas', - 'favourites' => 'Mėgstamiausi', + 'favourites' => 'Mėgstami', 'graveyard' => 'Kapinės', 'leaderboard' => 'Turi Rezultatų lentą', 'loved' => 'Mylimi', @@ -341,7 +341,7 @@ ], 'panel' => [ 'playcount' => 'Sužaidimų skaičius :count', - 'favourites' => 'Mėgstamiausi :count', + 'favourites' => 'Mėgstami :count', ], 'variant' => [ 'mania' => [ diff --git a/resources/lang/lt-LT/beatmapset_events.php b/resources/lang/lt-LT/beatmapset_events.php index 527d85328e0..0d69347bea0 100644 --- a/resources/lang/lt-LT/beatmapset_events.php +++ b/resources/lang/lt-LT/beatmapset_events.php @@ -6,43 +6,43 @@ return [ 'event' => [ 'approve' => 'Patvirtintas.', - 'beatmap_owner_change' => 'Savininkas šio sudėtingumo :beatmap buvo pakeistas į :new_user.', - 'discussion_delete' => '', - 'discussion_lock' => '', - 'discussion_post_delete' => '', - 'discussion_post_restore' => '', - 'discussion_restore' => '', - 'discussion_unlock' => '', - 'disqualify' => '', - 'disqualify_legacy' => '', + 'beatmap_owner_change' => 'Sunkumo savininkas :beatmap buvo pakeistas į :new_user.', + 'discussion_delete' => 'Moderatorius ištrynė diskusija :discussion.', + 'discussion_lock' => 'Šio bitmapo diskusijos buvo išjungtos. (:text)', + 'discussion_post_delete' => 'Moderatorius ištrynė įrašą iš diskusijos :discussion.', + 'discussion_post_restore' => 'Moderatorius atkūrė įrašą tarp diskusijos :discussion.', + 'discussion_restore' => 'Moderatorius atkūrė diskusiją :discussion.', + 'discussion_unlock' => 'Šio bitmapo diskusijos buvo įjungtos.', + 'disqualify' => 'Diskvalifikavo :user. Priežastis: :discussion (:text).', + 'disqualify_legacy' => 'Diskvalifikavo :user. Priežastis: :text.', 'genre_edit' => 'Žanras pakeistas iš :old į :new.', - 'issue_reopen' => '', - 'issue_resolve' => '', - 'kudosu_allow' => '', - 'kudosu_deny' => '', - 'kudosu_gain' => '', - 'kudosu_lost' => '', - 'kudosu_recalculate' => '', - 'language_edit' => '', - 'love' => ':user patiko', - 'nominate' => ':user nominavo.', - 'nominate_modes' => '', - 'nomination_reset' => '', - 'nomination_reset_received' => '', - 'nomination_reset_received_profile' => '', - 'offset_edit' => '', - 'qualify' => 'Šis „Beatmap“ pasisakė reikiamą skaičių nominacijų ir buvo priimtas.', - 'rank' => 'Patvirtintas.', - 'remove_from_loved' => '', + 'issue_reopen' => 'Vartotojo :discussion_user Išspręstą problemą :discussion atidarė vėl :user.', + 'issue_resolve' => 'Problema :discussion iškėlė :discussion_user pažymėjo kaip išspręstą :user.', + 'kudosu_allow' => 'Kudosu atmetimas diskusijoje :discussion buvo pašalintas.', + 'kudosu_deny' => 'Diskusijai :discussion atmestas kudosu.', + 'kudosu_gain' => 'Vartotojo :user diskusija :discussion gavo pakankamai balsų dėl kudosu.', + 'kudosu_lost' => 'Vartotojo :user Diskusija :discussion dėl prarastų balsų, prarado kudosu.', + 'kudosu_recalculate' => 'Diskusijos :discussion kudosu kiekis perskaičiuotas.', + 'language_edit' => 'Kalba pakeista iš :old į :new.', + 'love' => 'Vartotojo :user mylimas.', + 'nominate' => 'Nominavo :user.', + 'nominate_modes' => 'Nominavo :user (:modes).', + 'nomination_reset' => 'Nauja problema :discussion (:text) iššaukė nominacijų atstatymą.', + 'nomination_reset_received' => 'Vartotojo :user nominaciją atstatė :source_user (:text)', + 'nomination_reset_received_profile' => 'Nominaciją atstatė :user (:text)', + 'offset_edit' => 'Tinklo poslinkis pakeistas iš :old į :new.', + 'qualify' => 'Šis bitmapas pasiekė reikiamą nominacijų skaičių ir buvo kvalifikuotas.', + 'rank' => 'Reitinguotas.', + 'remove_from_loved' => 'Pašalino iš mylimų :user. (:text)', 'nsfw_toggle' => [ - 'to_0' => '', - 'to_1' => '', + 'to_0' => 'Pašalinta Eksplicitinio žymė', + 'to_1' => 'Pažymėtas kaip eksplicitinis', ], ], 'index' => [ - 'title' => '', + 'title' => 'Bitmapų seto Įvykiai', 'form' => [ 'period' => 'Laikotarpis', @@ -57,27 +57,27 @@ ], 'type' => [ - 'approve' => 'Patvirtintas', - 'beatmap_owner_change' => '', + 'approve' => 'Patvirtinimas', + 'beatmap_owner_change' => 'Sunkumo savininko pakeitimas', 'discussion_delete' => 'Diskusijos ištrinimas', - 'discussion_post_delete' => '', - 'discussion_post_restore' => '', - 'discussion_restore' => '', - 'disqualify' => '', - 'genre_edit' => 'Pakeisit žanra', - 'issue_reopen' => '', - 'issue_resolve' => '', - 'kudosu_allow' => '', - 'kudosu_deny' => '„Kudosu“ neigimas', - 'kudosu_gain' => '„Kudosu“ gavimas', - 'kudosu_lost' => '„Kudosu“ praradimas', - 'kudosu_recalculate' => '„Kudosu“ perskaičiavimas', - 'language_edit' => 'Redaguojama kalba', - 'love' => '', - 'nominate' => 'Nominacijos', + 'discussion_post_delete' => 'Diskusijos atsakymo ištrynimas', + 'discussion_post_restore' => 'Diskusijos atsakymo atkūrimas', + 'discussion_restore' => 'Diskusijos atkūrimas', + 'disqualify' => 'Diskvalifikacija', + 'genre_edit' => 'Pakeisti žanrą', + 'issue_reopen' => 'Diskusija atidaroma', + 'issue_resolve' => 'Diskusija išspręndžiama', + 'kudosu_allow' => 'Kudosu įgaliojamas', + 'kudosu_deny' => 'Kudosu atmetimas', + 'kudosu_gain' => 'Kudosu gavimas', + 'kudosu_lost' => 'Kudosu praradimas', + 'kudosu_recalculate' => 'Kudosu perskaičiavimas', + 'language_edit' => 'Pakeisti kalbą', + 'love' => 'Mylimas', + 'nominate' => 'Nominacija', 'nomination_reset' => 'Nominacijų atstatymas', - 'nomination_reset_received' => '', - 'nsfw_toggle' => '', + 'nomination_reset_received' => 'Nominacijos atstatymas gautas', + 'nsfw_toggle' => 'Eksplicitinio žymė', 'offset_edit' => 'Poslinkio redagavimas', 'qualify' => 'Kvalifikacija', 'rank' => 'Reitingas', diff --git a/resources/lang/lt-LT/beatmapset_watches.php b/resources/lang/lt-LT/beatmapset_watches.php index 6aaa6083f35..604fe64d3dd 100644 --- a/resources/lang/lt-LT/beatmapset_watches.php +++ b/resources/lang/lt-LT/beatmapset_watches.php @@ -5,12 +5,12 @@ return [ 'index' => [ - 'description' => 'Čia bitmapų diskusijos, kurias sekate. Jūs būsite informuoti, kai bus naujų publikacijų ar atnaujinimų.', + 'description' => 'Čia bitmapų diskusijos, kurias sekate. Jūs būsite informuoti, kai bus naujų įrašų ar atnaujinimų.', 'title_compact' => 'bitmapų diskusijų stebėjimo sąrašas', 'counts' => [ 'total' => 'Stebimi bitmapai', - 'unread' => 'Bitmapai su nauja įvykiais', + 'unread' => 'Bitmapai su naujais įvykiais', ], 'table' => [ diff --git a/resources/lang/lt-LT/beatmapsets.php b/resources/lang/lt-LT/beatmapsets.php index d1aff88feb7..a9a3cac927a 100644 --- a/resources/lang/lt-LT/beatmapsets.php +++ b/resources/lang/lt-LT/beatmapsets.php @@ -5,10 +5,10 @@ return [ 'availability' => [ - 'disabled' => 'Ši „beatmap“. Šiuo metu nėra galimybės atsiųsti.', - 'parts-removed' => '', - 'more-info' => '', - 'rule_violation' => '', + 'disabled' => 'Atsiųsti bitmapą šiuo metu nėra galimybės.', + 'parts-removed' => 'Dalys šio bitmapo buvo pašalintos, kūrėjo ar trečiosios šalies laikančios teises prašymu.', + 'more-info' => 'Žiūrėk čia dėl papildomos informacijos.', + 'rule_violation' => 'Kai kurie elementai buvo pašalinti iš šio bitmapo, įvertinus juos kaip netinkamus naudojimui tarp osu!.', ], 'cover' => [ @@ -16,7 +16,7 @@ ], 'download' => [ - 'limit_exceeded' => '', + 'limit_exceeded' => 'Neskubėk, pažaisk daugiau.', ], 'featured_artist_badge' => [ @@ -25,7 +25,7 @@ 'index' => [ 'title' => 'Bitmapų sąrašas', - 'guest_title' => 'Beatmapai', + 'guest_title' => 'Bitmapai', ], 'panel' => [ @@ -40,34 +40,35 @@ ], 'nominate' => [ - 'hybrid_requires_modes' => '', - 'incorrect_mode' => '', - 'full_bn_required' => '', - 'too_many' => '', + 'hybrid_requires_modes' => 'Mišriame bitmape reikia pasirinkti bent vieną rėžimą nominavimui.', + 'incorrect_mode' => 'Jūs neturite leidimo nominuoti šiam rėžimui: :mode', + 'full_bn_required' => 'Turi būti pilnai įgaliotas nominatorius, kad galėtum atlikti kvalifikavimo nominacija.', + 'too_many' => 'Nominavimo reikalavimai jau patenkinti.', 'dialog' => [ - 'confirmation' => '', + 'confirmation' => 'Ar tikrai norite nominuoti šį bitmapą?', 'header' => 'Nominuoti Bitmapą', - 'hybrid_warning' => '', - 'which_modes' => '', + 'hybrid_warning' => 'pastaba: jūs galite nominuoti tik kartą, tai prašom užtikrinti, kad nominuojate visus rėžimus, kuriuos ketinote', + 'which_modes' => 'Kokiems rėžimams nominuoti?', ], ], 'nsfw_badge' => [ - 'label' => '', + 'label' => 'Eksplicitinis', ], 'show' => [ - 'discussion' => '', + 'discussion' => 'Diskusija', 'details' => [ - 'by_artist' => '', - 'favourite' => '', - 'favourite_login' => '', - 'logged-out' => '', - 'mapped_by' => ':title sukūrė :mapper', - 'unfavourite' => '', - 'updated_timeago' => 'paskiausiai atnaujinta prieš :timeago', + 'by_artist' => ':artist', + 'favourite' => 'Pridėti bitmapą į mėgstamus', + 'favourite_login' => 'Prisijunk, kad mėgti šį bitmapą', + 'logged-out' => 'Reikia prisijungti bitmapų atsisiuntimui!', + 'mapped_by' => 'sukūrė :mapper', + 'mapped_by_guest' => '', + 'unfavourite' => 'Pašalinti bitmapą iš mėgstamų', + 'updated_timeago' => 'paskutinį kartą atnaujinta :timeago', 'download' => [ '_' => 'Atsisiųsti', @@ -77,7 +78,7 @@ ], 'login_required' => [ - 'bottom' => 'kad pasiektum daugiau galimybių', + 'bottom' => 'kad pasiektum daugiau funkcijų', 'top' => 'Prisijungti', ], ], @@ -92,7 +93,7 @@ ], 'favourites' => [ - 'limit_reached' => '', + 'limit_reached' => 'Per daug mėgstamų bitmapų! Pašalink keletą iš mėgstamų prieš bandydamas vėl.', ], 'hype' => [ @@ -123,20 +124,20 @@ 'description' => 'Aprašymas', 'genre' => 'Žanras', 'language' => 'Kalba', - 'no_scores' => '', + 'no_scores' => 'Duomenys dar apskaičiuojami...', 'nominators' => 'Nominatoriai', 'nsfw' => 'Eksplicitinis turinys', 'offset' => 'Tinklo poslinkis', 'points-of-failure' => 'Pralaimėjimų Vietos', 'source' => 'Šaltinis', 'storyboard' => 'Šis bitmapas turi foninę animaciją', - 'success-rate' => 'Sėkmingi kartai', + 'success-rate' => 'Įveikimų Rodiklis', 'tags' => 'Žymos', 'video' => 'Šis bitmapas turi vaizdo įrašą', ], 'nsfw_warning' => [ - 'details' => '', + 'details' => 'Šiame bitmape yra eksplicitinio, įžeidžiančio ar nerimą keliančio turinio. Vis tiek rodyti?', 'title' => 'Eksplicitinis Turinys', 'buttons' => [ @@ -148,19 +149,19 @@ 'scoreboard' => [ 'achieved' => 'pasiekta :when', - 'country' => 'Šalies reitingai', + 'country' => 'Šalies Rezultatai', 'error' => 'Nepaviko įkelti rezultatų', - 'friend' => 'Draugų reitingai', - 'global' => 'Pasaulinis Reitingas', - 'supporter-link' => '', - 'supporter-only' => 'Tau reikia turėti osu!supporter, kad pasiektum draugų ir Šalių reitingus!', + 'friend' => 'Draugų Rezultatai', + 'global' => 'Pasauliniai Rezultatai', + 'supporter-link' => 'Spausk čia, kad pamatytum visus privalomus, kuriuos gausi!', + 'supporter-only' => 'Tu turi būti osu!rėmėjas, kad pasiektum draugų, šalių ar konkrečių modų rezultatus!', 'title' => 'Rezultatų lenta', 'headers' => [ - 'accuracy' => 'Taiklumas', - 'combo' => 'Didžiausias combo', + 'accuracy' => 'Tikslumas', + 'combo' => 'Didžiausias Kombo', 'miss' => 'Nepataikyti', - 'mods' => 'Modifikacijos', + 'mods' => 'Modai', 'pin' => 'Prisegti', 'player' => 'Žaidėjas', 'pp' => '', @@ -172,8 +173,8 @@ 'no_scores' => [ 'country' => 'Niekas iš jūsų šalies dar neįstatė rezultato šiam bitmapui!', - 'friend' => '', - 'global' => '', + 'friend' => 'Niekas iš jūsų draugų dar nenustatė rezultato šiam bitmapui!', + 'global' => 'Jokiu rezultatų. Galbūt norėtum pabandyti nustatyti koki?', 'loading' => 'Įkeliami rezultatai...', 'unranked' => 'Nereitinguotas bitmapas.', ], @@ -190,19 +191,19 @@ 'stats' => [ 'cs' => 'Apskritimų dydis', 'cs-mania' => 'Klavišų kiekis', - 'drain' => 'Gyvybės išsekimas', + 'drain' => 'HP išsekimas', 'accuracy' => 'Tikslumas', 'ar' => 'Artėjimo greitis', - 'stars' => 'Žvaigždžių sunkumas', - 'total_length' => 'Trukmė', + 'stars' => 'Žvaigždžių Įvertinimas', + 'total_length' => 'Trukmė (Senkimo trukmė: :hit_length)', 'bpm' => 'BPM', 'count_circles' => 'Apskritimų skaičius', 'count_sliders' => 'Slidukų Skaičius', 'offset' => 'Tinklo poslinkis: :offset', - 'user-rating' => 'Narių įvertinimas', - 'rating-spread' => 'Vertimų išsidėstymas', + 'user-rating' => 'Vartotojų Įvertinimas', + 'rating-spread' => 'Vertinimų Išsidėstymas', 'nominations' => 'Nominacijos', - 'playcount' => 'Žaidimų skaičius', + 'playcount' => 'Sužaidimų skaičius', ], 'status' => [ diff --git a/resources/lang/lt-LT/chat.php b/resources/lang/lt-LT/chat.php index 03b25d83cf3..aa6fbbbbf51 100644 --- a/resources/lang/lt-LT/chat.php +++ b/resources/lang/lt-LT/chat.php @@ -4,58 +4,58 @@ // See the LICENCE file in the repository root for full licence text. return [ - 'loading_users' => '', + 'loading_users' => 'įkeliami vartotojai...', 'talking_in' => 'pokalbis :channel', 'talking_with' => 'pokalbis su :name', - 'title_compact' => 'pokalbis', + 'title_compact' => 'pokalbiai', 'cannot_send' => [ - 'channel' => 'Šiuo metu tu negali rašyti šiame kanale. Taip galėjo nutikti dėl kažkurios iš šių priežasčių:', - 'user' => 'Šiuo metu tu negali rašyti šiam žaidėjui. Taip galėjo nutikti dėl kažkurios iš šių priežasčių:', + 'channel' => 'Šiuo metu jūs negalite rašyti šiame kanale.', + 'user' => 'Šiuo metu jūs negalite rašyti šiam žaidėjui.', ], 'channels' => [ - 'confirm_part' => '', - 'create' => '', + 'confirm_part' => 'Ar norite paslėpti šį kanalą? Jūs toliau gausite žinutes iš šio kanalo.', + 'create' => 'kurti skelbimą', 'list' => [ 'title' => [ - 'ANNOUNCE' => '', - 'GROUP' => '', - 'PM' => '', - 'PUBLIC' => '', + 'ANNOUNCE' => 'Skelbimai', + 'GROUP' => 'Grupės', + 'PM' => 'Tiesioginės žinutės', + 'PUBLIC' => 'Kanalai', ], ], ], 'form' => [ 'title' => [ - 'announcement' => '', + 'announcement' => 'Sukurti Naują Skelbimą', ], 'labels' => [ - 'description' => '', - 'name' => '', - 'users' => '', + 'description' => 'aprašymas', + 'name' => 'kambario pavadinimas', + 'users' => 'žaidėjai pridėjimui', ], ], 'not_found' => [ - 'message' => '', - 'title' => '', + 'message' => 'Čia nieko nėra. Galbūt jūs palikote šį kanalą arba jis nebeegzistuoja...', + 'title' => 'kanalas nerastas', ], 'input' => [ - 'create' => '', + 'create' => 'Kurti', 'disabled' => 'žinutės išsiųsti nepavyko...', - 'disconnected' => '', + 'disconnected' => 'Atjungta', 'placeholder' => 'rašyk čia...', 'send' => 'Siųsti', ], 'no-conversations' => [ - 'howto' => "", - 'lazer' => '', + 'howto' => "Pradėkite pokalbį iš vartotojo profilio arba iššokančios kortelės.", + 'lazer' => 'Vieši kanalai prisijungti per osu!lazer bus matomi ir čia.', 'title' => 'kol kas pokalbių nėra', ], ]; diff --git a/resources/lang/lt-LT/comments.php b/resources/lang/lt-LT/comments.php index 81057bd45cf..7b427da06f1 100644 --- a/resources/lang/lt-LT/comments.php +++ b/resources/lang/lt-LT/comments.php @@ -7,12 +7,12 @@ 'deleted' => 'ištrinta', 'deleted_by' => 'prieš :timeago ištrinė :user', 'deleted_by_system' => 'sistema', - 'deleted_count' => '::count_delimited ištrintas komentaras|:count_delimited ištrinti (-a) komentarai (-ų)', + 'deleted_count' => '::count_delimited ištrintas komentaras|:count_delimited ištrinta komentarų', 'edited' => 'redaguota :timeago pateikė :user', 'pinned' => 'prisegta', 'empty' => 'Dar komentarų nėra.', 'load_replies' => 'krauti atsakymus', - 'replies_count' => ':count_delimited atsakymas|:count_delimited atsakymai (-ų)', + 'replies_count' => ':count_delimited atsakymas|:count_delimited atsakymų', 'title' => 'Komentarai', 'commentable_name' => [ @@ -26,7 +26,7 @@ 'textarea_hint' => [ '_' => 'Spausk enter kad :action. Spausk shift+enter naujai eilutei.', 'edit' => 'išsaugoti', - 'new' => 'siųsti', + 'new' => 'publikuoti', 'reply' => 'atsakyti', ], ], diff --git a/resources/lang/lt-LT/common.php b/resources/lang/lt-LT/common.php index 07f0fe6b35f..d11c3f09b91 100644 --- a/resources/lang/lt-LT/common.php +++ b/resources/lang/lt-LT/common.php @@ -20,13 +20,13 @@ 'buttons' => [ 'admin' => 'Administratorius', - 'authorise' => '', - 'authorising' => '', - 'back_to_previous' => '', + 'authorise' => 'Leisti', + 'authorising' => 'Leidžiama...', + 'back_to_previous' => 'Grįžti į ankstesnę poziciją', 'back_to_top' => 'Grįžti į viršų', 'cancel' => 'Atšaukti', 'change' => 'pakeisti', - 'clear' => '', + 'clear' => 'Išvalyti', 'click_to_copy' => 'paspausk, kad nukopijuot', 'click_to_copy_copied' => 'nukopijuotas!', 'close' => 'Užverti', @@ -35,28 +35,28 @@ 'edit' => 'Redaguoti', 'expand' => 'išskleisti', 'hide' => 'slėpti', - 'permalink' => '', - 'pin' => '', - 'post' => 'Siųsti', - 'read_more' => '', + 'permalink' => 'nuoroda', + 'pin' => 'prisegti', + 'post' => 'Publikuoti', + 'read_more' => 'skaityti daugiau', 'reply' => 'Atsakymai', 'reply_reopen' => 'Atsakyti ir atidaryti', 'reply_resolve' => 'Atsakyti ir išspręsti', 'reset' => 'Atstatyti', 'restore' => 'Atkurti', - 'retry' => '', + 'retry' => 'Kartoti', 'save' => 'Išsaugoti', 'saving' => 'Išsaugoma...', 'search' => 'Ieškoti', 'see_more' => 'matyti daugiau', 'show' => 'rodyti', 'show_deleted' => 'Rodyti pašalintus', - 'show_less' => '', + 'show_less' => 'rodyti mažiau', 'show_more' => 'rodyti daugiau', 'show_more_options' => 'rodyti daugiau parinkčių', - 'submit' => '', - 'unpin' => '', - 'update' => '', + 'submit' => 'Pateikti', + 'unpin' => 'atsegti', + 'update' => 'Atnaujinti', 'upload_image' => 'įkelti nuotrauką', 'watch' => [ @@ -66,21 +66,21 @@ ], 'count' => [ - 'badges' => '', - 'days' => 'prieš:count_delimited dieną| prieš:count_delimited dienas', + 'badges' => ':count_delimited ženkliukas|:count_delimited ženkliukai', + 'days' => ':count_delimited diena|:count_delimited dienos', 'hour_short_unit' => 'valanda/valandos', - 'hours' => 'Prieš:count_delimited valandą| Prieš:count_delimited valandas', - 'item' => ':count_delimited matavimo vienetas|:count_delimited matavimo vienetai', + 'hours' => ':count_delimited valanda|:count_delimited valandos', + 'item' => ':count_delimited vienetas|:count_delimited vienetai', 'minute_short_unit' => 'minutė/minutės', - 'minutes' => 'prieš:count_delimited minutę|prieš:count_delimited minutes', - 'months' => 'Prieš:count_delimited mėnesį| Prieš:count_delimited mėnesius', - 'notifications' => '', - 'plus_others' => '', - 'post' => '', + 'minutes' => ':count_delimited minutė|:count_delimited minučių', + 'months' => ':count_delimited mėnesis|:count_delimited mėnesiai', + 'notifications' => ':count_delimited pranešimas|:count_delimited pranešimų', + 'plus_others' => '+ :count_delimited kitas!|:count_delimited kiti!', + 'post' => ':count_delimited įrašas|:count_delimited įrašų', 'second_short_unit' => 'skunde|sekundes', - 'star_priority' => '', - 'update' => '', - 'view' => '', + 'star_priority' => ':count_delimited žvaigždžių pirmenybė|:count_delimited žvaigždžių pirmenybės', + 'update' => ':count_delimited atnaujinimas|:count_delimited atnaujinimų', + 'view' => ':count_delimited peržiūra|:count_delimited peržiūrų', 'years' => 'Prieš:count_delimited metus| Prieš:count_delimited metus', ], @@ -93,32 +93,32 @@ 'datetime' => [ 'year_month' => [ - 'moment' => '', - 'php' => '', + 'moment' => 'MMMM YYYY', + 'php' => 'MMMM y', ], 'year_month_short' => [ - 'moment' => '', + 'moment' => 'MMM YYYY', ], ], 'device' => [ - 'keyboard' => '', - 'mouse' => '', - 'tablet' => '', - 'touch' => '', + 'keyboard' => 'Klaviatūra', + 'mouse' => 'Pele', + 'tablet' => 'Grafinė planšete', + 'touch' => 'Liečiamu Ekranu', ], 'dropzone' => [ - 'target' => '', + 'target' => 'mesk čia, kad įkelti', ], 'input' => [ - 'search' => '', + 'search' => 'ieškoti...', ], 'pagination' => [ - 'previous' => '', - 'next' => '', + 'previous' => 'praeitas', + 'next' => 'kitas', ], 'score_count' => [ @@ -131,18 +131,18 @@ ], 'scoreboard_time' => [ - 'd' => '', - 'dd' => '', - 'h' => '', - 'hh' => '', - 'm' => '', - 'mm' => '', - 'month' => '', - 'months' => '', + 'd' => '%dd', + 'dd' => '%dd', + 'h' => '%d val', + 'hh' => '%d val', + 'm' => 'dabar', + 'mm' => 'dabar', + 'month' => '%d min', + 'months' => '%d min', 'past' => '', - 's' => '', - 'y' => '', - 'yy' => '', + 's' => 'dabar', + 'y' => '%dm', + 'yy' => '%dm', ], 'time' => [ diff --git a/resources/lang/lt-LT/community.php b/resources/lang/lt-LT/community.php index e37ea54939f..993ae334139 100644 --- a/resources/lang/lt-LT/community.php +++ b/resources/lang/lt-LT/community.php @@ -6,141 +6,141 @@ return [ 'support' => [ 'convinced' => [ - 'title' => 'Aš sudomintas! :D', + 'title' => 'Aš įtikintas! :D', 'support' => 'paremk osu!', - 'gift' => 'arba padavonok kitiems žaidėjams', - 'instructions' => 'paspausk širdies formos mygtuką, kad nueitum į osu!store', + 'gift' => 'arba padovanok kitiems žaidėjams', + 'instructions' => 'paspausk širdutę, kad nueitum į osu!parduotuvę', ], 'why-support' => [ - 'title' => 'Kodėl aš turėčiau paremti osu!? Kur mano pinigai eis?', + 'title' => 'Kodėl aš turėčiau paremti osu!? Kur mano pinigai keliaus?', 'team' => [ - 'title' => 'Paremk komanda', - 'description' => '', + 'title' => 'Paremk Komandą', + 'description' => 'Maža komanda kuria ir palaiko osu! Jūsų parama padės jiems žinote... pragyventi.', ], 'infra' => [ - 'title' => '', - 'description' => '', + 'title' => 'Serverių Infrastruktūra', + 'description' => 'Įnašai naudojami serveriams, kad išlaikyti veikianti tinklalapį, žaidimo tinkle paslaugas, internetinę rezultatų lentas, t. t.', ], 'featured-artists' => [ - 'title' => '', - 'description' => '', - 'link_text' => '', + 'title' => 'Rekomenduojami Atlikėjai', + 'description' => 'Su jūsų parama, mes galime susisiekti su daugiau šaunių atlikėjų ir licencijuoti daugiau geros muzikos osu! naudojimui!', + 'link_text' => 'Rodyti dabartinį sąrašą »', ], 'ads' => [ - 'title' => '', - 'description' => '', + 'title' => 'Išlaikyk osu! savarankiška', + 'description' => 'Jūsų įnašai padeda išlaikyti žaidimą savarankiška ir visiškai laisva nuo reklamų ir išorinių rėmėjų.', ], 'tournaments' => [ 'title' => 'Oficialus Turnyrai', - 'description' => '', - 'link_text' => '', + 'description' => 'Padėk finansuoti oficialaus osu! Pasaulinio turnyro veikimą ir prizus.', + 'link_text' => 'Naršyk turnyrus »', ], 'bounty-program' => [ - 'title' => '', - 'description' => '', - 'link_text' => '', + 'title' => 'Atviro Kodo Premijų Programa', + 'description' => 'Paremk bendruomenės pagalbininkus, kurie panaudojo savo laiką ir pastangas, kad osu! būtu geresnis.', + 'link_text' => 'Sužinok daugiau »', ], ], 'perks' => [ - 'title' => '', + 'title' => 'Šaunu! Kokis privalumus gaunu?', 'osu_direct' => [ 'title' => 'osu!direct', - 'description' => '', + 'description' => 'Gauk greitą ir lengvą prieigą į bitmapų paiešką ir atsiuntimus nepaliekant žaidimo.', ], 'friend_ranking' => [ - 'title' => 'Draugų reitingai', - 'description' => "", + 'title' => 'Draugų Rezultatai', + 'description' => "Pamatyk, tinklalapio ar žaidimo, bitmapo rezultatų lentoje koks geras esi palyginus su draugais.", ], 'country_ranking' => [ - 'title' => 'Šalies reitingai', - 'description' => '', + 'title' => 'Šalies Rezultatai', + 'description' => 'Įveik savo šalį prieš įveikdamas pasaulį.', ], 'mod_filtering' => [ 'title' => 'Filtruoti pagal Modus', - 'description' => '', + 'description' => 'Asocijuojasi tik su asmenimis žaidžiančiais HDHR? Nėra problemų!', ], 'auto_downloads' => [ 'title' => 'Automatiniai atsiuntimai', - 'description' => '', + 'description' => 'Bitmapai automatiškai atsisiųs žaidžiant tinkle, stebint žaidėjus ar spaudžiant aktualias nuorodas nuorodas pokalbyje!', ], 'upload_more' => [ 'title' => 'Įkelk daugiau', - 'description' => '', + 'description' => 'Papildomos vietos laukiantiems bitmapams (kas reitinguotą bitmapą) iki daugiausiai 10.', ], 'early_access' => [ - 'title' => 'Ankstyva priėjima', - 'description' => '', + 'title' => 'Ankstyvoji Prieiga', + 'description' => 'Gauk prieigą prie išleistų funkcijų prie jas išleidžiant viešai!

    Tai taip pat apima ankstyvoji prieiga į naujas funkcijas tinklalapyje!', ], 'customisation' => [ 'title' => 'Stiliavimas', - 'description' => "", + 'description' => "Išsiskirk naudodamas savo įkeltą viršelį arba sukurdamas pilnai redaguojamą profilio „aš!“ skiltį.", ], 'beatmap_filters' => [ - 'title' => '„Beatmap“ filtrai', - 'description' => '', + 'title' => 'Bitmapų Filtrai', + 'description' => 'Bitmapų paieškų filtravimas pagal žaistus ir nežaistus, arba pagal pasiektą rezultatą.', ], 'yellow_fellow' => [ - 'title' => '', - 'description' => 'Jūsu vardas žaidime bus nudažytas geltonai.', + 'title' => 'Gelsvasis Draugužis', + 'description' => 'Buk atpažįstamas žaidime su savo naujuoju geltonų vartotojo vardu.', ], 'speedy_downloads' => [ 'title' => 'Greiti atsiuntimai', - 'description' => '', + 'description' => 'Laisvesni atsiuntimų apribojimai, ypač naudojant osu!direct.', ], 'change_username' => [ - 'title' => 'Keisti vartotojo slapyvardį', - 'description' => '', + 'title' => 'Keisk Vartotojo Vardą', + 'description' => 'Vienas nemokamas vardo pakeitimas suteikiamas kartu su pirmu rėmėjo žymos pirkimu.', ], 'skinnables' => [ - 'title' => '', - 'description' => '', + 'title' => 'Išplėstinė išvaizda', + 'description' => 'Daugiau keičiamų žaidimo išvaizdos elementų, tokių kaip pradinio meniu fonas.', ], 'feature_votes' => [ - 'title' => 'Ateities balsavimas', - 'description' => '', + 'title' => 'Funkcijų Balsavimas', + 'description' => 'Balsai funkcijų prašymams. (2 per mėnesį)', ], 'sort_options' => [ 'title' => 'Rūšiavimo parinktys', - 'description' => '', + 'description' => 'Galimybė matyti bitmapų šalies / draugų / konkrečių modų rezultatų lentas.', ], 'more_favourites' => [ - 'title' => 'Daugiau mėgstamiausių', - 'description' => '', + 'title' => 'Daugiau Mėgstamų', + 'description' => 'Maksimalus galimas mėgstamų bitmapų kiekis padidinamas iš :normally → :supporter', ], 'more_friends' => [ 'title' => 'Daugiau draugų', - 'description' => '', + 'description' => 'Maksimalus galimas draugų kiekis padidinamas iš :normally → :supporter', ], 'more_beatmaps' => [ - 'title' => 'Įkelti Daugiau Beatmaps', - 'description' => '', + 'title' => 'Įkelk Daugiau Bitmapų', + 'description' => 'Kiek laukiančių bitmapų vienu metu gali gali turėti apskaičiuojama prie nustatyto kiek pridedant po papildomą už kiekvieną reitinguotą bitmapą (iki limito).

    Įprastai tai yra :base plius :bonus kas reitinguota bitmapą (iki :bonus_max). Su rėmėjo žyma, tai pakyla iki :supporter_base plius :supporter_bonus kas reitinguota bitmapą (iki :supporter_bonus_max).', ], 'friend_filtering' => [ - 'title' => 'Draugų Reitingas', - 'description' => '', + 'title' => 'Draugų Rezultatų Lentos', + 'description' => 'Varžykis su savo draugais ir sužinok kokie tavo rezultatai palyginus su jų!', ], ], 'supporter_status' => [ - 'contribution' => '', - 'gifted' => "", - 'not_yet' => "Jūs dar nesate turėje osu!supporter rolės :(", + 'contribution' => 'Ačiū už jūsų paramą! Jūsų įnašas :dollars per :tags žymų pirkimus!', + 'gifted' => "Jūs atidavėte :giftedTags iš jūsų pirkimų kaip dovanas (Tai verta :giftedDollars), koks dosnus!", + 'not_yet' => "Jūs dar nesate turėjęs osu!rėmėjo žymos :(", 'valid_until' => 'Jūsų osu!rėmėjo žyma galioja iki :date!', 'was_valid_until' => 'Jūsų osu!rėmėjo žyma buvo galiojanti :date.', ], diff --git a/resources/lang/lt-LT/contest.php b/resources/lang/lt-LT/contest.php index 807e3f74fbf..7722dc40690 100644 --- a/resources/lang/lt-LT/contest.php +++ b/resources/lang/lt-LT/contest.php @@ -58,8 +58,8 @@ ], 'vote' => [ 'list' => 'balsai', - 'count' => ':count_delimited balsas|:count_delimited balsai(-ų)', - 'points' => ':count_delimited taškas|:count_delimited taškai(-ų)', + 'count' => ':count_delimited balsas|:count_delimited balsų', + 'points' => ':count_delimited taškas|:count_delimited taškų', ], 'dates' => [ 'ended' => 'Baigėsi :date', diff --git a/resources/lang/lt-LT/follows.php b/resources/lang/lt-LT/follows.php index 9ed3bc684ca..82189e62d4b 100644 --- a/resources/lang/lt-LT/follows.php +++ b/resources/lang/lt-LT/follows.php @@ -24,10 +24,10 @@ ], 'mapping' => [ - 'empty' => 'Nėra stebimų maperių.', + 'empty' => 'Nėra stebimų kūrėjų.', 'followers' => 'mapinimo prenumeratos', - 'page_title' => 'maperių stebėjimo sąrašas', - 'title' => 'maperis', + 'page_title' => 'kūrėjų stebėjimo sąrašas', + 'title' => 'kūrėjas', 'to_0' => 'sustabdyti pranešimus apie vartotojo įkeliamus naujus bitmapus', 'to_1' => 'pranešti man, kai šis vartotojas įkels naują bitmapą', ], diff --git a/resources/lang/lt-LT/forum.php b/resources/lang/lt-LT/forum.php index 7fa807ea3c0..7f4d9ec4126 100644 --- a/resources/lang/lt-LT/forum.php +++ b/resources/lang/lt-LT/forum.php @@ -5,27 +5,27 @@ return [ 'pinned_topics' => 'Prisegtos Temos', - 'slogan' => "", - 'subforums' => 'Subforumai', - 'title' => 'Forumas', + 'slogan' => "pavojinga žaisti vienam.", + 'subforums' => 'Poforumiai', + 'title' => 'Forumai', 'covers' => [ 'edit' => 'Redaguoti viršelį', 'create' => [ '_' => 'Išrinkti viršelio paveikslėlį', - 'button' => 'Įkelti paveiksliuką', + 'button' => 'Įkelti viršelį', 'info' => 'Viršelio dydis turėtu būti :dimensions. Jūs taip pat galite čia įmesti paveikslėlį įkėlimui.', ], 'destroy' => [ - '_' => 'Ištrink viršelio paveikslėlį', + '_' => 'Pašalinti viršelį', 'confirm' => 'Ar tikrai norite pašalinti viršelį?', ], ], 'forums' => [ - 'latest_post' => 'Paskutinieji pranešimai', + 'latest_post' => 'Paskutinis Įrašas', 'index' => [ 'title' => 'Forumo pradžia', @@ -37,23 +37,23 @@ ], 'mark_as_read' => [ - 'forum' => 'Pažymėti foruma kaip skaitytą', + 'forum' => 'Pažymėti forumą kaip skaitytą', 'forums' => 'Pažymėti forumus kaip skaitytus', 'busy' => 'Pažymima kaip skaityta...', ], 'post' => [ - 'confirm_destroy' => 'Tikrai ištrinti posta?', - 'confirm_restore' => 'Tikrai gražinti posta?', - 'edited' => 'Paskutini kartą redaguota :user :when, redaguota :count_delimited kartų. |Paskutini kartą redaguota :user :when, redaguota :count_delimited kartų.', - 'posted_at' => 'paskelbta :when', - 'posted_by' => 'paskelbta :username', + 'confirm_destroy' => 'Tikrai ištrinti įrašą?', + 'confirm_restore' => 'Tikrai gražinti įrašą?', + 'edited' => 'Paskutini kartą redagavo :user :when, redaguota :count_delimited kartų. |Paskutini kartą redagavo :user :when, redaguota :count_delimited kartų.', + 'posted_at' => 'publikuota :when', + 'posted_by' => 'publikavo :username', 'actions' => [ - 'destroy' => 'Ištrinti pranešimą', - 'edit' => 'Redaguoti postą', - 'report' => 'Pranešti apie postą', - 'restore' => 'Gražinti Publikaciją', + 'destroy' => 'Ištrinti įrašą', + 'edit' => 'Redaguoti įrašą', + 'report' => 'Pranešti apie įrašą', + 'restore' => 'Atkūrti įrašą', ], 'create' => [ @@ -63,26 +63,26 @@ ], 'info' => [ - 'post_count' => ':count_delimited publikacija|:count_delimited publikacijos(-ų)', + 'post_count' => ':count_delimited įrašas|:count_delimited įrašų', 'topic_starter' => 'Temos Pradininkas', ], ], 'search' => [ - 'go_to_post' => 'Eiti į postą', - 'post_number_input' => 'įveskite publikacijos numerį', - 'total_posts' => ':posts_count iš viso publikacijų', + 'go_to_post' => 'Eiti į įrašą', + 'post_number_input' => 'įveskite įrašo numerį', + 'total_posts' => ':posts_count iš viso įrašų', ], 'topic' => [ 'confirm_destroy' => 'Tikrai ištrinti temą?', 'confirm_restore' => 'Tikrai gražinti temą?', 'deleted' => 'ištrintos temos', - 'go_to_latest' => 'peržiūrėti vėliausius postus', - 'has_replied' => 'Jūs atsakyte į šią temą', + 'go_to_latest' => 'peržiūrėti naujausius įrašus', + 'has_replied' => 'Jūs atsakėte į šią temą', 'in_forum' => 'tarp :forum', 'latest_post' => ':when iš :user', - 'latest_reply_by' => 'vėliausia atsakyma pateikė :user', + 'latest_reply_by' => 'paskutinį atsakymą pateikė :user', 'new_topic' => 'Nauja tema', 'new_topic_login' => 'Naujos temos publikavimui reikia prisijungti', 'post_reply' => 'Publikuoti', @@ -93,86 +93,86 @@ 'actions' => [ 'destroy' => 'Ištrinti temą', - 'restore' => 'Atstatyti temą', + 'restore' => 'Atkurti tema', ], 'create' => [ 'close' => 'Uždaryti', - 'preview' => 'Peržiūra', + 'preview' => 'Išankstinė peržiūra', // TL note: this is used in the topic reply preview, when // the user goes back from previewing to editing the reply 'preview_hide' => 'Rašyti', - 'submit' => 'Siųsti', + 'submit' => 'Publikuoti', 'necropost' => [ - 'default' => '', + 'default' => 'Tema neveikli jau kuri laiką. Rašykite čia tik jei turite konkrečią priežastį.', 'new_topic' => [ - '_' => "", - 'create' => '', + '_' => "Tema neveikli jau kuri laiką. Jei neturite konkrečios priežasties rašyti čia, prašome :create.", + 'create' => 'sukurti naują temą', ], ], 'placeholder' => [ - 'body' => '', - 'title' => '', + 'body' => 'Rašyk įrašo turinį čia', + 'title' => 'Spausk čia, kad nustatyti pavadinimą', ], ], 'jump' => [ - 'enter' => '', - 'first' => '', - 'last' => '', - 'next' => '', - 'previous' => '', + 'enter' => 'spausk, kad įvesti įrašo numerį', + 'first' => 'eiti į pirmą įrašą', + 'last' => 'eiti į paskutinį įrašą', + 'next' => 'praleisti kitus 10 įrašų', + 'previous' => 'grįžti atgal 10 įrašų', ], 'logs' => [ - '_' => '', - 'button' => '', + '_' => 'Temos žurnalas', + 'button' => 'Naršyti temos žurnalą', 'columns' => [ - 'action' => '', - 'date' => '', - 'user' => '', + 'action' => 'Veiksmas', + 'date' => 'Data', + 'user' => 'Vartotojas', ], 'data' => [ - 'add_tag' => '', - 'announcement' => '', - 'edit_topic' => '', - 'fork' => '', - 'pin' => '', - 'post_operation' => '', - 'remove_tag' => '', - 'source_forum_operation' => '', - 'unpin' => '', + 'add_tag' => 'pridėta ":tag" žyma', + 'announcement' => 'prisegta tema ir pažymėta kaip skelbimas', + 'edit_topic' => 'tarp :title', + 'fork' => 'iš :topic', + 'pin' => 'prisegta tema', + 'post_operation' => 'publikavo :username', + 'remove_tag' => 'pašalinta ":tag" žyma', + 'source_forum_operation' => 'iš :forum', + 'unpin' => 'atsegta tema', ], - 'no_results' => '', + 'no_results' => 'žurnalas tuščias...', 'operations' => [ - 'delete_post' => '', - 'delete_topic' => '', - 'edit_topic' => '', - 'edit_poll' => '', - 'fork' => '', - 'issue_tag' => '', - 'lock' => '', - 'merge' => '', - 'move' => '', - 'pin' => '', - 'post_edited' => '', - 'restore_post' => '', - 'restore_topic' => '', - 'split_destination' => '', - 'split_source' => '', - 'topic_type' => '', - 'topic_type_changed' => '', - 'unlock' => '', - 'unpin' => '', - 'user_lock' => '', - 'user_unlock' => '', + 'delete_post' => 'Ištrintas įrašas', + 'delete_topic' => 'Ištrinta tema', + 'edit_topic' => 'Pakeistas temos pavadinimas', + 'edit_poll' => 'Redaguota temos apklausa', + 'fork' => 'Nukopijuota tema', + 'issue_tag' => 'Pridėta žyma', + 'lock' => 'Užrakinta tema', + 'merge' => 'Sujungti įrašai į šią temą', + 'move' => 'Tema perkelta', + 'pin' => 'Prisegta tema', + 'post_edited' => 'Redaguotas įrašas', + 'restore_post' => 'Atkurtas įrašas', + 'restore_topic' => 'Atkurta tema', + 'split_destination' => 'Perkelti skelti įrašai', + 'split_source' => 'Skelti įrašus', + 'topic_type' => 'Nustatyti temos tipą', + 'topic_type_changed' => 'Pakeistas temos tipas', + 'unlock' => 'Atrakinta tema', + 'unpin' => 'Atsegta tema', + 'user_lock' => 'Užrakinta sava tema', + 'user_unlock' => 'Atrakinta sava tema', ], ], @@ -187,38 +187,38 @@ 'title_compact' => 'forumo temų stebėjimo sąrašas', 'box' => [ - 'total' => '', - 'unread' => '', + 'total' => 'Prenumeruojamos temos', + 'unread' => 'Temos su naujais atsakymais', ], 'info' => [ - 'total' => '', - 'unread' => '', + 'total' => 'Tu prenumeruoji :total temų.', + 'unread' => 'Jus turite :unread neperskaitytų atsakymų tarp pernumeruojamų temų. ', ], ], 'topic_buttons' => [ 'remove' => [ - 'confirmation' => '', - 'title' => '', + 'confirmation' => 'Nebeprenumeruoti temos?', + 'title' => 'Neprenumeruoti', ], ], ], 'topics' => [ - '_' => '', + '_' => 'Temos', 'actions' => [ - 'login_reply' => '', + 'login_reply' => 'Atsakymui reikia prisijungti', 'reply' => 'Atsakyti', - 'reply_with_quote' => '', - 'search' => '', + 'reply_with_quote' => 'Cituoti įrašąatsakymui', + 'search' => 'Ieškoti', ], 'create' => [ 'create_poll' => 'Apklausos kūrimas', - 'preview' => '', + 'preview' => 'Publikuoti Išankstinę Peržiūrą', 'create_poll_button' => [ 'add' => 'Sukurti apklausą', @@ -226,152 +226,152 @@ ], 'poll' => [ - 'hide_results' => '', - 'hide_results_info' => '', - 'length' => '', - 'length_days_suffix' => '', - 'length_info' => '', - 'max_options' => '', - 'max_options_info' => '', + 'hide_results' => 'Slėpti apklausos rezultatus.', + 'hide_results_info' => 'Bus rodoma, kai apklausa baigsis.', + 'length' => 'Apklausa dėl', + 'length_days_suffix' => 'dienos', + 'length_info' => 'Palik tuščia nesibaigiančiai apklausai', + 'max_options' => 'Pasirinkimų vartotojui', + 'max_options_info' => 'Tiek atsakymų variantų gali pasirinkti kiekvienas vartotojas.', 'options' => 'Parinktys', - 'options_info' => '', + 'options_info' => 'Kiekvieną atsakymo variantą rašykite naujoje eilutėje. Iš viso galite įrašyti iki 10 pasirinkimų.', 'title' => 'Klausimas', - 'vote_change' => '', - 'vote_change_info' => '', + 'vote_change' => 'Leisti perbalsavimą.', + 'vote_change_info' => 'Jei įjungta, vartotojams bus leista pakeisti savo balsą.', ], ], 'edit_title' => [ - 'start' => '', + 'start' => 'Keisti pavadinimą', ], 'index' => [ - 'feature_votes' => '', - 'replies' => '', + 'feature_votes' => 'žvaigždžių pirmenybė', + 'replies' => 'atsakymai', 'views' => 'peržiūros', ], 'issue_tag_added' => [ - 'to_0' => 'Pašalinti „pridėjimo“ žymę', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „pridėta“ žymą', + 'to_0_done' => 'Pašalinta „pridėta“ žyma', + 'to_1' => 'Pridėti „pridėta“ žymą', + 'to_1_done' => 'Pridėta "pridėta" žyma', ], 'issue_tag_assigned' => [ - 'to_0' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „priskirta“ žymą', + 'to_0_done' => 'Pašalinta „priskirta“ žyma', + 'to_1' => 'Pridėti „priskirta“ žymą', + 'to_1_done' => 'Pridėta „priskirta“ žyma', ], 'issue_tag_confirmed' => [ - 'to_0' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „patvirtinta“ žymą', + 'to_0_done' => 'Pašalinta „patvirtinta“ žyma', + 'to_1' => 'Pridėti „patvirtinta“ žymą', + 'to_1_done' => 'Pridėta „patvirtinta“ žyma', ], 'issue_tag_duplicate' => [ - 'to_0' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „dubliuota“ žymą', + 'to_0_done' => 'Pašalinta „dubliuota“ žyma', + 'to_1' => 'Pridėti „dubliuota“ žymą', + 'to_1_done' => 'Pridėta „dubliuota“ žyma', ], 'issue_tag_invalid' => [ - 'to_0' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „negalima“ žymą', + 'to_0_done' => 'Pašalinta „negalima“ žyma', + 'to_1' => 'Pridėti „negalima“ žymą', + 'to_1_done' => 'Pridėta „negalima“ žyma', ], 'issue_tag_resolved' => [ - 'to_0' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_done' => '', + 'to_0' => 'Pašalinti „išspręsta“ žymą', + 'to_0_done' => 'Pašalinta „išspręsta“ žyma', + 'to_1' => 'Pridėti „išspręsta“ žymą', + 'to_1_done' => 'Pridėta „išspręsta“ žyma', ], 'lock' => [ - 'is_locked' => '', - 'to_0' => '', - 'to_0_confirm' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_confirm' => '', - 'to_1_done' => '', + 'is_locked' => 'Ši tema yra užrakinta ir negalima atsakyti joje', + 'to_0' => 'Atrakinti temą', + 'to_0_confirm' => 'Atrakinti temą?', + 'to_0_done' => 'Tema buvo atrakinta', + 'to_1' => 'Užrakinti temą', + 'to_1_confirm' => 'Užrakinti temą?', + 'to_1_done' => 'Tema buvo užrakinta', ], 'moderate_move' => [ - 'title' => '', + 'title' => 'Perkelti į kitą forumą', ], 'moderate_pin' => [ - 'to_0' => '', - 'to_0_confirm' => '', - 'to_0_done' => '', - 'to_1' => '', - 'to_1_confirm' => '', - 'to_1_done' => '', - 'to_2' => '', - 'to_2_confirm' => '', - 'to_2_done' => '', + 'to_0' => 'Atsegti temą', + 'to_0_confirm' => 'Atsegti temą?', + 'to_0_done' => 'Tema buvo atsegta', + 'to_1' => 'Prisegti temą', + 'to_1_confirm' => 'Prisegti temą?', + 'to_1_done' => 'Tema buvo prisegta', + 'to_2' => 'Prisegti temą ir pažymėti kaip skelbimą', + 'to_2_confirm' => 'Prisegti temą ir pažymėti kaip skelbimą?', + 'to_2_done' => 'Tema buvo prisegta ir pažymėta kaip skelbimas', ], 'moderate_toggle_deleted' => [ - 'show' => '', - 'hide' => '', + 'show' => 'Rodyti ištrintus įrašus', + 'hide' => 'Slėpti ištrintus įrašus', ], 'show' => [ - 'deleted-posts' => '', - 'total_posts' => '', + 'deleted-posts' => 'Ištrinti Įrašai', + 'total_posts' => 'Iš viso Įrašų', 'feature_vote' => [ - 'current' => '', - 'do' => '', + 'current' => 'Dabartinis prioritetas: +:count', + 'do' => 'Aukštinti šį prašymą', 'info' => [ - '_' => '', - 'feature_request' => '', - 'supporters' => '', + '_' => 'Čia yra :feature_request. Už funkcijų prašymus gali balsuoti :supporters.', + 'feature_request' => 'funkcijų prašymas', + 'supporters' => 'rėmėjai', ], 'user' => [ - 'count' => '', - 'current' => '', - 'not_enough' => "", + 'count' => '{0} nėra balsų|{1} :count_delimited balsas|[2,*] :count_delimited balsų', + 'current' => 'Tau liko :votes balsų.', + 'not_enough' => "Nebeturi balsų", ], ], 'poll' => [ - 'edit' => '', - 'edit_warning' => '', + 'edit' => 'Redaguota apklausa', + 'edit_warning' => 'Redaguodami apklausą pašalinsite dabartinius rezultatus!', 'vote' => 'Balsuoti', 'button' => [ - 'change_vote' => '', - 'edit' => '', - 'view_results' => '', - 'vote' => '', + 'change_vote' => 'Keisti balsą', + 'edit' => 'Redaguoti apklausą', + 'view_results' => 'Pereiti į rezultatus', + 'vote' => 'Balsuoti', ], 'detail' => [ - 'end_time' => '', - 'ended' => '', - 'results_hidden' => '', - 'total' => '', + 'end_time' => 'Apklausa baigsis :time', + 'ended' => 'Apklausa baigėsi :time', + 'results_hidden' => 'Rezultatai bus parodyti, kai baigsis apklausa.', + 'total' => 'Iš viso balsų: :count', ], ], ], 'watch' => [ - 'to_not_watching' => '', - 'to_watching' => '', - 'to_watching_mail' => '', - 'tooltip_mail_disable' => '', - 'tooltip_mail_enable' => '', + 'to_not_watching' => 'Nepažymėtas', + 'to_watching' => 'Pažymėti', + 'to_watching_mail' => 'Pažymėti su pranešimais', + 'tooltip_mail_disable' => 'Pranešimai įjungti. Spausk, kad išjungti', + 'tooltip_mail_enable' => 'Pranešimai išjungti. Spausk, kad įjungti', ], ], ]; diff --git a/resources/lang/lt-LT/home.php b/resources/lang/lt-LT/home.php index 4336f2b8f3c..bee8fbcfcaa 100644 --- a/resources/lang/lt-LT/home.php +++ b/resources/lang/lt-LT/home.php @@ -30,7 +30,7 @@ 'login_required' => 'Prisijunkite, kad ieškoti bitmapų', 'more' => ':count dar bitmapų paieškos rezultatų', 'more_simple' => ' Žiūrėti daugiau bitmapų paieškos rezultatų', - 'title' => 'Beatmaps', + 'title' => 'Bitmapai', ], 'forum_post' => [ @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "gaukime
    ko jums reikia pradžiai!", 'action' => 'Atsisiųsti osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS vartotojams', + 'mirror' => 'dubliavimas', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "gaukime
    ko jums reikia pradžiai!", + 'video-guide' => 'vaizdo gidas', 'help' => [ '_' => 'jei patiriate problemas paleidžiant žaidimą ar registruojantis paskyrai, :help_forum_link arba :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'MacOS sistemai', 'linux' => 'Linux sistemai', ], - 'mirror' => 'dubliavimas', - 'macos-fallback' => 'macOS vartotojams', 'steps' => [ 'register' => [ 'title' => 'susikurk paskyrą', @@ -98,14 +109,13 @@ 'description' => 'paspauskt mygtyką viršuje, kad atsisiųsti diegimo programa, ir paleisk!', ], 'beatmaps' => [ - 'title' => 'gauk bitmaps', + 'title' => 'gauk bitmapų', 'description' => [ '_' => ':browse žaidėjų sukurtus bitmapus ir pradėk juos žaisti!', 'browse' => 'naršyti', ], ], ], - 'video-guide' => 'vaizdo gidas', ], 'user' => [ diff --git a/resources/lang/lt-LT/mail.php b/resources/lang/lt-LT/mail.php index 3bbcd5d2561..d0f15b3ed77 100644 --- a/resources/lang/lt-LT/mail.php +++ b/resources/lang/lt-LT/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Jo ar jos dėka, jūs turite priėjimą prie osu!direct ir kitų osu!rėmėjo privalumų :duration laikotarpiui. ', 'features' => 'Daugiau informacijos apie šiuos privalumus galite rasti čia:', 'gifted' => 'Kažkas jums padovanojo osu!rėmėjo žymą!', - 'gift_message' => '', + 'gift_message' => 'Asmuo padovanojęs jums šią žymą, paliko jums žinutę: ', 'subject' => 'Jums buvo padovanota osu!rėmėjo žyma!', ], diff --git a/resources/lang/lt-LT/model_validation.php b/resources/lang/lt-LT/model_validation.php index 4473ba068ce..4b91348ab28 100644 --- a/resources/lang/lt-LT/model_validation.php +++ b/resources/lang/lt-LT/model_validation.php @@ -26,21 +26,21 @@ 'hype' => [ 'discussion_locked' => "Šio bitmapo diskusija šiuo metu užrakinta ir jis negali būti skatinamas", 'guest' => 'Skatinimui reikia prisijungti.', - 'hyped' => 'Tu jau paskatinai šį beatmapą.', + 'hyped' => 'Tu jau paskatinai šį bitmapą.', 'limit_exceeded' => 'Jau išnaudojai visus savo skatinimus.', 'not_hypeable' => 'Šis Bitmapas negali būti skatinamas', 'owner' => 'Savo bitmapo skatinti negali.', ], 'timestamp' => [ - 'exceeds_beatmapset_length' => 'Nurodytas laikas yra didesnis negu beatmapo trukmė.', + 'exceeds_beatmapset_length' => 'Nurodytas laiko žyma yra didesnė negu bitmapo trukmė.', 'negative' => "Laikas negali būti neigiamas.", ], ], 'beatmapset_discussion_post' => [ 'discussion_locked' => 'Diskusija užrakinta.', - 'first_post' => 'Negalimas ištrinti pirmosios publikacijos.', + 'first_post' => 'Negalimas ištrinti pirmojo įrašo.', 'attributes' => [ 'message' => 'Žinutė', @@ -62,7 +62,7 @@ 'forum' => [ 'feature_vote' => [ - 'not_feature_topic' => '', + 'not_feature_topic' => 'Gali balsuoti tik funkcijų prašymuose.', 'not_enough_feature_votes' => 'Nepakanka balsų.', ], @@ -71,14 +71,14 @@ ], 'post' => [ - 'beatmapset_post_no_delete' => 'Negalima ištrinti bitmapo metaduomenų publikacijos.', - 'beatmapset_post_no_edit' => 'Negalima redaguoti bitmapo metaduomenų publikacijos.', - 'first_post_no_delete' => 'Negalimas ištrinti pirmosios publikacijos', - 'missing_topic' => 'Publikacija neturi temos', + 'beatmapset_post_no_delete' => 'Negalima ištrinti bitmapo metaduomenų įrašo.', + 'beatmapset_post_no_edit' => 'Negalima redaguoti bitmapo metaduomenų įrašo.', + 'first_post_no_delete' => 'Negalimas ištrinti pirmojo įrašo', + 'missing_topic' => 'Įrašas neturi temos', 'only_quote' => 'Jūsų atsakyme yra tik citata.', 'attributes' => [ - 'post_text' => 'Publikacijos laukas', + 'post_text' => 'Įrašo laukas', ], ], diff --git a/resources/lang/lt-LT/multiplayer.php b/resources/lang/lt-LT/multiplayer.php index 367bed7b860..2e406c8421e 100644 --- a/resources/lang/lt-LT/multiplayer.php +++ b/resources/lang/lt-LT/multiplayer.php @@ -14,7 +14,7 @@ 'hosted_by' => 'šeimininkas :user', 'invalid_password' => 'Negaliojantis slaptažodis', 'map_count' => ':count_delimited bitmapas|:count_delimited bitmapai', - 'player_count' => ':count_delimited žaidėjas|:count_delimited žaidėjai (-ų)', + 'player_count' => ':count_delimited žaidėjas|:count_delimited žaidėjų', 'time_left' => ':time liko', 'errors' => [ diff --git a/resources/lang/lt-LT/news.php b/resources/lang/lt-LT/news.php index 37b247d3361..d29c6f9ca2a 100644 --- a/resources/lang/lt-LT/news.php +++ b/resources/lang/lt-LT/news.php @@ -8,8 +8,8 @@ 'title_page' => 'osu!naujienos', 'nav' => [ - 'newer' => 'Naujesnės publikacijos', - 'older' => 'Senesnės publikacijos', + 'newer' => 'Naujesni įrašai', + 'older' => 'Senesni įrašai', ], 'title' => [ @@ -22,13 +22,13 @@ 'by' => ':user', 'nav' => [ - 'newer' => 'Naujesnė publikacija', - 'older' => 'Senesnė publikacija', + 'newer' => 'Naujesnis įrašas', + 'older' => 'Senesnis įrašas', ], 'title' => [ '_' => 'naujienos', - 'info' => 'publikacija', + 'info' => 'Įrašas', ], ], @@ -43,6 +43,6 @@ 'update' => [ 'button' => 'Atnaujinti', - 'ok' => 'Publikacija atnaujinta.', + 'ok' => 'Įrašas atnaujintas.', ], ]; diff --git a/resources/lang/lt-LT/notifications.php b/resources/lang/lt-LT/notifications.php index b12de42ea69..8afe00acdee 100644 --- a/resources/lang/lt-LT/notifications.php +++ b/resources/lang/lt-LT/notifications.php @@ -37,10 +37,10 @@ '_' => 'Bitmapo diskusija', 'beatmapset_discussion_lock' => 'Diskusija tarp ":title" buvo užrakinta', 'beatmapset_discussion_lock_compact' => 'Diskusija buvo užrakinta', - 'beatmapset_discussion_post_new' => 'Nauja žinutė tarp :title" iš :username: ":content"', - 'beatmapset_discussion_post_new_empty' => 'Nauja žinutė tarp :title" iš :username', - 'beatmapset_discussion_post_new_compact' => 'Nauja žinutė iš :username ":content"', - 'beatmapset_discussion_post_new_compact_empty' => 'Nauja žinutė iš :username', + 'beatmapset_discussion_post_new' => 'Naujas įrašas tarp :title" iš :username: ":content"', + 'beatmapset_discussion_post_new_empty' => 'Naujas įrašas tarp :title" iš :username', + 'beatmapset_discussion_post_new_compact' => 'Naujas įrašas iš :username ":content"', + 'beatmapset_discussion_post_new_compact_empty' => 'Naujas įrašas iš :username', 'beatmapset_discussion_review_new' => 'Nauja apžvalga ant ":title" iš :username, kurioje yra problemos: :problems, pasiūlymai: :suggestions, pagyrimai: :praises', 'beatmapset_discussion_review_new_compact' => 'Nauja apžvalga iš :username, kurioje yra problemos: :problems, pasiūlymai: :suggestions, pagyrimai: :praises', 'beatmapset_discussion_unlock' => 'Diskusija apie ":title" buvo atrakinta', @@ -87,12 +87,12 @@ '_' => 'Pokalbiai', 'announcement' => [ - '_' => 'Naujas pranešimas', + '_' => 'Naujas skelbimas', 'announce' => [ 'channel_announcement' => ':username sako ":title"', 'channel_announcement_compact' => ':title', - 'channel_announcement_group' => 'Pranešimas iš :username', + 'channel_announcement_group' => 'Skelbimas iš :username', ], ], @@ -144,11 +144,11 @@ ], 'legacy_pm' => [ - '_' => '', + '_' => 'Senojo Forumo Pranešimas', 'legacy_pm' => [ '_' => '', - 'legacy_pm' => ':count_delimited neperskaityta žinutė|:count_delimited neperskaitytos(-ų) žinutės(-čių)', + 'legacy_pm' => ':count_delimited neperskaityta žinutė|:count_delimited neperskaitytų žinučių', ], ], diff --git a/resources/lang/lt-LT/page_title.php b/resources/lang/lt-LT/page_title.php index 0d54a63faef..113956ea99b 100644 --- a/resources/lang/lt-LT/page_title.php +++ b/resources/lang/lt-LT/page_title.php @@ -35,7 +35,7 @@ '_' => 'rekomenduojami atlikėjai', ], 'beatmap_discussion_posts_controller' => [ - '_' => 'bitmapo diskusijos žinutės', + '_' => 'bitmapo diskusijos Įrašai', ], 'beatmap_discussions_controller' => [ '_' => 'bitmapo diskusijos', @@ -58,7 +58,7 @@ '_' => 'pakeitimų sąrašas', ], 'chat_controller' => [ - '_' => 'pokalbis', + '_' => 'pokalbiai', ], 'comments_controller' => [ '_' => 'komentarai', @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'žaidėjo informacija', + 'create' => '', 'disabled' => 'pastaba', ], 'wiki_controller' => [ diff --git a/resources/lang/lt-LT/rankings.php b/resources/lang/lt-LT/rankings.php index ce275204191..b2a6b0588ae 100644 --- a/resources/lang/lt-LT/rankings.php +++ b/resources/lang/lt-LT/rankings.php @@ -33,7 +33,7 @@ ], 'stat' => [ - 'accuracy' => 'Taiklumas', + 'accuracy' => 'Tikslumas', 'active_users' => 'Aktyvūs Vartotojai', 'country' => 'Šalis', 'play_count' => 'Sužaidimų Skaičius', diff --git a/resources/lang/lt-LT/report.php b/resources/lang/lt-LT/report.php index fe38105f21c..7f078e4939a 100644 --- a/resources/lang/lt-LT/report.php +++ b/resources/lang/lt-LT/report.php @@ -11,7 +11,7 @@ 'beatmapset_discussion_post' => [ 'button' => 'Pranešti', - 'title' => 'Pranešti :username žinutę?', + 'title' => 'Pranešti :username įrašą?', ], 'comment' => [ @@ -21,7 +21,7 @@ 'forum_post' => [ 'button' => 'Pranešti', - 'title' => 'Pranešti :username publikaciją?', + 'title' => 'Pranešti :username įrašą?', ], 'scores' => [ diff --git a/resources/lang/lt-LT/sort.php b/resources/lang/lt-LT/sort.php index 64b43f1946d..902b0b880b2 100644 --- a/resources/lang/lt-LT/sort.php +++ b/resources/lang/lt-LT/sort.php @@ -32,7 +32,7 @@ ], 'forum_topics' => [ - 'feature_votes' => 'Žvaigždžių piemenybė', + 'feature_votes' => 'Žvaigždžių pirmenybė', 'new' => 'Paskutinis atsakymas', ], diff --git a/resources/lang/lt-LT/store.php b/resources/lang/lt-LT/store.php index 581c5dec6ba..1a78e7f31f2 100644 --- a/resources/lang/lt-LT/store.php +++ b/resources/lang/lt-LT/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Norint redaguoti spausk čia.', 'declined' => 'Apmokėjimas buvo atšauktas.', 'delayed_shipping' => 'Šiuo metu yra labai daug užsakymų! Maloniai kviečiame užsakyti prekes, tačiau prekės **papildomai vėluos 1-2 savaites** iki kol mes susidorosime su dabartiniais užsakymais.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Nerodyti visas šio užsakymo osu!rėmėjo žymas tarp mano veiklos', 'old_cart' => 'Tavo prekių krepšelis atrodo nebuvo atnaujintas, pamėgink dar kartą.', 'pay' => 'Apmokėti su Paypal', 'title_compact' => 'apmokėti', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Kadangi jūsų mokėjote el. čekiu, pervedimas gali užtrukti iki 10 dienų kol praeis per PayPal sistemą!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!rėmėjo žymos šiame užsakyme nerodomos jūsų pastarojoje veikloje.', 'title_compact' => 'sąskaita', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Žinutė: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'dovanoti žaidėjui', - 'gift_message' => '', + 'gift_message' => 'pridėti nebūtiną žinutę jūsu dovanai! (iki :length ženklų)', 'require_login' => [ '_' => 'Tu turi būti :link, kad gauti osu!supporter žymę!', diff --git a/resources/lang/lt-LT/users.php b/resources/lang/lt-LT/users.php index 4c204d7b642..bd9d0a18077 100644 --- a/resources/lang/lt-LT/users.php +++ b/resources/lang/lt-LT/users.php @@ -19,7 +19,7 @@ ], 'posts' => [ - 'title_recent' => 'Naujausios žinutės', + 'title_recent' => 'Naujausi įrašai', ], 'votes_received' => [ @@ -52,6 +52,22 @@ 'send_message' => 'Siųsti žinutę', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'O, ne! Panašu, kad jūsu paskyra buvo deaktyvuota.', 'warning' => "Žinokite, kad taisyklės pažeidimo atveju įprastai yra vieno mėnesio nusiraminimo laikotarpis per kurį nepriimame amnestavimo prašymų. Po šio laikotarpio galite su mumis susisiekti, jei jums to reikia. Naujos paskyros susikūrimas po praeitos deaktyvavimo, lydės į šio vieno mėnesio nusiraminimo laikotarpio pratęsimą. Taip pat žinokite, kad kiekviena nauja susikurta paskyra vis labiau laužo taisykles. Mes stipriai rekomenduojame nesirinkti šio kelio!", @@ -106,7 +122,7 @@ ], 'posts' => [ - 'title' => ':username žinutės', + 'title' => ':username įrašai', ], 'anonymous' => [ @@ -159,7 +175,7 @@ 'title' => ":username profilis", 'comments_count' => [ - '_' => 'Paskelbta :link', + '_' => 'Publikuota :link', 'count' => '::count_delimited komentaras|:count_delimited komentarų', ], 'cover' => [ @@ -218,7 +234,7 @@ 'title' => 'Mylimi Bitmapai', ], 'nominated' => [ - 'title' => '', + 'title' => 'Nominuoti Reitinguoti Bitmapai', ], 'pending' => [ 'title' => 'Laukiantis Bitmapai', @@ -268,36 +284,36 @@ 'beatmap_discussion' => [ 'allow_kudosu' => [ - 'give' => 'Gauta :amount už kudosu atmetimo anuliavimą taisymų žinutėje tarp :post', + 'give' => 'Gauta :amount už kudosu atmetimo anuliavimą taisymų įrašą tarp :post', ], 'deny_kudosu' => [ - 'reset' => 'Atmesta :amount už taisymų žinutę :post', + 'reset' => 'Atmesta :amount už taisymų įraša :post', ], 'delete' => [ - 'reset' => 'Prarasta :amount dėl taisymų žinutės ištrynimo iš :post', + 'reset' => 'Prarasta :amount dėl taisymų įrašo ištrynimo iš :post', ], 'restore' => [ - 'give' => 'Gauta :amount dėl taisymų žinutės atstatymo tarp :post', + 'give' => 'Gauta :amount dėl taisymų įrašo atstatymo tarp :post', ], 'vote' => [ - 'give' => 'Gauta :amount už gautus balsus taisymų žinutėje tarp :post', - 'reset' => 'Prarasta :amount dėl prarastu balsų taisymų žinutėje tarp :post', + 'give' => 'Gauta :amount už gautus balsus taisymų įraše tarp :post', + 'reset' => 'Prarasta :amount dėl prarastu balsų taisymų įraše tarp :post', ], 'recalculate' => [ - 'give' => 'Gauta :amount dėl balsų perskaičiavimo taisymų žinutėje tarp :post', - 'reset' => 'Prarasta :amount dėl balsų perskaičiavimo taisymų žinutėje tarp :post', + 'give' => 'Gauta :amount dėl balsų perskaičiavimo taisymų įraše tarp :post', + 'reset' => 'Prarasta :amount dėl balsų perskaičiavimo taisymų įraše tarp :post', ], ], 'forum_post' => [ - 'give' => 'Gauta :amount iš :giver dėl žinutės tarp :post', - 'reset' => ':giver atšaukė kudosu už žinutę tarp :post', - 'revoke' => ':giver atmetė kudosu už žinutę tarp :post', + 'give' => 'Gauta :amount iš :giver dėl įrašo tarp :post', + 'reset' => ':giver atstatė kudosu už įrašą tarp :post', + 'revoke' => ':giver atmetė kudosu už įrašą tarp :post', ], ], @@ -318,9 +334,9 @@ 'title' => 'Žaidimų Rinkiniai', ], 'posts' => [ - 'title' => 'Žinutės', - 'title_longer' => 'Paskutinės žinutės', - 'show_more' => 'rodyti daugiau žinučių', + 'title' => 'Įrašai', + 'title_longer' => 'Paskutiniai Įrašai', + 'show_more' => 'rodyti daugiau įrašų', ], 'recent_activity' => [ 'title' => 'Paskutinės', @@ -356,7 +372,7 @@ 'received' => 'Gauta Balsų (paskutiniai 3 mėnesiai)', 'title' => 'Balsai', 'title_longer' => 'Paskutiniai Balsavimai', - 'vote_count' => 'Prieš:count_delimited balsas| Prieš:count_delimited balsai(-ų)', + 'vote_count' => 'Prieš:count_delimited balsas| Prieš:count_delimited balsų', ], 'account_standing' => [ 'title' => 'Paskyros padėtis', @@ -409,8 +425,8 @@ ], ], 'post_count' => [ - '_' => 'Įnašas :link', - 'count' => ':count_delimited forumo žinutė|:count_delimited forumo žinutės', + '_' => 'Indėlis :link', + 'count' => ':count_delimited forumo įrašas|:count_delimited forumo įrašų', ], 'rank' => [ 'country' => 'Šalies reitingas tarp :mode', @@ -452,6 +468,8 @@ 'offline' => 'Atsijungęs', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Naudotojas sukurtas', ], 'verify' => [ diff --git a/resources/lang/lt-LT/wiki.php b/resources/lang/lt-LT/wiki.php index 7e543d20ab1..fa92915c1f7 100644 --- a/resources/lang/lt-LT/wiki.php +++ b/resources/lang/lt-LT/wiki.php @@ -22,7 +22,7 @@ 'translation' => [ 'legal' => 'Šis vertimas yra tik dėl patogumo. Originalioji :default yra vienintelė teisiškai galiojanti teksto versija.', - 'outdated' => 'Šiame puslapyje turninio vertimas pasenęs. Peržiurėkite :default dėl tiksliausios informacijos ( ir pasvarstyk dėl vertimo atnaujinimo, jei gali)!', + 'outdated' => 'Šiame puslapyje turinio vertimas pasenęs. Peržiūrėkite :default dėl tiksliausios informacijos ( ir pasvarstyk dėl vertimo atnaujinimo, jei gali)!', 'default' => 'Angliška versija', ], diff --git a/resources/lang/lv-LV/beatmapsets.php b/resources/lang/lv-LV/beatmapsets.php index 38de2b765d8..9f3d68ac361 100644 --- a/resources/lang/lv-LV/beatmapsets.php +++ b/resources/lang/lv-LV/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'Jums nepieciešams pierakstīties pirms lejupielādēt jebkuru bītkarti!', 'mapped_by' => 'kartēja :mapper', + 'mapped_by_guest' => '', 'unfavourite' => '', 'updated_timeago' => 'pēdējo reizi atjaonots :timeago', diff --git a/resources/lang/lv-LV/home.php b/resources/lang/lv-LV/home.php index 12f6080878c..b1828a10e12 100644 --- a/resources/lang/lv-LV/home.php +++ b/resources/lang/lv-LV/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "sagatavosim
    tevi!", 'action' => 'Lejuplādēt osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS lietotāji', + 'mirror' => 'instalācija', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "sagatavosim
    tevi!", + 'video-guide' => 'video pamācība', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => 'priekš macOS', 'linux' => 'priekš Linux', ], - 'mirror' => 'instalācija', - 'macos-fallback' => 'macOS lietotāji', 'steps' => [ 'register' => [ 'title' => 'izveido profilu', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video pamācība', ], 'user' => [ diff --git a/resources/lang/lv-LV/page_title.php b/resources/lang/lv-LV/page_title.php index 88375e7c77d..eb16a2f3172 100644 --- a/resources/lang/lv-LV/page_title.php +++ b/resources/lang/lv-LV/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/lv-LV/users.php b/resources/lang/lv-LV/users.php index 28f789ada2a..8cadc29cd2e 100644 --- a/resources/lang/lv-LV/users.php +++ b/resources/lang/lv-LV/users.php @@ -52,6 +52,22 @@ 'send_message' => 'nosūtīt ziņu', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => '', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '', ], 'verify' => [ diff --git a/resources/lang/ms-MY/beatmapsets.php b/resources/lang/ms-MY/beatmapsets.php index 44c58adf3d6..abb94eab2a2 100644 --- a/resources/lang/ms-MY/beatmapsets.php +++ b/resources/lang/ms-MY/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => '', 'mapped_by' => '', + 'mapped_by_guest' => '', 'unfavourite' => '', 'updated_timeago' => '', diff --git a/resources/lang/ms-MY/home.php b/resources/lang/ms-MY/home.php index 18b41e731d1..12ba266d8c1 100644 --- a/resources/lang/ms-MY/home.php +++ b/resources/lang/ms-MY/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "", 'action' => '', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => '', + 'mirror' => '', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "", + 'video-guide' => '', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => '', 'linux' => '', ], - 'mirror' => '', - 'macos-fallback' => '', 'steps' => [ 'register' => [ 'title' => '', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '', ], 'user' => [ diff --git a/resources/lang/ms-MY/page_title.php b/resources/lang/ms-MY/page_title.php index 88375e7c77d..eb16a2f3172 100644 --- a/resources/lang/ms-MY/page_title.php +++ b/resources/lang/ms-MY/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/ms-MY/rankings.php b/resources/lang/ms-MY/rankings.php index a34cb678fa2..2a60caabb18 100644 --- a/resources/lang/ms-MY/rankings.php +++ b/resources/lang/ms-MY/rankings.php @@ -18,9 +18,9 @@ ], 'type' => [ - 'charts' => '', + 'charts' => 'sorotan', 'country' => 'Negara', - 'multiplayer' => 'pemain beramai', + 'multiplayer' => 'pemainan beramai', 'performance' => 'Prestasi', 'score' => 'skor', ], @@ -39,7 +39,7 @@ 'play_count' => 'Kiraan Main', 'performance' => 'Prestasi', 'total_score' => 'Jumlah Skor', - 'ranked_score' => 'Skor Pengelasan', + 'ranked_score' => 'Skor Ranked', 'average_score' => 'Skor Purata', 'average_performance' => 'Prestasi Purata. ', 'ss' => '', diff --git a/resources/lang/ms-MY/users.php b/resources/lang/ms-MY/users.php index 036547834f6..172d0735c4f 100644 --- a/resources/lang/ms-MY/users.php +++ b/resources/lang/ms-MY/users.php @@ -52,6 +52,22 @@ 'send_message' => '', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => '', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '', ], 'verify' => [ diff --git a/resources/lang/nl/beatmapsets.php b/resources/lang/nl/beatmapsets.php index 7c4c5507db8..f7f1ada591d 100644 --- a/resources/lang/nl/beatmapsets.php +++ b/resources/lang/nl/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Log in om deze beatmap als favoriet te markeren', 'logged-out' => 'Je moet ingelogd zijn voordat je beatmaps kan downloaden!', 'mapped_by' => 'gemapped door :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Verwijder markering als favoriet', 'updated_timeago' => 'laatst bijgewerkt :timeago', diff --git a/resources/lang/nl/home.php b/resources/lang/nl/home.php index 136d5002f1a..47a899d151b 100644 --- a/resources/lang/nl/home.php +++ b/resources/lang/nl/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "laten we
    beginnen!", 'action' => 'Download osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS gebruikers', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "laten we
    beginnen!", + 'video-guide' => 'videogids', 'help' => [ '_' => 'als je problemen hebt met het opstarten van het spel of wanneer je een account wilt aanmaken, neem dan een kijkje op het :help_forum_link of neem contact op met :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'voor macOS', 'linux' => 'voor Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS gebruikers', 'steps' => [ 'register' => [ 'title' => 'maak een account', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'videogids', ], 'user' => [ diff --git a/resources/lang/nl/page_title.php b/resources/lang/nl/page_title.php index 8a2f024b9b9..5e2b7a0ab58 100644 --- a/resources/lang/nl/page_title.php +++ b/resources/lang/nl/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'speler info', + 'create' => '', 'disabled' => 'waarschuwing', ], 'wiki_controller' => [ diff --git a/resources/lang/nl/store.php b/resources/lang/nl/store.php index 7db71ff2b75..041e801f47b 100644 --- a/resources/lang/nl/store.php +++ b/resources/lang/nl/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Klik hier om het te wijzigen.', 'declined' => 'De betaling is geannuleerd.', 'delayed_shipping' => 'We zijn momenteel overweldigd met bestellingen! Je kunt nog steeds bestellingen plaatsen maar verwacht dan **een vertraging van 1-2 weken** terwijl wij de bestaande bestellingen verwerken.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Verberg alle osu!supporter tags in deze bestelling van mijn activiteit', 'old_cart' => 'Je winkelwagen lijkt verouderd te zijn en wordt herladen, probeer het opnieuw.', 'pay' => 'Afrekenen met Paypal', 'title_compact' => 'afrekenen', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Aangezien uw betaling een eCheck was, Wacht maximaal 10 dagen extra om de betaling veilig via PayPal te laten gaan!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter tags in deze bestelling worden niet weergegeven in je recente activiteiten.', 'title_compact' => 'factuur', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mededeling: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'schenk aan speler', - 'gift_message' => '', + 'gift_message' => 'voeg een optioneel bericht toe aan uw geschenk! (maximaal :length tekens)', 'require_login' => [ '_' => 'Je moet :link zijn om een osu!supporter tag te krijgen!', diff --git a/resources/lang/nl/users.php b/resources/lang/nl/users.php index b6fd00c32d4..c2542ab190b 100644 --- a/resources/lang/nl/users.php +++ b/resources/lang/nl/users.php @@ -52,6 +52,22 @@ 'send_message' => 'stuur bericht', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh-oh! Het lijkt erop dat je account is uitgeschakeld.', 'warning' => "In het geval dat je een regel hebt overtreden, houd er rekening mee dat er over het algemeen een afkoelperiode van één maand is waarin we geen amnestieverzoeken in behandeling nemen. Na deze periode kunt u contact met ons opnemen als je dit nodig vind. Houd er rekening mee dat het maken van nieuwe accounts nadat uw account is uitgeschakeld, resulteert in een verlenging van deze cool-down van een maand . Houd er ook rekening mee dat voor elk account dat je maakt, je de regels verder overtreedt . We raden je ten zeerste aan om dit niet te doen!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Door gebruiker gemaakt', ], 'verify' => [ diff --git a/resources/lang/no/artist.php b/resources/lang/no/artist.php index 94dfafdf1ec..28f28cfd23a 100644 --- a/resources/lang/no/artist.php +++ b/resources/lang/no/artist.php @@ -30,8 +30,8 @@ 'songs' => [ '_' => 'Sanger', 'count' => ':count sang|:count sanger', - 'original' => '', - 'original_badge' => '', + 'original' => 'osu! original', + 'original_badge' => 'ORIGINAL', ], 'tracklist' => [ diff --git a/resources/lang/no/beatmapsets.php b/resources/lang/no/beatmapsets.php index f7bc1442941..7f564518c8c 100644 --- a/resources/lang/no/beatmapsets.php +++ b/resources/lang/no/beatmapsets.php @@ -20,7 +20,7 @@ ], 'featured_artist_badge' => [ - 'label' => '', + 'label' => 'Utvalgt artist', ], 'index' => [ @@ -29,7 +29,7 @@ ], 'panel' => [ - 'empty' => '', + 'empty' => 'ingen beatmaps', 'download' => [ 'all' => 'last ned', @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'Du må logge inn før du kan laste ned beatmaps!', 'mapped_by' => 'mappet av :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Fjern dette beatmapsettet som en favoritt', 'updated_timeago' => 'sist oppdatert :timeago', diff --git a/resources/lang/no/events.php b/resources/lang/no/events.php index 3ef0ad14f4c..877477300ed 100644 --- a/resources/lang/no/events.php +++ b/resources/lang/no/events.php @@ -20,9 +20,9 @@ 'username_change' => ':previousUsername har endret brukernavn sitt til :user!', 'beatmapset_status' => [ - 'approved' => '', - 'loved' => '', - 'qualified' => '', + 'approved' => 'godkjent', + 'loved' => 'elsket', + 'qualified' => 'kvalifisert', 'ranked' => '', ], ]; diff --git a/resources/lang/no/forum.php b/resources/lang/no/forum.php index b644ee558e6..fbae93823f9 100644 --- a/resources/lang/no/forum.php +++ b/resources/lang/no/forum.php @@ -92,8 +92,8 @@ 'started_by_verbose' => 'startet av :user', 'actions' => [ - 'destroy' => '', - 'restore' => '', + 'destroy' => 'Slett emne', + 'restore' => 'Gjenopprett emne', ], 'create' => [ @@ -160,9 +160,9 @@ 'issue_tag' => '', 'lock' => '', 'merge' => '', - 'move' => '', - 'pin' => '', - 'post_edited' => '', + 'move' => 'Flyttet emne', + 'pin' => 'Festet emne', + 'post_edited' => 'Redigerte innlegget', 'restore_post' => '', 'restore_topic' => '', 'split_destination' => '', diff --git a/resources/lang/no/home.php b/resources/lang/no/home.php index b00f3689679..14798d262b0 100644 --- a/resources/lang/no/home.php +++ b/resources/lang/no/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "la oss
    få deg i gang!", 'action' => 'Last ned osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS brukere', + 'mirror' => 'alternativ link', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "la oss
    få deg i gang!", + 'video-guide' => 'video veiledning', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => 'for macOS', 'linux' => 'for Linux', ], - 'mirror' => 'alternativ link', - 'macos-fallback' => 'macOS brukere', 'steps' => [ 'register' => [ 'title' => 'opprett en konto', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video veiledning', ], 'user' => [ diff --git a/resources/lang/no/page_title.php b/resources/lang/no/page_title.php index 2ac5c5db222..4cec4c90a2c 100644 --- a/resources/lang/no/page_title.php +++ b/resources/lang/no/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'spillerinfo', + 'create' => '', 'disabled' => 'varsel', ], 'wiki_controller' => [ diff --git a/resources/lang/no/store.php b/resources/lang/no/store.php index f0e4922eb30..98cb2296e5d 100644 --- a/resources/lang/no/store.php +++ b/resources/lang/no/store.php @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Melding: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'gi som gave', - 'gift_message' => '', + 'gift_message' => 'legg inn en valgfri melding til din gave! (opptil :length tegn)', 'require_login' => [ '_' => 'Du må være :link for å få tak i en osu!supporter tag!', diff --git a/resources/lang/no/users.php b/resources/lang/no/users.php index b041a146142..50a59df5a57 100644 --- a/resources/lang/no/users.php +++ b/resources/lang/no/users.php @@ -36,10 +36,10 @@ 'comment_text' => '', 'blocked_count' => 'blokkerte brukere (:count)', 'hide_profile' => 'Skjul profil', - 'hide_comment' => '', + 'hide_comment' => 'skjul', 'not_blocked' => 'Den brukeren er ikke blokkert.', 'show_profile' => 'Vis profil', - 'show_comment' => '', + 'show_comment' => 'vis', 'too_many' => 'Maks antall blokkerte personer nådd.', 'button' => [ 'block' => 'Blokker', @@ -52,6 +52,22 @@ 'send_message' => 'send melding', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Oops! Det ser ut som kontoen din er deaktivert.', 'warning' => "I tilfelle du har brutt en regel, vær oppmerksom på at det vanligvis er en nedkjølingsperiode på en måned hvor vi ikke kommer til å vurdere noen amnestiforespørsler. Etter denne periodenm kan du fritt kontakte oss dersom du mener det er nødvendig. Vær oppmerksom på at å opprette nye kontoer etter du har hatt en allerede deaktivert vil resultere i enn utvidelse av denne en måneders nedkjølingsperioden. Du må også huske at med hver bruker du lager, bryter du reglene enda mer. Vi anbefaler på det sterkeste at du ikke gjør dette!", @@ -342,9 +358,9 @@ 'title' => 'Førsteplasser', ], 'pin' => [ - 'to_0' => '', + 'to_0' => 'Løsne', 'to_0_done' => '', - 'to_1' => '', + 'to_1' => 'Fest', 'to_1_done' => '', ], 'pinned' => [ @@ -451,6 +467,8 @@ 'offline' => 'Frakoblet', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Bruker opprettet', ], 'verify' => [ diff --git a/resources/lang/pl/beatmapsets.php b/resources/lang/pl/beatmapsets.php index ede9c5545e8..cc17996def4 100644 --- a/resources/lang/pl/beatmapsets.php +++ b/resources/lang/pl/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Zaloguj się, by dodać tę beatmapę do ulubionych', 'logged-out' => 'Zaloguj się, aby zacząć pobierać beatmapy!', 'mapped_by' => 'autorstwa :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Usuń z ulubionych', 'updated_timeago' => 'ostatnio zaktualizowana :timeago', diff --git a/resources/lang/pl/home.php b/resources/lang/pl/home.php index 9d03306eb6c..8e1cce5ab8a 100644 --- a/resources/lang/pl/home.php +++ b/resources/lang/pl/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "rozpocznij swoją
    przygodę z osu!", 'action' => 'Pobierz osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'użytkownicy macOS', + 'mirror' => 'serwer lustrzany', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "rozpocznij swoją
    przygodę z osu!", + 'video-guide' => 'poradnik', 'help' => [ '_' => 'jeżeli masz problem z uruchomieniem gry bądź utworzeniem konta, :help_forum_link lub :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'dla systemu macOS', 'linux' => 'dla systemu Linux', ], - 'mirror' => 'serwer lustrzany', - 'macos-fallback' => 'użytkownicy macOS', 'steps' => [ 'register' => [ 'title' => 'utwórz konto', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'poradnik', ], 'user' => [ diff --git a/resources/lang/pl/mail.php b/resources/lang/pl/mail.php index 8654db48725..ff4b8a0bf55 100644 --- a/resources/lang/pl/mail.php +++ b/resources/lang/pl/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Dzięki tej osobie otrzymasz dostęp do osu!direct i innych korzyści przeznaczonych dla donatorów osu! przez następne :duration.', 'features' => 'Więcej informacji na temat korzyści wynikających z posiadania statusu donatora osu! znajdziesz tutaj:', 'gifted' => 'Ktoś podarował Ci status donatora osu!', - 'gift_message' => '', + 'gift_message' => 'Użytkownik, który podarował Ci ten status donatora, pozostawił następującą wiadomość:', 'subject' => 'Otrzymujesz status donatora osu!', ], diff --git a/resources/lang/pl/page_title.php b/resources/lang/pl/page_title.php index ea66ae88aae..bf8c920ff19 100644 --- a/resources/lang/pl/page_title.php +++ b/resources/lang/pl/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informacje o użytkowniku', + 'create' => '', 'disabled' => 'powiadomienie', ], 'wiki_controller' => [ diff --git a/resources/lang/pl/store.php b/resources/lang/pl/store.php index 1818c22ecd1..cfe83773dea 100644 --- a/resources/lang/pl/store.php +++ b/resources/lang/pl/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Kliknij tutaj, aby go zedytować.', 'declined' => 'Płatność została anulowana.', 'delayed_shipping' => 'Obecnie jesteśmy przeciążeni zamówieniami! Wciąż możesz złożyć swoje zamówienie, ale spodziewaj się **dodatkowego opóźnienia w postaci 1-2 tygodni**, dopóki te już istniejące nie zostaną zakończone.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ukryj zakup wszystkich statusów donatora osu! z tego zamówienia w mojej aktywności', 'old_cart' => 'Zawartość twojego koszyka była przestarzała i została odświeżona, spróbuj ponownie.', 'pay' => 'Zapłać przez PayPal', 'title_compact' => 'kasa', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Jako że twoja płatność została przesłana czekiem elektronicznym, odczekaj do 10 dni na przetworzenie transakcji przez PayPal.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Zakup statusów donatora osu! z tego zamówienia nie zostanie wyświetlony w twojej aktywności.', 'title_compact' => 'faktura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Wiadomość: „:message”', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'podaruj innemu użytkownikowi', - 'gift_message' => '', + 'gift_message' => 'dołącz opcjonalną wiadomość do tego prezentu (do :length znaków)', 'require_login' => [ '_' => 'Aby uzyskać status donatora osu!, musisz się :link!', diff --git a/resources/lang/pl/users.php b/resources/lang/pl/users.php index a96889bc6d3..59170d5bf5a 100644 --- a/resources/lang/pl/users.php +++ b/resources/lang/pl/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Wyślij wiadomość', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Och! Wygląda na to, że Twoje konto zostało zdezaktywowane.', 'warning' => "Jeżeli złamiesz zasady, pamiętaj o tym, że zwyczajowo obowiązuje okres oczekiwania o długości 1 miesiąca, podczas którego nie będziemy przyjmować żadnych próśb o amnestię. Po tym czasie możesz skontaktować się z nami, jeśli uznasz to za konieczne. Miej na uwadze, że tworzenie nowych kont po otrzymaniu blokady na jedno z nich poskutkuje przedłużeniem tego miesięcznego okresu oczekiwania. Pamiętaj także, że każdorazowe utworzenie nowego konta jest dalszym łamaniem zasad. Stanowczo zalecamy nieobieranie tej ścieżki!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Użytkownik utworzony', ], 'verify' => [ diff --git a/resources/lang/pt-br/beatmapsets.php b/resources/lang/pt-br/beatmapsets.php index 5df869e26ec..56e990536ad 100644 --- a/resources/lang/pt-br/beatmapsets.php +++ b/resources/lang/pt-br/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Inicie a sessão favoritar este beatmap', 'logged-out' => 'Você precisa conectar-se antes de baixar qualquer beatmap!', 'mapped_by' => 'mapeado por :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Remover dos favoritos', 'updated_timeago' => 'última atualização :timeago', diff --git a/resources/lang/pt-br/home.php b/resources/lang/pt-br/home.php index bc0a1da4f20..e836f250948 100644 --- a/resources/lang/pt-br/home.php +++ b/resources/lang/pt-br/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "vamos
    começar!", 'action' => 'Baixar osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'usuários de macOS', + 'mirror' => 'link alternativo', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "vamos
    começar!", + 'video-guide' => 'guia em vídeo', 'help' => [ '_' => 'se você tiver problemas para iniciar o jogo ou registrar-se, :help_forum_link ou :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'para macOS', 'linux' => 'para Linux', ], - 'mirror' => 'link alternativo', - 'macos-fallback' => 'usuários de macOS', 'steps' => [ 'register' => [ 'title' => 'crie uma conta', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'guia em vídeo', ], 'user' => [ diff --git a/resources/lang/pt-br/mail.php b/resources/lang/pt-br/mail.php index 6620b90629d..2e70448d249 100644 --- a/resources/lang/pt-br/mail.php +++ b/resources/lang/pt-br/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Graças a ele(a), você tem acesso ao osu!direct e outros benefícios de osu!supporter por :duration.', 'features' => 'Você pode saber mais detalhes sobre estes recursos aqui:', 'gifted' => 'Alguém acabou de te presentear uma tag do osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'A pessoa que te presenteou essa tag deixou uma mensagem para você:', 'subject' => 'Você foi presenteado com uma osu!supporter tag!', ], diff --git a/resources/lang/pt-br/page_title.php b/resources/lang/pt-br/page_title.php index 892bd97a682..a534f695d33 100644 --- a/resources/lang/pt-br/page_title.php +++ b/resources/lang/pt-br/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informações do jogador', + 'create' => '', 'disabled' => 'aviso', ], 'wiki_controller' => [ diff --git a/resources/lang/pt-br/store.php b/resources/lang/pt-br/store.php index fefcf8f3afa..d40df9c1491 100644 --- a/resources/lang/pt-br/store.php +++ b/resources/lang/pt-br/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Clique aqui para editá-lo.', 'declined' => 'O pagamento foi cancelado.', 'delayed_shipping' => 'Nós estamos sobrecarregados com pedidos! Você é bem-vindo para fazer seu pedido, mas por favor espere um **atraso adicional de 1-2 semanas** enquanto nós realizamos os pedidos mais recentes.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ocultar todas as tags de osu!supporter nesta ordem da minha atividade', 'old_cart' => 'Seu carrinho aparenta estar desatualizado e foi recarregado, por favor tente novamente.', 'pay' => 'Pagar com o Paypal', 'title_compact' => 'pagar', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Como seu pagamento foi um eCheck, por favor aguarde por até 10 dias para se concluir o pagamento via PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'As tags de osu!supporter nesta ordem não são exibidas nas suas atividades recentes.', 'title_compact' => 'fatura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mensagem: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'dar de presente', - 'gift_message' => '', + 'gift_message' => 'adicione uma mensagem opcional ao seu presente! (até :length caracteres)', 'require_login' => [ '_' => 'Você precisa estar :link para conseguir uma osu!supporter tag!', diff --git a/resources/lang/pt-br/users.php b/resources/lang/pt-br/users.php index 55dd3f5291c..84e3a51720c 100644 --- a/resources/lang/pt-br/users.php +++ b/resources/lang/pt-br/users.php @@ -52,6 +52,22 @@ 'send_message' => 'enviar mensagem', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Oh não! Parece que a sua conta foi desativada.', 'warning' => "No caso de você ter infringido uma regra, observe que geralmente há um período de espera de um mês durante o qual não consideraremos nenhum pedido de anistia. Após esse período, você pode entrar em contato conosco caso julgue necessário. Observe que a criação de novas contas após a desativação de uma conta resultará em uma extensão desse período de espera de um mês . Observe também que, para todas as contas criadas, você está violando ainda mais as regras . É altamente recomendável que você não siga esse caminho!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Usuário criado', ], 'verify' => [ diff --git a/resources/lang/pt/beatmapsets.php b/resources/lang/pt/beatmapsets.php index 89f41ee313e..a5c27eb8558 100644 --- a/resources/lang/pt/beatmapsets.php +++ b/resources/lang/pt/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Inicia sessão para pôr este beatmap nos favoritos', 'logged-out' => 'Precisas de iniciar sessão antes de transferir quaisquer beatmaps!', 'mapped_by' => 'mapeado por :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Desmarcar este beatmapset como favorito', 'updated_timeago' => 'atualizado há :timeago', diff --git a/resources/lang/pt/home.php b/resources/lang/pt/home.php index e3a23bb43c5..ea98c08a609 100644 --- a/resources/lang/pt/home.php +++ b/resources/lang/pt/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "vamos pôr-te
    a andar!", 'action' => 'Descarrega o osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'utilizadores de macOS', + 'mirror' => 'link alternativo', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "vamos pôr-te
    a andar!", + 'video-guide' => 'vídeo de guia', 'help' => [ '_' => 'se tiveres problemas ao iniciar o jogo ou ao criar uma conta, vê :help_forum_link ou :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'para macOS', 'linux' => 'para Linux', ], - 'mirror' => 'link alternativo', - 'macos-fallback' => 'utilizadores de macOS', 'steps' => [ 'register' => [ 'title' => 'obtém uma conta', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'vídeo de guia', ], 'user' => [ diff --git a/resources/lang/pt/mail.php b/resources/lang/pt/mail.php index 6ef164effe5..091750136ab 100644 --- a/resources/lang/pt/mail.php +++ b/resources/lang/pt/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Graças a essa pessoa, tens acesso ao osu!direct e a outros benefícios de osu!supporter por :duration.', 'features' => 'Poderás encontrar mais detalhes nestas funcionalidades aqui:', 'gifted' => 'Alguém acabou de te oferecer uma etiqueta osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'A pessoa que te ofereceu esta etiqueta deixou-te uma mensagem:', 'subject' => 'Ofereceram-te uma etiqueta osu!supporter!', ], diff --git a/resources/lang/pt/page_title.php b/resources/lang/pt/page_title.php index e41599ef043..d656c5f4db1 100644 --- a/resources/lang/pt/page_title.php +++ b/resources/lang/pt/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informação do jogador', + 'create' => '', 'disabled' => 'aviso', ], 'wiki_controller' => [ diff --git a/resources/lang/pt/store.php b/resources/lang/pt/store.php index 737d4779c48..6134826ae83 100644 --- a/resources/lang/pt/store.php +++ b/resources/lang/pt/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Clica aqui para editá-lo.', 'declined' => 'O pagamento foi cancelado.', 'delayed_shipping' => 'Nós estamos atualmente sobrecarregados com encomendas! Podes realizar o teu pedido, mas por favor espera aguardar **1-2 semanas** enquanto nos pomos a par dos pedidos existentes.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ocultar todas as etiquetas osu!supporter nesta ordem da minha atividade', 'old_cart' => 'O teu carrinho parece que está fora de prazo e foi recarregado, por favor tenta outra vez.', 'pay' => 'Pagar com Paypal', 'title_compact' => 'pagamento', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Como o teu pagamento era um eCheck, por favor permite até 10 dias extras para o pagamento ser autorizado através do PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'As etiquetas osu!supporter nesta ordem não estão visíveis nas tuas atividades recentes.', 'title_compact' => 'fatura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mensagem: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'oferecer ao jogador', - 'gift_message' => '', + 'gift_message' => 'junta uma mensagem opcional ao teu presente! (até :length caracteres)', 'require_login' => [ '_' => 'Precisas de ter :link para obter uma etiqueta osu!supporter!', diff --git a/resources/lang/pt/users.php b/resources/lang/pt/users.php index 75331642f0d..d6135613396 100644 --- a/resources/lang/pt/users.php +++ b/resources/lang/pt/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Enviar mensagem', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Oh não! Parece que a tua conta foi desativada.', 'warning' => "No caso de teres desrespeitado uma regra, por favor nota que geralmente há um período de espera de 1 mês durante o qual não iremos considerar nenhum pedido de amnistia. Após este período, podes entrar em contacto connosco caso aches necessário. Por favor nota que a criação de novas contas após teres tido uma desativada resultará numa extensão deste período de espera de 1 mês . Por favor nota também que para cada conta que cries, estás a violar ainda mais as regras. Sugerimos muito que não sigas este caminho!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Criado por utilizadores', ], 'verify' => [ diff --git a/resources/lang/ro/beatmapsets.php b/resources/lang/ro/beatmapsets.php index e0886a50339..953f5b1280a 100644 --- a/resources/lang/ro/beatmapsets.php +++ b/resources/lang/ro/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Autentifică-te pentru a adăuga acest beatmap la preferate', 'logged-out' => 'Trebuie să te autentifici înainte de a descărca vreun beatmap!', 'mapped_by' => 'creat de :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Elimină acest beatmapset de la favorite', 'updated_timeago' => 'ultima actualizare :timeago', diff --git a/resources/lang/ro/home.php b/resources/lang/ro/home.php index 8d383a6e9f1..20689c50372 100644 --- a/resources/lang/ro/home.php +++ b/resources/lang/ro/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "să
    începem!", 'action' => 'Descarcă osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'utilizatori macOS', + 'mirror' => 'sursă alternativă', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "să
    începem!", + 'video-guide' => 'ghid video', 'help' => [ '_' => 'dacă ai o problemă la pornirea jocului sau la înregistrarea contului, :help_forum_link sau :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'pentru macOS', 'linux' => 'pentru Linux', ], - 'mirror' => 'sursă alternativă', - 'macos-fallback' => 'utilizatori macOS', 'steps' => [ 'register' => [ 'title' => 'creează un cont', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'ghid video', ], 'user' => [ diff --git a/resources/lang/ro/mail.php b/resources/lang/ro/mail.php index 3ab29e74929..9cbedd81023 100644 --- a/resources/lang/ro/mail.php +++ b/resources/lang/ro/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Mulțumită lor, ai acces la osu!direct și alte beneficii de suporter osu! pentru :duration.', 'features' => 'Mai multe detalii privind aceste beneficii pot fi găsite aici:', 'gifted' => 'Cineva tocmai ți-a dăruit statusul de suporter osu!', - 'gift_message' => '', + 'gift_message' => 'Persoana care a dăruit statusul de suporter v-a lăsat un mesaj:', 'subject' => 'Ți-a fost oferit statusul de suporter osu!', ], diff --git a/resources/lang/ro/page_title.php b/resources/lang/ro/page_title.php index 307a9a7008d..66e7c6386ff 100644 --- a/resources/lang/ro/page_title.php +++ b/resources/lang/ro/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'info jucător', + 'create' => '', 'disabled' => 'observație', ], 'wiki_controller' => [ diff --git a/resources/lang/ro/store.php b/resources/lang/ro/store.php index 855a26adc64..157206f6e0b 100644 --- a/resources/lang/ro/store.php +++ b/resources/lang/ro/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Dă clic aici pentru a-l edita.', 'declined' => 'Plata a fost anulată.', 'delayed_shipping' => 'În prezent suntem copleșiți de comenzi! Ești binevenit să-ți plasezi comanda, dar te rugăm să aștepți **o întârziere de 1-2 săptămâni suplimentară** în timp ce prindem din urmă comenzile existente.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ascunde toate statusurile de suporter osu! din această comandă din activitatea mea', 'old_cart' => 'Coșul tău pare a fi expirat și a fost reîncărcat, te rugăm să încerci din nou.', 'pay' => 'Plătește cu Paypal', 'title_compact' => 'finalizare plată', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Pentru că plata ta a fost făcută electronic, te rugăm să aștepți încă 10 zile pentru ca plata să se afișeze prin PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Statusul de suporter osu! din această comandă nu sunt afișate în activitățile tale recente.', 'title_compact' => 'factură fiscală', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mesaj: :message', ], ], @@ -127,10 +127,10 @@ 'supporter_tag' => [ 'gift' => 'dăruiește unui jucător', - 'gift_message' => '', + 'gift_message' => 'adaugă un mesaj opțional la cadoul tău! (până la :length caractere)', 'require_login' => [ - '_' => 'Trebuie să fii :link pentru a obține o insignă de suporter osu!', + '_' => 'Trebuie să fii :link pentru a obține statusul de suporter osu!', 'link_text' => 'conectat', ], ], diff --git a/resources/lang/ro/users.php b/resources/lang/ro/users.php index afb06715bdb..809b929bc4c 100644 --- a/resources/lang/ro/users.php +++ b/resources/lang/ro/users.php @@ -52,6 +52,22 @@ 'send_message' => 'trimite mesaj', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Uh-oh! Se pare că contul dumneavoastră a fost dezactivat.', 'warning' => "În cazul în care ați încălcat o regulă, vă rugăm să notați că în general este o perioadă de răcire de o lună în care vom considera orice cerere de amnesty. După această perioadă, simtete liber să ne contactezi dacă o găsești necesar. Vă rugăm să notați că după creearea unui cont nou ați avut unul dezactivat va rezulta într-un extesie în acestă răcire de o lună. Vă rugăm să notați și că pentru orice cont creat, încalci regulile în continuare. Vă recomandăm puternic să nu faceți asta!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Utilizator creat', ], 'verify' => [ diff --git a/resources/lang/ru/beatmaps.php b/resources/lang/ru/beatmaps.php index 36f33cfc3de..6f679b1085b 100644 --- a/resources/lang/ru/beatmaps.php +++ b/resources/lang/ru/beatmaps.php @@ -160,14 +160,14 @@ 'hype' => [ 'button' => 'Хайпануть карту!', 'button_done' => 'Уже хайпанута!', - 'confirm' => "Вы уверены? Это действие отберёт один из :n хайпов и не может быть отменено.", - 'explanation' => 'Хайпаните карту, чтобы сделать её доступной для номинирования и получения рейтинга!', + 'confirm' => "Вы уверены? Это необратимое действие; будет использован один из :n хайпов.", + 'explanation' => 'Хайпаните карту, чтобы сделать её доступной для номинирования и выхода в рейтинг!', 'explanation_guest' => 'Войдите в аккаунт, чтобы сделать карту доступной для номинирования!', - 'new_time' => "Вы получите другой хайп :new_time.", + 'new_time' => "Вы получите ещё один хайп :new_time.", 'remaining' => 'У вас осталось :remaining хайпа.', 'required_text' => 'Хайп: :current/:required', 'section_title' => 'Прогресс хайпа', - 'title' => 'Хайпаните', + 'title' => 'Хайп', ], 'feedback' => [ diff --git a/resources/lang/ru/beatmapset_events.php b/resources/lang/ru/beatmapset_events.php index 2d60dc3b37b..c765c12e737 100644 --- a/resources/lang/ru/beatmapset_events.php +++ b/resources/lang/ru/beatmapset_events.php @@ -30,7 +30,7 @@ 'nomination_reset' => 'Из-за новой проблемы в :discussion (:text) статус номинации был сброшен.', 'nomination_reset_received' => 'Номинация пользователя :user была сброшена :source_user (:text)', 'nomination_reset_received_profile' => 'Номинация была сброшена :user (:text)', - 'offset_edit' => 'Значение сдвига карты изменёно с :old на :new.', + 'offset_edit' => 'Значение оффсета изменено с :old на :new.', 'qualify' => 'Эта карта была номинирована достаточное количество раз для квалификации.', 'rank' => 'Карта получила категорию Рейтинговая.', 'remove_from_loved' => ':user удалил карту из категории Любимая. (:text)', @@ -78,7 +78,7 @@ 'nomination_reset' => 'Сброс номинации', 'nomination_reset_received' => 'Получен сброс номинации', 'nsfw_toggle' => 'Поставлена отметка 18+', - 'offset_edit' => 'Изменение сдвига трека относительно карты', + 'offset_edit' => 'Изменение оффсета', 'qualify' => 'Квалификация', 'rank' => 'Рейтинг', 'remove_from_loved' => 'Удаление из Любимых', diff --git a/resources/lang/ru/beatmapsets.php b/resources/lang/ru/beatmapsets.php index dfb29851199..7090ab98d4e 100644 --- a/resources/lang/ru/beatmapsets.php +++ b/resources/lang/ru/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Войдите, чтобы добавить эту карту в избранное', 'logged-out' => 'Вы должны войти для загрузки карты!', 'mapped_by' => 'автор :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Удалить из избранного', 'updated_timeago' => 'обновлена :timeago', @@ -92,7 +93,7 @@ ], 'favourites' => [ - 'limit_reached' => 'У вас слишком много избранных карт! Пожалуйста, удалите некоторые из них из избранных и попробуйте снова.', + 'limit_reached' => 'У вас слишком много избранных карт! Пожалуйста, удалите некоторые из них и попробуйте снова.', ], 'hype' => [ @@ -126,7 +127,7 @@ 'no_scores' => 'Данные всё ещё обрабатываются...', 'nominators' => 'Номинаторы', 'nsfw' => 'Откровенное содержание', - 'offset' => 'Сдвиг карты после ранка', + 'offset' => 'Онлайн-оффсет', 'points-of-failure' => 'Диаграмма провалов', 'source' => 'Источник', 'storyboard' => 'Эта карта содержит сториборд', @@ -198,7 +199,7 @@ 'bpm' => 'BPM', 'count_circles' => 'Количество нот', 'count_sliders' => 'Количество слайдеров', - 'offset' => 'Значение сдвига: :offset', + 'offset' => 'Значение оффсета: :offset', 'user-rating' => 'Оценки пользователей', 'rating-spread' => 'Распределение оценок', 'nominations' => 'Номинации', diff --git a/resources/lang/ru/contest.php b/resources/lang/ru/contest.php index 9b2d61543c9..a52a607a877 100644 --- a/resources/lang/ru/contest.php +++ b/resources/lang/ru/contest.php @@ -10,13 +10,13 @@ ], 'index' => [ - 'nav_title' => 'библиотека', + 'nav_title' => 'список', ], 'voting' => [ 'login_required' => 'Пожалуйста, войдите в аккаунт, чтобы проголосовать.', 'over' => 'Голосование окончено', - 'show_voted_only' => 'Показать проголосованные ', + 'show_voted_only' => 'Показать проголосованные', 'best_of' => [ 'none_played' => "Не похоже, что Вы играли в какие-либо из карт, что квалифицированы для этого конкурса!", diff --git a/resources/lang/ru/events.php b/resources/lang/ru/events.php index 9af82d72bd6..595fff8c148 100644 --- a/resources/lang/ru/events.php +++ b/resources/lang/ru/events.php @@ -8,7 +8,7 @@ 'beatmap_playcount' => ':beatmap была сыграна :count раз!', 'beatmapset_approve' => ':beatmapset от :user стала :approval!', 'beatmapset_delete' => ':beatmapset была удалена.', - 'beatmapset_revive' => ':beatmapset была пробуждена из вечного сна :user.', + 'beatmapset_revive' => ':user наконец-то возродил карту :beatmapset.', 'beatmapset_update' => ':user обновил карту ":beatmapset"', 'beatmapset_upload' => ':user опубликовал карту ":beatmapset"', 'empty' => "Этот пользователь не делал ничего заметного в последнее время!", diff --git a/resources/lang/ru/forum.php b/resources/lang/ru/forum.php index 5557e1285e6..19984ac152c 100644 --- a/resources/lang/ru/forum.php +++ b/resources/lang/ru/forum.php @@ -142,7 +142,7 @@ 'announcement' => 'закрепить тему и пометить как анонс', 'edit_topic' => 'к :title', 'fork' => 'от :topic', - 'pin' => 'закрепленная тема', + 'pin' => 'закреплённая тема', 'post_operation' => 'опубликовано :username', 'remove_tag' => 'убран ":tag" тег', 'source_forum_operation' => 'от :forum', diff --git a/resources/lang/ru/home.php b/resources/lang/ru/home.php index 80133493822..0faafac51b7 100644 --- a/resources/lang/ru/home.php +++ b/resources/lang/ru/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "давайте
    начнём!", 'action' => 'Скачать osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'для macOS', + 'mirror' => 'зеркало', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "давайте
    начнём!", + 'video-guide' => 'видеоинструкция', 'help' => [ '_' => 'если у вас появились проблемы с запуском игры или регистрацией аккаунта, :help_forum_link или :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'для macOS', 'linux' => 'для Linux', ], - 'mirror' => 'зеркало', - 'macos-fallback' => 'для macOS', 'steps' => [ 'register' => [ 'title' => 'создайте аккаунт', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'видеоинструкция', ], 'user' => [ diff --git a/resources/lang/ru/layout.php b/resources/lang/ru/layout.php index 6d5c948c6e4..b42047c1e39 100644 --- a/resources/lang/ru/layout.php +++ b/resources/lang/ru/layout.php @@ -76,7 +76,7 @@ 'help' => [ '_' => 'помощь', 'getAbuse' => 'сообщить о нарушении', - 'getFaq' => 'чаво', + 'getFaq' => 'faq', 'getRules' => 'правила', 'getSupport' => 'мне правда нужна помощь!', ], diff --git a/resources/lang/ru/mail.php b/resources/lang/ru/mail.php index c0b6963eb39..69dad5c7b18 100644 --- a/resources/lang/ru/mail.php +++ b/resources/lang/ru/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Благодаря ему у вас теперь есть доступ к osu!direct и другим преимуществам osu!supporter на :duration.', 'features' => 'Подробнее об этих функциях можно узнать здесь:', 'gifted' => 'Кто-то только что подарил вам тег osu!supporter!', - 'gift_message' => '', + 'gift_message' => 'Пользователь, подаривший Вам этот тег, оставил сообщение:', 'subject' => 'Вам подарили тег osu!supporter!', ], diff --git a/resources/lang/ru/oauth.php b/resources/lang/ru/oauth.php index f67e514635c..2610fb9baba 100644 --- a/resources/lang/ru/oauth.php +++ b/resources/lang/ru/oauth.php @@ -55,7 +55,7 @@ 'revoked' => [ 'false' => 'Удалить', - 'true' => 'Удалёно', + 'true' => 'Удалено', ], ], ]; diff --git a/resources/lang/ru/page_title.php b/resources/lang/ru/page_title.php index 4dede09acf2..7d5574222f3 100644 --- a/resources/lang/ru/page_title.php +++ b/resources/lang/ru/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'информация об игроке', + 'create' => '', 'disabled' => 'обратите внимание', ], 'wiki_controller' => [ diff --git a/resources/lang/ru/store.php b/resources/lang/ru/store.php index 161b1cefa9b..c2f7901b949 100644 --- a/resources/lang/ru/store.php +++ b/resources/lang/ru/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Нажмите здесь, чтобы изменить это.', 'declined' => 'Ваш платеж был отменен.', 'delayed_shipping' => 'В настоящее время у нас много заказов! Вы можете заказать товар, но пожалуйста, помните, что его обработка может задержаться на 1–2 недели, пока мы разбираемся с существующими заказами.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Скрыть все сообщения о тегах osu!supporter из секции активности в моём профиле после покупки', 'old_cart' => 'Ваша корзина, кажется, устарела и была перезагружена, пожалуйста попробуйте еще раз.', 'pay' => 'Оплатить с PayPal', 'title_compact' => 'проверка', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Поскольку оплата была через eCheck, ожидание подтверждения оплаты через Paypal может занят до 10 дней!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'сообщения о тегах osu!supporter после покупки не будут отображены в вашем профиле.', 'title_compact' => 'чек', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Сообщение: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'подарок для игрока', - 'gift_message' => '', + 'gift_message' => 'добавьте сообщение к вашему подарку! (до :length символов)', 'require_login' => [ '_' => 'Вы должны :link для покупки osu!supporter!', diff --git a/resources/lang/ru/users.php b/resources/lang/ru/users.php index 4b5b6097833..824037cf2b6 100644 --- a/resources/lang/ru/users.php +++ b/resources/lang/ru/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Отправить сообщение', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'О нет! Похоже, что Ваш аккаунт был отключен.', 'warning' => "В случае, если Вы нарушили правила, то как минимум месяц ваши попытки обжаловать блокировку рассматриваться не будут. По истечении этого месяца Вы сможете связаться с нами, если посчитаете необходимым. Учтите, что создание новых аккаунтов во обход блокировки лишь продлит Ваш период блокировки. К тому же, создание мульти-аккаунтов запрещено правилами, поэтому настоятельно советуем Вам этого не делать!", @@ -134,14 +150,14 @@ 'multiple_accounts' => 'Использование нескольких аккаунтов', 'insults' => 'Оскорбление меня / других', 'spam' => 'Спам', - 'unwanted_content' => 'Ссылки с неприемлемым содержимым', + 'unwanted_content' => 'Ссылки на неприемлемое содержимое', 'nonsense' => 'Вздор', 'other' => 'Другая (напишите ниже)', ], ], 'restricted_banner' => [ - 'title' => 'Права вашего аккаунта ограничены!', - 'message' => 'Пока права вашего аккаунта ограничены, вы не сможете взаимодействовать с другими игроками и ваши результаты будут видны только вам. Обычно это результат автоматизированного процесса и, как правило, ограничение снимается в течении суток. Если вы хотите обжаловать ваше ограничение, пожалуйста свяжитесь с поддержкой.', + 'title' => 'Ваш аккаунт ограничен!', + 'message' => 'Пока ваш аккаунт ограничен, вы не сможете взаимодействовать с другими игроками и ваши результаты будут видны только вам. Обычно это результат автоматизированного процесса и, как правило, ограничение снимается в течении суток. Если вы хотите обжаловать ваше ограничение, пожалуйста свяжитесь с поддержкой.', ], 'show' => [ 'age' => ':age лет', @@ -187,7 +203,7 @@ ], 'default_playmode' => [ - 'is_default_tooltip' => 'режим игры по умолчанию', + 'is_default_tooltip' => 'основной режим игры', 'set' => 'установить :mode как режим игры по умолчанию', ], ], @@ -206,19 +222,19 @@ 'title' => 'Карты', 'favourite' => [ - 'title' => 'Избранные карты', + 'title' => 'Избранные', ], 'graveyard' => [ - 'title' => 'Заброшенные карты', + 'title' => 'Заброшенные', ], 'guest' => [ - 'title' => 'Карты с гостевым участием', + 'title' => 'С гостевым участием', ], 'loved' => [ - 'title' => 'Любимые карты', + 'title' => 'Любимые', ], 'nominated' => [ - 'title' => 'Номинированные рейтинговые карты', + 'title' => 'Номинированные рейтинговые', ], 'pending' => [ 'title' => 'На рассмотрении', @@ -333,7 +349,7 @@ 'not_ranked' => 'Только рейтинговые карты приносят pp', 'pp_weight' => 'засчитано: :percentage pp', 'view_details' => 'Подробнее', - 'title' => 'Рейтинги', + 'title' => 'Рекорды', 'best' => [ 'title' => 'Лучшие рекорды', @@ -433,9 +449,9 @@ 'total_hits' => 'Всего попаданий', 'total_score' => 'Всего очков', // modding stats - 'graveyard_beatmapset_count' => 'Заброшенные карты', + 'graveyard_beatmapset_count' => 'Заброшенные', 'loved_beatmapset_count' => 'Любимые карты', - 'pending_beatmapset_count' => 'Карты на рассмотрении', + 'pending_beatmapset_count' => 'На рассмотрении', 'ranked_beatmapset_count' => 'Рейтинговые карты', ], ], @@ -451,6 +467,8 @@ 'offline' => 'Не в сети', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Пользователь создан', ], 'verify' => [ diff --git a/resources/lang/si-LK/beatmapsets.php b/resources/lang/si-LK/beatmapsets.php index 44c58adf3d6..abb94eab2a2 100644 --- a/resources/lang/si-LK/beatmapsets.php +++ b/resources/lang/si-LK/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => '', 'mapped_by' => '', + 'mapped_by_guest' => '', 'unfavourite' => '', 'updated_timeago' => '', diff --git a/resources/lang/si-LK/home.php b/resources/lang/si-LK/home.php index 18b41e731d1..12ba266d8c1 100644 --- a/resources/lang/si-LK/home.php +++ b/resources/lang/si-LK/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "", 'action' => '', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => '', + 'mirror' => '', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "", + 'video-guide' => '', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => '', 'linux' => '', ], - 'mirror' => '', - 'macos-fallback' => '', 'steps' => [ 'register' => [ 'title' => '', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '', ], 'user' => [ diff --git a/resources/lang/si-LK/page_title.php b/resources/lang/si-LK/page_title.php index 88375e7c77d..eb16a2f3172 100644 --- a/resources/lang/si-LK/page_title.php +++ b/resources/lang/si-LK/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/si-LK/users.php b/resources/lang/si-LK/users.php index 036547834f6..172d0735c4f 100644 --- a/resources/lang/si-LK/users.php +++ b/resources/lang/si-LK/users.php @@ -52,6 +52,22 @@ 'send_message' => '', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => '', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '', ], 'verify' => [ diff --git a/resources/lang/sk/beatmapsets.php b/resources/lang/sk/beatmapsets.php index dc4e34ac6eb..8f97a8727c7 100644 --- a/resources/lang/sk/beatmapsets.php +++ b/resources/lang/sk/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => 'Pre sťahovanie beatmap sa najskôr musíš prihlásiť!', 'mapped_by' => 'beatmapu vytvoril :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Odobrať z mojich obľúbených', 'updated_timeago' => 'naposledy aktualizované :timeago', diff --git a/resources/lang/sk/home.php b/resources/lang/sk/home.php index 5872ec424c8..c4522db81f4 100644 --- a/resources/lang/sk/home.php +++ b/resources/lang/sk/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "poďme začať!", 'action' => 'Sťahovať!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS užívateľ', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "poďme začať!", + 'video-guide' => 'video návod', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => 'pre macOS', 'linux' => 'pre Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS užívateľ', 'steps' => [ 'register' => [ 'title' => 'vytvorte si účet', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video návod', ], 'user' => [ diff --git a/resources/lang/sk/page_title.php b/resources/lang/sk/page_title.php index 2f9d84cf51b..00c1c8beddc 100644 --- a/resources/lang/sk/page_title.php +++ b/resources/lang/sk/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/sk/users.php b/resources/lang/sk/users.php index 8bc2a0d831d..3e93c8171ca 100644 --- a/resources/lang/sk/users.php +++ b/resources/lang/sk/users.php @@ -52,6 +52,22 @@ 'send_message' => 'poslať správu', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Vytvorený používateľom', ], 'verify' => [ diff --git a/resources/lang/sl-SI/beatmapsets.php b/resources/lang/sl-SI/beatmapsets.php index c85f545f03d..dcdacde3832 100644 --- a/resources/lang/sl-SI/beatmapsets.php +++ b/resources/lang/sl-SI/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Vpiši se za dodajanje beatmape med priljubljene', 'logged-out' => 'Preden lahko preneseš beatmapo moraš biti vpisan!', 'mapped_by' => 'mappal :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Odstrani beatmapo iz priljubljenih', 'updated_timeago' => 'zadnje posodobljeno :timeago', diff --git a/resources/lang/sl-SI/home.php b/resources/lang/sl-SI/home.php index 429e7b61387..b0d37c9503f 100644 --- a/resources/lang/sl-SI/home.php +++ b/resources/lang/sl-SI/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "pa
    začnimo!", 'action' => 'Prenesi osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS uporabniki', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "pa
    začnimo!", + 'video-guide' => 'video vodič', 'help' => [ '_' => 'če naletiš na težavo pri zagonu igre ali registraciji računa, :help_forum_link ali :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'za macOS', 'linux' => 'za Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS uporabniki', 'steps' => [ 'register' => [ 'title' => 'pridobi račun', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video vodič', ], 'user' => [ diff --git a/resources/lang/sl-SI/mail.php b/resources/lang/sl-SI/mail.php index 0240546354b..6bdf94dca02 100644 --- a/resources/lang/sl-SI/mail.php +++ b/resources/lang/sl-SI/mail.php @@ -67,7 +67,7 @@ 'duration' => 'V zahvalo njemu imaš sedaj dostop do osu!direct in drugih osu!supporter ugodnosti za :duration.', 'features' => 'Več informacij o teh funkcijah lahko najdeš tukaj:', 'gifted' => 'Nekdo ti je pravkar podaril osu!supporter značko!', - 'gift_message' => '', + 'gift_message' => 'Uporabnik, ki ti je podaril oznako, je pustil še sporočilo:', 'subject' => 'Obdarjen si bil z osu!supporter značko!', ], diff --git a/resources/lang/sl-SI/page_title.php b/resources/lang/sl-SI/page_title.php index 1a031efc652..08a5b22e1b0 100644 --- a/resources/lang/sl-SI/page_title.php +++ b/resources/lang/sl-SI/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'informacije o igralcu', + 'create' => '', 'disabled' => 'obvestilo', ], 'wiki_controller' => [ diff --git a/resources/lang/sl-SI/store.php b/resources/lang/sl-SI/store.php index c093c9b0318..2229d0affdc 100644 --- a/resources/lang/sl-SI/store.php +++ b/resources/lang/sl-SI/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Klikni tukaj za urejanje.', 'declined' => 'Plačilo je bilo preklicano.', 'delayed_shipping' => 'Trenutno imamo preveč naročil! Naročilo je dobrodošlo, ampak pričakuj **dodaten teden ali dva zamika**, da se lahko ujamemo s preostalimi naročili.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Skrij vse osu!supporter oznake v tem naročilu iz moje dejavnosti', 'old_cart' => 'Tvoja nakupovalna košarica je zastarela in je bila osvežena, prosimo poskusi znova.', 'pay' => 'Plačaj s Paypal-om', 'title_compact' => 'plačilo', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Ker je bilo tvoje plačilo narejeno z eCheck-om, prosimo počakaj vsaj do 10 dodatnih dni, da se plačilo poravna preko PayPal-a!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter oznake v tem naročilu ne bodo prikazane v tvojih nedavnih dejavnostih.', 'title_compact' => 'račun', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Sporočilo: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'podari igralcu', - 'gift_message' => '', + 'gift_message' => 'dodaj izbirno sporočilo k tvojemu darilu! (vse do :length znakov)', 'require_login' => [ '_' => 'Za pridobitev osu!supporter značke moraš biti :link!', diff --git a/resources/lang/sl-SI/users.php b/resources/lang/sl-SI/users.php index ff7c36890f4..2ffb087e83f 100644 --- a/resources/lang/sl-SI/users.php +++ b/resources/lang/sl-SI/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Pošlji sporočilo', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Oh ne! Tvoj račun je bil onemogočen.', 'warning' => "V primeru, da si prekršil pravilo, upoštevaj, da na splošno obstaja enomesečno obdobje mirovanja, v tem času ne bomo upoštevali nobenih pomilostilnih zahtev. Po tem obdobju nas lahko kontaktiraš, če se ti zdi pomembno. Upoštevaj, da ustvarjanje novih računov kot izogib onemogočenemu računu, bo pomenilo podaljšanje tega enomesečnega mirovanja. Upoštevaj tudi, da z vsakim novim računom, nadaljno kršiš pravila. Zelo ti priporočamo, da ne greš po tej poti!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Uporabnik ustvarjen', ], 'verify' => [ diff --git a/resources/lang/sr-SP/beatmapsets.php b/resources/lang/sr-SP/beatmapsets.php index 68ea15af861..145f64f19d9 100644 --- a/resources/lang/sr-SP/beatmapsets.php +++ b/resources/lang/sr-SP/beatmapsets.php @@ -71,6 +71,7 @@ 'favourite_login' => 'Пријави се како би означили мапу као омиљену', 'logged-out' => 'Мораш се пријавити пре преузимања било које мапе!', 'mapped_by' => 'маповано од стране :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Уклони мапу са ознаке омиљено', 'updated_timeago' => 'последњи пут ажурирано :timeago', diff --git a/resources/lang/sr-SP/forum.php b/resources/lang/sr-SP/forum.php index fa63c394858..8db4c072d20 100644 --- a/resources/lang/sr-SP/forum.php +++ b/resources/lang/sr-SP/forum.php @@ -108,23 +108,23 @@ 'default' => 'Ова тема је била неактивна неко време. Објављујте овде само ако имате конкретан разлог за то.', 'new_topic' => [ - '_' => "", + '_' => "Ова тема је била неактивна неко време. Ако немате конкретан разлог да објавите овде, :create уместо тога.", 'create' => 'направиte нову тему', ], ], 'placeholder' => [ - 'body' => '', + 'body' => 'Упишите садржај поста овде', 'title' => 'Кликни овде да поставиш наслов', ], ], 'jump' => [ - 'enter' => '', - 'first' => '', - 'last' => '', - 'next' => '', - 'previous' => '', + 'enter' => 'кликните да унесете одређени број поста', + 'first' => 'иди на први пост', + 'last' => 'иди на последњи пост', + 'next' => 'прескочи следећих 10 постова', + 'previous' => 'врати се 10 постова уназад', ], 'logs' => [ @@ -200,7 +200,7 @@ 'topic_buttons' => [ 'remove' => [ 'confirmation' => '', - 'title' => '', + 'title' => 'Откажи претплату', ], ], ], @@ -246,7 +246,7 @@ ], 'index' => [ - 'feature_votes' => '', + 'feature_votes' => 'приоритет по звездицама', 'replies' => 'одговори', 'views' => 'приказа', ], diff --git a/resources/lang/sr-SP/home.php b/resources/lang/sr-SP/home.php index 646c98ea233..d15c1346c93 100644 --- a/resources/lang/sr-SP/home.php +++ b/resources/lang/sr-SP/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "Почнимо!", 'action' => 'Преузмите osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS корисници', + 'mirror' => 'алтернативни линк', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "Почнимо!", + 'video-guide' => 'видео водич', 'help' => [ '_' => 'ако имате проблем са отварањем игрице или регистрације налога, :help_forum_link или :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'за macOS', 'linux' => 'за Linux', ], - 'mirror' => 'алтернативни линк', - 'macos-fallback' => 'macOS корисници', 'steps' => [ 'register' => [ 'title' => 'направите налог', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'видео водич', ], 'user' => [ diff --git a/resources/lang/sr-SP/mail.php b/resources/lang/sr-SP/mail.php index 56633ede1f8..0f2fef5d63c 100644 --- a/resources/lang/sr-SP/mail.php +++ b/resources/lang/sr-SP/mail.php @@ -42,7 +42,7 @@ 'forum_new_reply' => [ 'new' => '', 'subject' => '', - 'unwatch' => '', + 'unwatch' => 'Ако више не желите да гледате ову тему, можете или да кликнете на везу „Откажи претплату на тему“ која се налази на дну теме изнад или на страници за управљање претплатама на теме:', 'visit' => 'Пређите директно на најновији одговор користећи следећу везу:', ], @@ -75,15 +75,15 @@ 'user_email_updated' => [ 'changed_to' => '', 'check' => '', - 'sent' => '', + 'sent' => 'Из безбедносних разлога, ова е-порука је послата на вашу нову и стару адресу е-поште.', 'subject' => '', ], 'user_force_reactivation' => [ 'main' => '', - 'perform_reset' => '', + 'perform_reset' => 'Можете извршити ресетовање са :url', 'reason' => 'Разлог:', - 'subject' => '', + 'subject' => 'потребна је поновна активација osu! налога', ], 'user_notification_digest' => [ @@ -93,7 +93,7 @@ ], 'user_password_updated' => [ - 'confirmation' => '', + 'confirmation' => 'Ово је само потврда да је osu! лозинка промењена.', 'subject' => 'osu! потврда промене лозинке', ], diff --git a/resources/lang/sr-SP/model_validation.php b/resources/lang/sr-SP/model_validation.php index 61c39dc4423..8702093e7fe 100644 --- a/resources/lang/sr-SP/model_validation.php +++ b/resources/lang/sr-SP/model_validation.php @@ -91,32 +91,32 @@ 'topic_poll' => [ 'duplicate_options' => 'Опција дуплирања није дозвољена.', - 'grace_period_expired' => '', - 'hiding_results_forever' => '', - 'invalid_max_options' => '', - 'minimum_one_selection' => '', - 'minimum_two_options' => '', - 'too_many_options' => '', + 'grace_period_expired' => 'Није могуће уређивати анкету након више од :limit сати.', + 'hiding_results_forever' => 'Не може сакрити анкете резултата која се никада не завршава.', + 'invalid_max_options' => 'Опција по кориснику не сме бити већа од броја доступних опција.', + 'minimum_one_selection' => 'Потребна је најмање једна опција по кориснику.', + 'minimum_two_options' => 'Потребне су најмање две опције.', + 'too_many_options' => 'Прекорачен је максимални број дозвољених опција.', 'attributes' => [ - 'title' => '', + 'title' => 'Наслов анкете', ], ], 'topic_vote' => [ - 'required' => '', - 'too_many' => '', + 'required' => 'Изаберите опцију приликом гласања.', + 'too_many' => 'Изабрано је више опција него што је дозвољено.', ], ], 'oauth' => [ 'client' => [ - 'too_many' => '', + 'too_many' => 'Премашен је максимални број дозвољених OAuth апликација.', 'url' => 'Молимо да унесете важећи URL.', 'attributes' => [ - 'name' => '', - 'redirect' => '', + 'name' => 'Име Апликације', + 'redirect' => 'Callback URL апликације', ], ], ], diff --git a/resources/lang/sr-SP/page_title.php b/resources/lang/sr-SP/page_title.php index 4d24917287b..6fa6a09d882 100644 --- a/resources/lang/sr-SP/page_title.php +++ b/resources/lang/sr-SP/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'информације о играчу', + 'create' => '', 'disabled' => 'напомена', ], 'wiki_controller' => [ diff --git a/resources/lang/sr-SP/store.php b/resources/lang/sr-SP/store.php index 8a94b4b84c5..0aa35acbd27 100644 --- a/resources/lang/sr-SP/store.php +++ b/resources/lang/sr-SP/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Кликните овде да би сте изменили.', 'declined' => 'Плаћање је отказано.', 'delayed_shipping' => 'Тренутно имамо превише наруџбина! И даље можете поручити, али молимо Вас да очекујете **закашњење од 1-2 недеље** док не прођемо кроз све наруџбине.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Сакриј све ознаке osu!supporter у овом редоследу из мојих активности', 'old_cart' => 'Изгледа да су ваша колица застарела и поново су учитана, молимо Вас да пробате поново.', 'pay' => 'Платите преко Paypal-а', 'title_compact' => 'завршите куповину', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Зато што је Ваша куповина плаћена eCheck-ом, молимо Вас да дозволите до 10 додатних дана док се куповина не потврди преко PayPal-а!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'osu!supporter ознаке овим редоследом се не приказују у вашим недавним активностима.', 'title_compact' => 'рачун', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Порука: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'поклоните играчу', - 'gift_message' => '', + 'gift_message' => 'додајте опционалну поруку свом поклону! (до :length знакова)', 'require_login' => [ '_' => 'Морате бити :link да би сте добили osu!supporter таг!', diff --git a/resources/lang/sr-SP/users.php b/resources/lang/sr-SP/users.php index 242d40c80fc..d38b8611aeb 100644 --- a/resources/lang/sr-SP/users.php +++ b/resources/lang/sr-SP/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Пошаљите поруку', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Изгледа да је ваш налог угашен.', 'warning' => "У случају да сте прекршили неко правила, молимо Вас да узмете у обзир да постоји период од месец дана између захтева за амнестију који мора проћи да би смо узели захтев у обзир. После овог периода, слободно нас контактирајте ако верујете да је то неопходно. Такође узмите у обзир да креирање нових налога након што Вам је први налог угашен ће продужити период након кога можете послати захтев за амнестију. За сваки налог који направите, додатно кршите правила<0>. Предлажемо да не радите ово!", @@ -219,7 +235,7 @@ 'title' => 'Loved Мапе', ], 'nominated' => [ - 'title' => '', + 'title' => 'Номиноване рангиране мапе', ], 'pending' => [ 'title' => 'Нерешене Мапе', @@ -453,6 +469,8 @@ 'offline' => 'Офлајн', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Корисник је креиран', ], 'verify' => [ diff --git a/resources/lang/sv/beatmapsets.php b/resources/lang/sv/beatmapsets.php index de2bad39bc6..bae62318766 100644 --- a/resources/lang/sv/beatmapsets.php +++ b/resources/lang/sv/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Logga in för att favoritmarkera denna beatmap', 'logged-out' => 'Du behöver logga in innan du laddar ner beatmaps!', 'mapped_by' => 'skapad av :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Ta bort favoritmarkering på detta beatmapset', 'updated_timeago' => 'senast ändrad :timeago', diff --git a/resources/lang/sv/home.php b/resources/lang/sv/home.php index 3c6c9f2d671..06653b3f356 100644 --- a/resources/lang/sv/home.php +++ b/resources/lang/sv/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "låt oss
    få dig igång!", 'action' => 'Ladda ner osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS-användare', + 'mirror' => 'mirror', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "låt oss
    få dig igång!", + 'video-guide' => 'videoguide', 'help' => [ '_' => 'om du har problem med att starta spelet eller registrera ett konto, :help_forum_link eller :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'för macOS', 'linux' => 'för Linux', ], - 'mirror' => 'mirror', - 'macos-fallback' => 'macOS-användare', 'steps' => [ 'register' => [ 'title' => 'skaffa ett konto', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'videoguide', ], 'user' => [ diff --git a/resources/lang/sv/page_title.php b/resources/lang/sv/page_title.php index 1f92a9b1413..66e6510fbf4 100644 --- a/resources/lang/sv/page_title.php +++ b/resources/lang/sv/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'spelarinformation', + 'create' => '', 'disabled' => 'notera', ], 'wiki_controller' => [ diff --git a/resources/lang/sv/store.php b/resources/lang/sv/store.php index 9483da27436..22b2e4c0544 100644 --- a/resources/lang/sv/store.php +++ b/resources/lang/sv/store.php @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Meddelande: :message', ], ], diff --git a/resources/lang/sv/users.php b/resources/lang/sv/users.php index b1d44f70f5d..2f0b4e5b9e5 100644 --- a/resources/lang/sv/users.php +++ b/resources/lang/sv/users.php @@ -52,6 +52,22 @@ 'send_message' => 'skicka meddelande', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Hoppsan! Det verkar som att ditt konto har inaktiverats.', 'warning' => "Om du har brutit mot en regel, vänligen notera att det generellt finns en cool-down-period á en månad under vilken vi inte kommer att överväga några amnestiförfrågningar. Efter denna period är du välkommen att kontakta oss om du anser det nödvändigt. Vänligen notera att skapandet av nya konton efter att du haft ett inaktiverat kommer att resultera i en förlängning av denna en månads cool-down. Vänligen notera även att för varje konto du skapar, bryter du mot reglerna ytterligare. Vi rekommenderar starkt att du inte tar denna vägen!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Användare skapad', ], 'verify' => [ diff --git a/resources/lang/tg-TJ/beatmapsets.php b/resources/lang/tg-TJ/beatmapsets.php index 44c58adf3d6..abb94eab2a2 100644 --- a/resources/lang/tg-TJ/beatmapsets.php +++ b/resources/lang/tg-TJ/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '', 'logged-out' => '', 'mapped_by' => '', + 'mapped_by_guest' => '', 'unfavourite' => '', 'updated_timeago' => '', diff --git a/resources/lang/tg-TJ/home.php b/resources/lang/tg-TJ/home.php index 18b41e731d1..12ba266d8c1 100644 --- a/resources/lang/tg-TJ/home.php +++ b/resources/lang/tg-TJ/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "", 'action' => '', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => '', + 'mirror' => '', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "", + 'video-guide' => '', 'help' => [ '_' => '', @@ -86,8 +99,6 @@ 'macos' => '', 'linux' => '', ], - 'mirror' => '', - 'macos-fallback' => '', 'steps' => [ 'register' => [ 'title' => '', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '', ], 'user' => [ diff --git a/resources/lang/tg-TJ/page_title.php b/resources/lang/tg-TJ/page_title.php index 88375e7c77d..eb16a2f3172 100644 --- a/resources/lang/tg-TJ/page_title.php +++ b/resources/lang/tg-TJ/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '', + 'create' => '', 'disabled' => '', ], 'wiki_controller' => [ diff --git a/resources/lang/tg-TJ/users.php b/resources/lang/tg-TJ/users.php index 036547834f6..172d0735c4f 100644 --- a/resources/lang/tg-TJ/users.php +++ b/resources/lang/tg-TJ/users.php @@ -52,6 +52,22 @@ 'send_message' => '', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '', 'warning' => "", @@ -451,6 +467,8 @@ 'offline' => '', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '', ], 'verify' => [ diff --git a/resources/lang/th/beatmapsets.php b/resources/lang/th/beatmapsets.php index 173d7508a15..fcaab12e628 100644 --- a/resources/lang/th/beatmapsets.php +++ b/resources/lang/th/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'ลงชื่อบีทแมพนี้เป็นรายการโปรด', 'logged-out' => 'คุณต้องเข้าสู่ระบบก่อนที่จะดาวน์โหลดบีทแมพ', 'mapped_by' => 'แมพโดย :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'เลิก Favourite beatmapset นี้', 'updated_timeago' => 'อัปเดตล่าสุดเมื่อ :timeago', diff --git a/resources/lang/th/home.php b/resources/lang/th/home.php index 3770caa67bb..a86e4b6aa99 100644 --- a/resources/lang/th/home.php +++ b/resources/lang/th/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "เรามา
    เริ่มกันเถอะ", 'action' => 'ดาวน์โหลด osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'ผู้ใช้ macOS', + 'mirror' => 'เซิร์ฟเวอร์อื่น', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "เรามา
    เริ่มกันเถอะ", + 'video-guide' => 'ไกด์วิดิโอ', 'help' => [ '_' => 'ถ้ามีปัญหาในการเข้าเกมหรือสมัครบัญชีสามารถหาความช่วยเหลือได้ที่ :help_forum_link หรือ :support_button', @@ -86,8 +99,6 @@ 'macos' => 'สำหรับ macOS', 'linux' => 'สำหรับ Linux', ], - 'mirror' => 'เซิร์ฟเวอร์อื่น', - 'macos-fallback' => 'ผู้ใช้ macOS', 'steps' => [ 'register' => [ 'title' => 'สร้างบัญชี', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'ไกด์วิดิโอ', ], 'user' => [ diff --git a/resources/lang/th/page_title.php b/resources/lang/th/page_title.php index edc3046305a..fc3a83a9c22 100644 --- a/resources/lang/th/page_title.php +++ b/resources/lang/th/page_title.php @@ -106,6 +106,7 @@ ], 'users_controller' => [ '_' => 'ข้อมูลผู้เล่น', + 'create' => '', 'disabled' => 'การแจ้งเตือน', ], 'wiki_controller' => [ diff --git a/resources/lang/th/users.php b/resources/lang/th/users.php index 9454e9c522e..13fb54be24d 100644 --- a/resources/lang/th/users.php +++ b/resources/lang/th/users.php @@ -52,6 +52,22 @@ 'send_message' => 'ส่งข้อความ', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'โอ๊ะโอ ดูเหมือนว่าบัญชีของคุณถูกระงับ', 'warning' => "ถ้าคุณทำผิดกฎ เราจะบอกว่ามีระยะเวลาเว้นช่วง (Cool-down) หนึ่งเดือน ซึ่งระหว่างนี้เราจะไม่รับคำขอยกโทษ และหลังจากผ่านไปแล้วหนึ่งเดือน คุณค่อยติดต่อเรากลับมา (ถ้าจำเป็น) อีกอย่างคือถ้าสร้างบัญชีเพิ่มอีก (หลังจากอันเก่าโดนระงับ) ก็จะโดนอีกหนึ่งเดือน และจะบอกว่ายิ่งสร้างบัญชีเพิ่ม ยิ่งทำผิดกฎมากขึ้น ขอร้องล่ะนะ", @@ -452,6 +468,8 @@ 'offline' => 'ออฟไลน์', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'ผู้ใช้ถูกสร้างขึ้น', ], 'verify' => [ diff --git a/resources/lang/tr/artist.php b/resources/lang/tr/artist.php index 196b4edcfa7..34fefe33738 100644 --- a/resources/lang/tr/artist.php +++ b/resources/lang/tr/artist.php @@ -50,7 +50,7 @@ 'album' => 'Albüm', 'artist' => 'Sanatçı', 'bpm_gte' => 'Minimum BPM', - 'bpm_lte' => 'Maximum BPM', + 'bpm_lte' => 'Maksimum BPM', 'empty' => 'Arama kriterine uyan parça bulunamadı.', 'genre' => 'Tür', 'genre_all' => 'Tümü', diff --git a/resources/lang/tr/beatmaps.php b/resources/lang/tr/beatmaps.php index f10f96d4522..70acfcd81b0 100644 --- a/resources/lang/tr/beatmaps.php +++ b/resources/lang/tr/beatmaps.php @@ -257,7 +257,7 @@ 'featured_artists' => 'Featured artist\'ler', 'follows' => 'Abone olunan mapperlar', 'recommended' => 'Önerilen zorluk seviyesi', - 'spotlights' => 'Öne çıkan beatmap\'ler', + 'spotlights' => 'Öne çıkan beatmapler', ], 'mode' => [ 'all' => 'Hepsi', diff --git a/resources/lang/tr/beatmapsets.php b/resources/lang/tr/beatmapsets.php index 3d6ba210231..78edbd64837 100644 --- a/resources/lang/tr/beatmapsets.php +++ b/resources/lang/tr/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Beatmapi favorilere eklemek için giriş yap', 'logged-out' => 'Herhangi bir beatmapi indirmeden önce giriş yapmalısınız!', 'mapped_by' => ':mapper tarafından yapıldı', + 'mapped_by_guest' => '', 'unfavourite' => 'Beatmap setini favorilerden çıkar', 'updated_timeago' => 'son güncelleme: :timeago', diff --git a/resources/lang/tr/contest.php b/resources/lang/tr/contest.php index 4286097dc7c..f26307a570d 100644 --- a/resources/lang/tr/contest.php +++ b/resources/lang/tr/contest.php @@ -50,7 +50,7 @@ 'beatmap' => 'Bu yarışma için sadece .osu dosyaları kabul edilir.', 'music' => 'Bu yarışma için sadece .mp3 dosyaları kabul edilir.', ], - 'wrong_dimensions' => '', + 'wrong_dimensions' => 'Bu yarışma için başvurular şu şekilde olmalıdır: :widthx:height', 'too_big' => 'Bu yarışma için :limit girdi gönderilebilir.', ], 'beatmaps' => [ diff --git a/resources/lang/tr/forum.php b/resources/lang/tr/forum.php index 43e18b104ff..1f529bc0282 100644 --- a/resources/lang/tr/forum.php +++ b/resources/lang/tr/forum.php @@ -155,11 +155,11 @@ 'delete_post' => 'Silinen paylaşım', 'delete_topic' => 'Silinen konu', 'edit_topic' => 'Konu başlığı değiştirildi', - 'edit_poll' => 'Konu anketi değiştirildi', + 'edit_poll' => 'Konu anketi düzenlendi', 'fork' => 'Kopyalanan konu', 'issue_tag' => 'Verilen etiket', 'lock' => 'Kilitli konu', - 'merge' => 'Bu konudaki paylaşımlar birleştirildi', + 'merge' => 'Gönderiler bu konuda birleştirildi', 'move' => 'Taşınan konu', 'pin' => 'Sabitlenen konu', 'post_edited' => 'Düzenlenmiş gönderi', diff --git a/resources/lang/tr/home.php b/resources/lang/tr/home.php index 59c7256d1d6..eb2344aa45d 100644 --- a/resources/lang/tr/home.php +++ b/resources/lang/tr/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "haydi seni
    oyuna hazırlayalım!", 'action' => 'osu!\'yu indir', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS kullanıcıları', + 'mirror' => 'alternatif', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "haydi seni
    oyuna hazırlayalım!", + 'video-guide' => 'video kılavuzu', 'help' => [ '_' => 'oyunu çalıştırırken ya da hesap oluştururken herhangi bir sorun yaşıyorsanız, :help_forum_link veya :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'macOS için', 'linux' => 'Linux için', ], - 'mirror' => 'alternatif', - 'macos-fallback' => 'macOS kullanıcıları', 'steps' => [ 'register' => [ 'title' => 'bir hesap oluştur', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'video kılavuzu', ], 'user' => [ diff --git a/resources/lang/tr/mail.php b/resources/lang/tr/mail.php index b74b9ae0bb0..cf0931b59ef 100644 --- a/resources/lang/tr/mail.php +++ b/resources/lang/tr/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Onun sayesinde, sonraki :duration boyunca osu!direct\'e ve diğer osu!supporter ayrıcalıklarına sahip olacaksın.', 'features' => 'Bu avantajlar hakkında daha fazla detaylı bilgiye buradan ulaşabilirsiniz:', 'gifted' => 'Birisi size az önce bir osu!supporter etiketi hediye etti!', - 'gift_message' => '', + 'gift_message' => 'Bu etiketi hediye eden kişi size bir mesaj bıraktı:', 'subject' => 'Size bir osu! Destekçisi etiketi verildi!', ], diff --git a/resources/lang/tr/multiplayer.php b/resources/lang/tr/multiplayer.php index b2d54cc87a0..7708ee7b50d 100644 --- a/resources/lang/tr/multiplayer.php +++ b/resources/lang/tr/multiplayer.php @@ -7,7 +7,7 @@ 'empty' => [ '_' => 'Henüz bir osu!(lazer) :type_group oynamamış!', 'playlists' => 'oynama listesi', - 'realtime' => 'çok oyunculu oyunu', + 'realtime' => 'çok oyunculu', ], 'room' => [ @@ -18,7 +18,7 @@ 'time_left' => 'kalan süre: :time', 'errors' => [ - 'duration_too_long' => 'Süresi aşırı uzun.', + 'duration_too_long' => 'Süre aşırı uzun.', ], 'status' => [ diff --git a/resources/lang/tr/notifications.php b/resources/lang/tr/notifications.php index 766ff7a1bf9..55a22ff5e0a 100644 --- a/resources/lang/tr/notifications.php +++ b/resources/lang/tr/notifications.php @@ -92,7 +92,7 @@ 'announce' => [ 'channel_announcement' => ':username ":title" diyor', 'channel_announcement_compact' => ':title', - 'channel_announcement_group' => ':username Tarafından duyuru', + 'channel_announcement_group' => ':username tarafından duyuru', ], ], @@ -160,8 +160,8 @@ 'user_beatmapset_new_compact' => 'Yeni beatmap ":title"', 'user_beatmapset_new_group' => ' :username tarafından yapılmış yeni beatmapler', - 'user_beatmapset_revive' => '":title" isimli Beatmap :username tarafından hayata geri döndürüdü', - 'user_beatmapset_revive_compact' => '":title" isim Beatmap hayata geri döndürüldü', + 'user_beatmapset_revive' => '":title" adlı beatmap :username tarafından hayata geri döndürüldü', + 'user_beatmapset_revive_compact' => '":title" adlı beatmap hayata geri döndürüldü', ], ], diff --git a/resources/lang/tr/page_title.php b/resources/lang/tr/page_title.php index 7540ed6f16a..aeba3e9522a 100644 --- a/resources/lang/tr/page_title.php +++ b/resources/lang/tr/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'oyuncu bilgisi', + 'create' => '', 'disabled' => 'bildirim', ], 'wiki_controller' => [ diff --git a/resources/lang/tr/store.php b/resources/lang/tr/store.php index 176d99d1c00..6b9b350705b 100644 --- a/resources/lang/tr/store.php +++ b/resources/lang/tr/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Düzenlemek için buraya tıklayın.', 'declined' => 'Ödeme iptal edildi.', 'delayed_shipping' => 'Şu an siparişlere boğulmuş durumdayız! Siparişinizi vermekte özgürsünüz ancak biz mevcut siparişleri yetiştirmekle uğraşırken **ek olarak 1-2 hafta gecikme** bekleyebilirsiniz.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Bu siparişteki tüm osu!supporter etiketlerini etkinliğimden gizle', 'old_cart' => 'Sepetiniz güncel görünmediği için tekrar yüklendi, lütfen tekrar deneyin.', 'pay' => 'Paypal ile Ödeme Yap', 'title_compact' => 'kasaya git', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Ödemenizin bir eCheck olması nedeniyle, ödemenizin PayPal\'dan temizlenmesi için 10 ekstra günü göz önüne alın!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Bu siparişteki osu!supporter etiketleri yakın zamandaki etkinliklerinizde gösterilmez.', 'title_compact' => 'fatura', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Mesaj: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'oyuncuya hediye et', - 'gift_message' => '', + 'gift_message' => 'isterseniz hediyenize bir mesaj ekleyin! (en fazla :length karakter)', 'require_login' => [ '_' => 'osu!supporter etiketi almak için :link !', diff --git a/resources/lang/tr/users.php b/resources/lang/tr/users.php index 42850a8bbb3..916b08de5ba 100644 --- a/resources/lang/tr/users.php +++ b/resources/lang/tr/users.php @@ -52,6 +52,22 @@ 'send_message' => 'mesaj gönder', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Olamaz! Görünüşe bakılırsa hesabın kilitlenmiş.', 'warning' => "Bir kuralı ihlal etmeniz durumunda, genellikle herhangi bir af(veya itiraz) talebini dikkate almayacağımız bir aylık bekleme süresinin olduğunu unutmayın. Bu süreden sonra, gerekli olması halinde bizimle iletişime geçmekte özgürsünüz. Bir hesabı devre dışı bıraktıktan sonra yeni hesap oluşturmanın bu bir aylık bekleme süresinin uzatılmasına neden olacağını lütfen unutmayın. Ayrıca oluşturduğunuz her hesap için kuralları daha fazla ihlal ettiğinizi unutmayın. Bu yolda gitmemenizi önemle tavsiye ederiz!", @@ -212,7 +228,7 @@ 'title' => 'Mezarlıktaki Beatmapler', ], 'guest' => [ - 'title' => 'Beatmap\'e misafir olarak katıl', + 'title' => 'Konuk Olarak Katıldığı Beatmapler', ], 'loved' => [ 'title' => 'Sevilen Beatmapler', @@ -348,7 +364,7 @@ 'to_1_done' => 'Sabitlenmiş skor', ], 'pinned' => [ - 'title' => 'Sabitlenmiş skorlar', + 'title' => 'Sabitlenen Skorlar', ], ], 'votes' => [ @@ -451,6 +467,8 @@ 'offline' => 'Çevrimdışı', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Kullanıcı oluşturuldu', ], 'verify' => [ diff --git a/resources/lang/uk/beatmapsets.php b/resources/lang/uk/beatmapsets.php index 84430890ff6..46166a682ba 100644 --- a/resources/lang/uk/beatmapsets.php +++ b/resources/lang/uk/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Увійдіть, щоб додати цю мапу до вподобаних', 'logged-out' => 'Необхідно ввійти для того що б завантажувати мапи!', 'mapped_by' => 'створена :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Видалити з вподобаного', 'updated_timeago' => 'оновлена :timeago', diff --git a/resources/lang/uk/comments.php b/resources/lang/uk/comments.php index 7dc97d43736..222ef11a160 100644 --- a/resources/lang/uk/comments.php +++ b/resources/lang/uk/comments.php @@ -12,7 +12,7 @@ 'pinned' => 'закріплено', 'empty' => 'Ще немає коментарів.', 'load_replies' => 'завантажити відповіді', - 'replies_count' => ':count_delimited відповідь|:count_delimited вiдповиiдей', + 'replies_count' => ':count_delimited відповідь|:count_delimited відповідей', 'title' => 'Коментарі', 'commentable_name' => [ diff --git a/resources/lang/uk/home.php b/resources/lang/uk/home.php index bc4168851fb..2e81747c765 100644 --- a/resources/lang/uk/home.php +++ b/resources/lang/uk/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "ну ж бо
    розпочнімо!", 'action' => 'Завантажити osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'для macOS', + 'mirror' => 'дзеркало', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "ну ж бо
    розпочнімо!", + 'video-guide' => 'відео інструкція', 'help' => [ '_' => 'якщо у вас є проблеми з запуском гри або реєстрацією облікового запису, :help_forum_link або :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'для macOS', 'linux' => 'для Linux', ], - 'mirror' => 'дзеркало', - 'macos-fallback' => 'для macOS', 'steps' => [ 'register' => [ 'title' => 'створіть обліковий запис', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'відео інструкція', ], 'user' => [ diff --git a/resources/lang/uk/mail.php b/resources/lang/uk/mail.php index 01998f92ec1..837791c371a 100644 --- a/resources/lang/uk/mail.php +++ b/resources/lang/uk/mail.php @@ -62,12 +62,12 @@ ], 'supporter_gift' => [ - 'anonymous_gift' => 'Людина, який подарував вам цей тег, може хотіти залишитися анонімним, тому його ми його ім\'я залишиться незгаданим.', + 'anonymous_gift' => 'Людина, яка подарувала вам цей тег, може хотіти залишитися анонімом, тому його ім\'я залишиться незгаданим.', 'anonymous_gift_maybe_not' => 'Але ви вже швидше за все знаєте хто це ;).', 'duration' => 'Завдяки йому, у вас тепер є доступ до osu!direct і іншим привілеям osu!прихильника на :duration.', 'features' => 'Ви можете дізнатися більше про них тут:', 'gifted' => 'Хтось щойно подарував вам osu!прихильника!', - 'gift_message' => '', + 'gift_message' => 'Людина, яка подарувала вам цей тег, залишила повідомлення:', 'subject' => 'Вам подарували osu!прихильника!', ], diff --git a/resources/lang/uk/page_title.php b/resources/lang/uk/page_title.php index f48c8ff23bc..14a52b4023e 100644 --- a/resources/lang/uk/page_title.php +++ b/resources/lang/uk/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => 'інформація про гравця', + 'create' => '', 'disabled' => 'увага', ], 'wiki_controller' => [ diff --git a/resources/lang/uk/store.php b/resources/lang/uk/store.php index 854f9d1300e..8dd093fd9b9 100644 --- a/resources/lang/uk/store.php +++ b/resources/lang/uk/store.php @@ -31,8 +31,8 @@ 'cart_problems_edit' => 'Натисніть тут, щоб змінити.', 'declined' => 'Ваш платіж було скасовано.', 'delayed_shipping' => 'В даний час у нас багато замовлень. Ти можеш замовити товар, але будь ласка, пам\'ятай, що його обробка замовлення може зайняти 1-2 тижні.', - 'hide_from_activity' => '', - 'old_cart' => 'Здається ваша корзина застаріла, тому була перезавантажена, будь ласка спробуйте ще раз.', + 'hide_from_activity' => 'Приховати всі теги osu!прихильник цього замовлення з моєї активності', + 'old_cart' => 'Здається ваш кошик застарів, тому був перезавантажений, будь ласка спробуйте ще раз.', 'pay' => 'Оплатити за допомогою PayPal', 'title_compact' => 'перевірка', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Оскільки оплата була через eCheck, очікування підтвердження оплати через Paypal може зайнятий до 10 днів!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Теги osu!прихильника в даному замовленні не показуються в останній активності.', 'title_compact' => 'рахунок', 'status' => [ @@ -84,18 +84,18 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Повідомлення: :message', ], ], 'not_modifiable_exception' => [ - 'cancelled' => 'Ви не можете змінити своє замовлення, так як його було скасовано.', - 'checkout' => 'Ви не можете змінити своє замовлення, поки він обробляється.', // checkout and processing should have the same message. + 'cancelled' => 'Ви не можете змінити своє замовлення тому, що його було скасовано.', + 'checkout' => 'Ви не можете змінити своє замовлення, поки воно обробляється.', // checkout and processing should have the same message. 'default' => 'Замовлення неможливо змінити', - 'delivered' => 'Ви не можете змінити своє замовлення, так як воно вже доставлене.', - 'paid' => 'Ви не можете змінити своє замовлення, так як його було оплачено.', - 'processing' => 'Ви не можете змінити своє замовлення, поки він обробляється.', - 'shipped' => 'Ви не можете змінити своє замовлення, так як воно вже відправлено.', + 'delivered' => 'Ви не можете змінити своє замовлення тому, що воно вже доставлене.', + 'paid' => 'Ви не можете змінити своє замовлення тому, що його було оплачено.', + 'processing' => 'Ви не можете змінити своє замовлення, поки воно обробляється.', + 'shipped' => 'Ви не можете змінити своє замовлення тому, що його вже відправлено.', ], 'status' => [ @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'подарунок для гравця', - 'gift_message' => '', + 'gift_message' => 'додайте додаткове повідомлення до вашого подарунка! (до :length символів)', 'require_login' => [ '_' => 'Ви маєте бути :link для покупки osu!прихильник!', diff --git a/resources/lang/uk/user_verification.php b/resources/lang/uk/user_verification.php index f7155facc11..21393145d6a 100644 --- a/resources/lang/uk/user_verification.php +++ b/resources/lang/uk/user_verification.php @@ -11,7 +11,7 @@ 'issuing' => 'Відправляння нового коду...', 'info' => [ - 'check_spam' => "Перевірте розділ \"спам\" в ел.ящику, якщо ви не можете знайти лист.", + 'check_spam' => "Перевірте розділ \"спам\", якщо ви не можете знайти лист.", 'recover' => "Якщо ви втратили доступ до своєї пошти або забули її, пройдіть :link.", 'recover_link' => 'процес відновлення електронної пошти тут', 'reissue' => 'Також, ви можете :reissue_link або :logout_link.', diff --git a/resources/lang/uk/users.php b/resources/lang/uk/users.php index 5aa6f421465..e56f52b87e1 100644 --- a/resources/lang/uk/users.php +++ b/resources/lang/uk/users.php @@ -8,14 +8,14 @@ 'beatmapset_activities' => [ 'title' => "Історія редагування мап користувача :user", - 'title_compact' => 'Модифікація', + 'title_compact' => 'Моддинг', 'discussions' => [ 'title_recent' => 'Нещодавно розпочаті дискусії', ], 'events' => [ - 'title_recent' => 'Недавні події', + 'title_recent' => 'Нещодавні події', ], 'posts' => [ @@ -52,6 +52,22 @@ 'send_message' => 'Надіслати повідомлення', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'О-о! Схоже, що ваш обліковий запис було відключено.', 'warning' => "У випадку порушення правил, врахуйте те, що існує період \"кулл-дауну\" в один місяць й під час якого ми не прийматимемо будь-які запити на амністію вашого облікового запису. Після цього періоду, ви спокійно можете зв'язатися з нами якщо ви вважаете це за потрібне. Зверніть увагу що створення нових облікових записів після відключення одного з них - призведе до подовження періоду \"кулл-дауну\" й надалі. Зверніть увагу також на те, що з кожним створеним обілковим записом який ви створите, ви все більше будете порушником правил, тому ми закликаємо вас - не йдіть цим шляхом!", @@ -126,7 +142,7 @@ 'actions' => [ 'send' => 'Надіслати скаргу', - 'cancel' => 'Відмінити', + 'cancel' => 'Скасувати', ], 'options' => [ @@ -175,7 +191,7 @@ 'button' => 'Завантажити зображення', 'dropzone' => 'Для завантаження файлу перетягніть його сюди', 'dropzone_info' => 'Ви також можете перетягнути зображення сюди для завантаження', - 'size_info' => 'Розмір обкладинки повинен бути 2400x620', + 'size_info' => 'Розмір обкладинки повинен бути 2400x640', 'too_large' => 'Завантажене зображення занадто велике.', 'unsupported_format' => 'Непідтримуваний формат.', @@ -203,28 +219,28 @@ ], 'beatmaps' => [ 'by_artist' => 'від :artist', - 'title' => 'Мапи', + 'title' => 'Бітмапи', 'favourite' => [ 'title' => 'Вподобайки', ], 'graveyard' => [ - 'title' => 'Закинуті карти', + 'title' => 'Закинуті бітмапи', ], 'guest' => [ 'title' => 'Мапи з гостьовими складностями', ], 'loved' => [ - 'title' => 'Улюблені карти', + 'title' => 'Улюблені бітмапи', ], 'nominated' => [ - 'title' => 'Номіновані рангові мапи', + 'title' => 'Номіновані рангові бітмапи', ], 'pending' => [ 'title' => 'На розгляді', ], 'ranked' => [ - 'title' => 'Рейтингові і схвалені карти', + 'title' => 'Рейтингові і схвалені бітмапи', ], ], 'discussions' => [ @@ -451,6 +467,8 @@ 'offline' => 'Не в мережі', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Зареєстрований', ], 'verify' => [ diff --git a/resources/lang/uk/wiki.php b/resources/lang/uk/wiki.php index c4e89959b55..809a7c0a6c7 100644 --- a/resources/lang/uk/wiki.php +++ b/resources/lang/uk/wiki.php @@ -10,7 +10,7 @@ 'missing' => 'Запитувана сторінка ":keyword" не знайдена.', 'missing_title' => 'Не знайдено', 'missing_translation' => 'Для цієї мови, запитувана сторінка не знайдена.', - 'needs_cleanup_or_rewrite' => 'Ця стаття не відповідає стандартам osu! wiki потребує чистки або перезапису. Якщо ви можете допомогти, будь ласка, розгляньте можливість оновити статтю!', + 'needs_cleanup_or_rewrite' => 'Ця стаття не відповідає стандартам osu! wiki та потребує чистки або перезапису. Якщо ви можете допомогти, будь ласка, розгляньте можливість оновити статтю!', 'search' => 'Пошук наявних сторінок для :link.', 'stub' => 'Ця стаття неповна і в очікуванні на когось хто її розширить.', 'toc' => 'Вміст', diff --git a/resources/lang/vi/beatmapsets.php b/resources/lang/vi/beatmapsets.php index 35e3b0840d3..075ae4f727b 100644 --- a/resources/lang/vi/beatmapsets.php +++ b/resources/lang/vi/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => 'Đăng nhập để yêu thích beatmap này', 'logged-out' => 'Bạn cần phải đăng nhập trước khi tải xuống beatmap!', 'mapped_by' => 'được tạo bởi :mapper', + 'mapped_by_guest' => '', 'unfavourite' => 'Bỏ yêu thích beatmapset này', 'updated_timeago' => 'cập nhật lần cuối vào :timeago', diff --git a/resources/lang/vi/forum.php b/resources/lang/vi/forum.php index 02aac4a580c..9b12dbdeb1a 100644 --- a/resources/lang/vi/forum.php +++ b/resources/lang/vi/forum.php @@ -157,7 +157,7 @@ 'edit_topic' => 'Tiêu đề chủ đề đã được thay đổi', 'edit_poll' => 'Cuộc thăm dò chủ đề đã được chỉnh sửa', 'fork' => 'Chủ đề đã được sao chép', - 'issue_tag' => '', + 'issue_tag' => 'Thẻ được phát hành', 'lock' => 'Chủ đề bị khóa', 'merge' => 'Các bài viết đã được gộp vào chủ đề này', 'move' => 'Di chuyển chủ đề', diff --git a/resources/lang/vi/home.php b/resources/lang/vi/home.php index 2cd3cabc398..b6cb3bda937 100644 --- a/resources/lang/vi/home.php +++ b/resources/lang/vi/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "hãy
    bắt đầu!", 'action' => 'Tải xuống osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'người dùng macOS', + 'mirror' => 'liên kết phụ', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "hãy
    bắt đầu!", + 'video-guide' => 'hướng dẫn bằng video', 'help' => [ '_' => 'nếu bạn gặp vấn đề khi bắt đầu game hoặc tạo tài khoản, :help_forum_link hoặc :support_button.', @@ -86,8 +99,6 @@ 'macos' => 'cho macOS', 'linux' => 'cho Linux', ], - 'mirror' => 'liên kết phụ', - 'macos-fallback' => 'người dùng macOS', 'steps' => [ 'register' => [ 'title' => 'tạo tài khoản', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => 'hướng dẫn bằng video', ], 'user' => [ diff --git a/resources/lang/vi/mail.php b/resources/lang/vi/mail.php index f04cbc629f9..3476dd6ef70 100644 --- a/resources/lang/vi/mail.php +++ b/resources/lang/vi/mail.php @@ -67,7 +67,7 @@ 'duration' => 'Nhờ họ, bạn có quyền truy cập osu!direct và các quyền lợi osu!supporter khác trong :duration tiếp theo.', 'features' => 'Bạn có thể tìm thêm thông tin về những tính năng này tại đây:', 'gifted' => 'Ai đó vừa mới tặng bạn một osu!supporter tag!', - 'gift_message' => '', + 'gift_message' => 'Người đã tặng bạn cái thẻ này để lại một tin nhắn:', 'subject' => 'Bạn đã được tặng một osu!supporter tag!', ], diff --git a/resources/lang/vi/page_title.php b/resources/lang/vi/page_title.php index cbbde081454..985945bfe10 100644 --- a/resources/lang/vi/page_title.php +++ b/resources/lang/vi/page_title.php @@ -106,6 +106,7 @@ ], 'users_controller' => [ '_' => 'thông tin người chơi', + 'create' => '', 'disabled' => 'để ý', ], 'wiki_controller' => [ diff --git a/resources/lang/vi/store.php b/resources/lang/vi/store.php index acc673abac4..60aa8407f3c 100644 --- a/resources/lang/vi/store.php +++ b/resources/lang/vi/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => 'Nhấp vào đây để chỉnh sửa nó.', 'declined' => 'Thanh toán đã bị hủy.', 'delayed_shipping' => 'Hiện tại chúng tôi đang có một lượng đơn hàng rất lớn! Bạn vẫn có thể thoải mái đặt hàng, nhưng vui lòng đợi **thêm 1-2 tuần** trong khi chúng tôi bắt kịp với những đơn hàng hiện tại.', - 'hide_from_activity' => '', + 'hide_from_activity' => 'Ẩn tất cả thẻ osu!supporter trong đơn hàng này khỏi hoạt động của tôi', 'old_cart' => 'Giỏ hàng của bạn đã hết hạn và đã được nạp lại, vui lòng thử lại sau.', 'pay' => 'Thanh toán với Paypal', 'title_compact' => 'thanh toán', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => 'Vì bạn thanh toán bằng eCheck, hãy chờ thêm tối đa 10 ngày để thanh toán qua khỏi PayPal!', - 'hide_from_activity' => '', + 'hide_from_activity' => 'thẻ osu!supporter ở trong đơn hàng này sẽ không được hiện lên ở trong hoạt động gần đây của bạn.', 'title_compact' => 'hóa đơn', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => 'Số tin nhắn: :message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => 'tặng người chơi khác', - 'gift_message' => '', + 'gift_message' => 'thêm một lời nhắn vào món quà của bạn!( lên tới :length chữ)', 'require_login' => [ '_' => 'Bạn cần phải :link để nhận một osu!supporter tag!', diff --git a/resources/lang/vi/users.php b/resources/lang/vi/users.php index feede2e64ef..eb1a668fe58 100644 --- a/resources/lang/vi/users.php +++ b/resources/lang/vi/users.php @@ -52,6 +52,22 @@ 'send_message' => 'Gửi tin nhắn', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => 'Ôi không! Có vẻ tài khoản của bạn đã bị vô hiệu hóa.', 'warning' => "Trong trường hợp bạn đã vi phạm luật, lưu ý sẽ có một khoảng thời gian trung bình một tháng chúng tôi sẽ không tiếp nhận mọi nhu cầu hối lỗi. Sau khoảng thời gian này, bạn hoàn toàn có thể thoải mái liên lạc chúng tôi nếu cần thiết. Lưu ý: tạo thêm tài khoản mới sau khi bạn đã bị ban sẽ gia tăng khoảng thời gian nói trên. Đồng thời hãy lưu ý rằng mỗi tài khoản tạo thêm là một lần bạn tiếp tục vi phạm luật. Chúng tôi khuyên bạn không nên theo con đường này!", @@ -451,6 +467,8 @@ 'offline' => 'Offline', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => 'Đã tạo người dùng', ], 'verify' => [ diff --git a/resources/lang/zh-tw/beatmapsets.php b/resources/lang/zh-tw/beatmapsets.php index 5d631ca9628..5f1d6c0f44a 100644 --- a/resources/lang/zh-tw/beatmapsets.php +++ b/resources/lang/zh-tw/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '登入後才能把這張圖譜加到最愛', 'logged-out' => '下載圖譜前請先登入!', 'mapped_by' => '由 :mapper 製作', + 'mapped_by_guest' => '', 'unfavourite' => '取消收藏', 'updated_timeago' => '最後更新時間 :timeago', diff --git a/resources/lang/zh-tw/home.php b/resources/lang/zh-tw/home.php index 49444fdafb3..0ff81a95cad 100644 --- a/resources/lang/zh-tw/home.php +++ b/resources/lang/zh-tw/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "讓我們
    開始吧!", 'action' => '下載 osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS 使用者', + 'mirror' => '鏡像站', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "讓我們
    開始吧!", + 'video-guide' => '影片教學', 'help' => [ '_' => '如果您在啟動遊戲或註冊帳號時遇到問題,請:help_forum_link或:support_button。', @@ -86,8 +99,6 @@ 'macos' => 'macOS 版', 'linux' => 'Linux 版', ], - 'mirror' => '鏡像站', - 'macos-fallback' => 'macOS 使用者', 'steps' => [ 'register' => [ 'title' => '註冊帳號', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '影片教學', ], 'user' => [ diff --git a/resources/lang/zh-tw/page_title.php b/resources/lang/zh-tw/page_title.php index 55f283ca0df..7c190afebed 100644 --- a/resources/lang/zh-tw/page_title.php +++ b/resources/lang/zh-tw/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '玩家資訊', + 'create' => '', 'disabled' => '通知', ], 'wiki_controller' => [ diff --git a/resources/lang/zh-tw/users.php b/resources/lang/zh-tw/users.php index 2069dc66375..8c00155e801 100644 --- a/resources/lang/zh-tw/users.php +++ b/resources/lang/zh-tw/users.php @@ -52,6 +52,22 @@ 'send_message' => '傳送訊息', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '哎唷!看起來你的帳號已被禁用。', 'warning' => "若你沒有遵守規則,我們原則上在一個月的期限以內不會考慮解禁您的帳號。在此之後,您如有需要,可以隨時聯絡我們。請注意,在一個帳號被封禁後創建新帳號會使您的封禁期限被延長。而且每當您創建一個新帳號,您都是在更嚴重地破壞規則。我們強烈建議您不要誤入歧途。", @@ -451,6 +467,8 @@ 'offline' => '離線', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '帳號已註冊', ], 'verify' => [ diff --git a/resources/lang/zh/beatmapsets.php b/resources/lang/zh/beatmapsets.php index 0f425373659..cf245c4b837 100644 --- a/resources/lang/zh/beatmapsets.php +++ b/resources/lang/zh/beatmapsets.php @@ -66,6 +66,7 @@ 'favourite_login' => '登录以收藏这张谱面', 'logged-out' => '下载谱面前请先登录!', 'mapped_by' => '谱师::mapper', + 'mapped_by_guest' => '', 'unfavourite' => '取消收藏', 'updated_timeago' => ':timeago 更新', diff --git a/resources/lang/zh/home.php b/resources/lang/zh/home.php index 6c2cb638d5f..e8759ad0f88 100644 --- a/resources/lang/zh/home.php +++ b/resources/lang/zh/home.php @@ -72,8 +72,21 @@ ], 'download' => [ - 'tagline' => "让我们
    开始吧!", 'action' => '下载 osu!', + 'action_lazer' => '', + 'action_lazer_description' => '', + 'action_lazer_info' => '', + 'action_lazer_title' => '', + 'action_title' => '', + 'for_os' => '', + 'lazer_note' => '', + 'macos-fallback' => 'macOS 用户', + 'mirror' => '从镜像服务器下载', + 'or' => '', + 'other_os' => '', + 'quick_start_guide' => '', + 'tagline' => "让我们
    开始吧!", + 'video-guide' => '视频教程', 'help' => [ '_' => '如果您在开始游戏或注册账户时遇到问题,请 :help_forum_link 或 :support_button。', @@ -86,8 +99,6 @@ 'macos' => 'macOS 版', 'linux' => 'Linux 版', ], - 'mirror' => '从镜像服务器下载', - 'macos-fallback' => 'macOS 用户', 'steps' => [ 'register' => [ 'title' => '注册账号', @@ -105,7 +116,6 @@ ], ], ], - 'video-guide' => '视频教程', ], 'user' => [ diff --git a/resources/lang/zh/mail.php b/resources/lang/zh/mail.php index 52f2db06f4d..b50cdbaded2 100644 --- a/resources/lang/zh/mail.php +++ b/resources/lang/zh/mail.php @@ -67,7 +67,7 @@ 'duration' => '因此,您可以在接下来的 :duration 内享受到 osu!direct 等 osu! 支持者所享有的特权。', 'features' => '您可以在此处找到更多关于特权的信息:', 'gifted' => '有人刚刚赠予您 osu! 支持者标签!', - 'gift_message' => '', + 'gift_message' => '把这份支持者标签赠送给你的人还附上了以下留言:', 'subject' => '你收到了一份礼物:osu! 支持者标签。', ], diff --git a/resources/lang/zh/page_title.php b/resources/lang/zh/page_title.php index 2a9c8ad85e9..01a404378ed 100644 --- a/resources/lang/zh/page_title.php +++ b/resources/lang/zh/page_title.php @@ -105,6 +105,7 @@ ], 'users_controller' => [ '_' => '玩家信息', + 'create' => '', 'disabled' => '通知', ], 'wiki_controller' => [ diff --git a/resources/lang/zh/store.php b/resources/lang/zh/store.php index 6879697be11..84453dde15d 100644 --- a/resources/lang/zh/store.php +++ b/resources/lang/zh/store.php @@ -31,7 +31,7 @@ 'cart_problems_edit' => '点击此处编辑。', 'declined' => '支付被取消。', 'delayed_shipping' => '欢迎购买,但是我们正在处理大量的订单,所以订单**可能会有 1-2 周的延迟**。', - 'hide_from_activity' => '', + 'hide_from_activity' => '不把此订单中的支持者标签购买同步到个人活动', 'old_cart' => '您的购物车已经过期,请重试。', 'pay' => '使用 Paypal 支付', 'title_compact' => '结账', @@ -51,7 +51,7 @@ 'invoice' => [ 'echeck_delay' => '由于您的支付是通过 eCheck 进行的,请再等待至多 10 天来让 PayPal 完成支付。', - 'hide_from_activity' => '', + 'hide_from_activity' => '此订单的支持者标签购买未显示在你的个人活动中。', 'title_compact' => '账单', 'status' => [ @@ -84,7 +84,7 @@ ], 'subtext' => [ - 'supporter_tag' => '', + 'supporter_tag' => '留言::message', ], ], @@ -127,7 +127,7 @@ 'supporter_tag' => [ 'gift' => '要赠与的玩家', - 'gift_message' => '', + 'gift_message' => '给礼物留下附言吧!(可选,至多 :length 个字符)', 'require_login' => [ '_' => '你需要 :link 以获得 osu! 支持者标签!', diff --git a/resources/lang/zh/users.php b/resources/lang/zh/users.php index 022723d394c..1c54f1a0e23 100644 --- a/resources/lang/zh/users.php +++ b/resources/lang/zh/users.php @@ -52,6 +52,22 @@ 'send_message' => '发送消息', ], + 'create' => [ + 'form' => [ + 'password' => '', + 'password_confirmation' => '', + 'submit' => '', + 'user_email' => '', + 'user_email_confirmation' => '', + 'username' => '', + + 'tos_notice' => [ + '_' => '', + 'link' => '', + ], + ], + ], + 'disabled' => [ 'title' => '哎呀!看起来您的账户已被禁用。', 'warning' => "如果您违反了规则,原则上在一个月的期限以内我们不会考虑解禁您的账户。在此之后,您如果需要,可以随时联系我们。请注意,在一个账户被封后创建新账户会使您的封禁期限被延长。您更需要注意您每创建一个新账户都会更严重地违反规则。我们强烈建议您不要误入歧途。", @@ -451,6 +467,8 @@ 'offline' => '离线', ], 'store' => [ + 'from_client' => '', + 'from_web' => '', 'saved' => '账户已创建', ], 'verify' => [ From ac4caff3e51d6010a2269c125f3698ae49b0f3df Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:35:35 +0900 Subject: [PATCH 0392/1261] Remove unused variable --- app/Libraries/Ip2AsnUpdater.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index d544e8b4fae..9358ba84012 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -19,8 +19,6 @@ public static function getIndexPath() return database_path('ip2asn.idx'); } - private string $tsv; - public function run(): void { $dbPath = static::getDbPath(); From 6c89b57e8d8a98ce93b43b5696613d0ec866215f Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:36:32 +0900 Subject: [PATCH 0393/1261] Separate parsing and file writing --- app/Libraries/Ip2AsnUpdater.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index 9358ba84012..59b7ff0f297 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -46,6 +46,7 @@ public function run(): void $index .= pack('l', $currentLine); } } + if ($newDb) { file_put_contents($dbPath, $tsv); } From fdb25eb903e9cf75978dd49e836624303b14a545 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:46:22 +0900 Subject: [PATCH 0394/1261] Add some messages when processing the db --- app/Console/Commands/Ip2AsnUpdate.php | 6 +++++- app/Libraries/Ip2AsnUpdater.php | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/Ip2AsnUpdate.php b/app/Console/Commands/Ip2AsnUpdate.php index 19dfc1c9502..9307d97024f 100644 --- a/app/Console/Commands/Ip2AsnUpdate.php +++ b/app/Console/Commands/Ip2AsnUpdate.php @@ -15,6 +15,10 @@ class Ip2AsnUpdate extends Command public function handle() { - (new Ip2AsnUpdater())->run(); + $this->info('Updating ip2asn database'); + (new Ip2AsnUpdater())->run(function (string $message): void { + $this->info($message); + }); + $this->info('Done'); } } diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index 59b7ff0f297..7a54e637f59 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -7,6 +7,8 @@ namespace App\Libraries; +use Log; + class Ip2AsnUpdater { public static function getDbPath() @@ -19,8 +21,12 @@ public static function getIndexPath() return database_path('ip2asn.idx'); } - public function run(): void + public function run(?callable $logger = null): void { + $logger ??= function (string $message) { + Log::info("ip2asn: {$message}"); + }; + $logger('Checking db for updates'); $dbPath = static::getDbPath(); $indexPath = static::getIndexPath(); @@ -31,13 +37,19 @@ public function run(): void $newIndex = !$dbExists || !file_exists($indexPath) || filemtime($dbPath) > filemtime($indexPath); if (!$newDb && !$newIndex) { + $logger('All relevant files are up to date'); + return; } + if ($newDb) { + $logger('Db file is outdated. Downloading'); + } $tsv = $newDb ? gzdecode(file_get_contents('https://iptoasn.com/data/ip2asn-combined.tsv.gz')) : file_get_contents($dbPath); + $logger('Indexing db'); $currentLine = 0; $index = pack('l', $currentLine); while (($currentLine = strpos($tsv, "\n", $currentLine)) !== false) { @@ -47,6 +59,7 @@ public function run(): void } } + $logger('Writing db and index to file'); if ($newDb) { file_put_contents($dbPath, $tsv); } From fd1389be07b54637ca3f2ebf6b8fdeecfe59e671 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:52:16 +0900 Subject: [PATCH 0395/1261] Group message and actual action --- app/Libraries/Ip2AsnUpdater.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index 7a54e637f59..9088b5fe391 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -44,10 +44,10 @@ public function run(?callable $logger = null): void if ($newDb) { $logger('Db file is outdated. Downloading'); + $tsv = gzdecode(file_get_contents('https://iptoasn.com/data/ip2asn-combined.tsv.gz')); + } else { + $tsv = file_get_contents($dbPath); } - $tsv = $newDb - ? gzdecode(file_get_contents('https://iptoasn.com/data/ip2asn-combined.tsv.gz')) - : file_get_contents($dbPath); $logger('Indexing db'); $currentLine = 0; From c33dc635f18c7610963463f2affe6ac55719ee28 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:53:01 +0900 Subject: [PATCH 0396/1261] Some spaces --- app/Libraries/Ip2AsnUpdater.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index 9088b5fe391..0d8a9786d60 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -26,7 +26,9 @@ public function run(?callable $logger = null): void $logger ??= function (string $message) { Log::info("ip2asn: {$message}"); }; + $logger('Checking db for updates'); + $dbPath = static::getDbPath(); $indexPath = static::getIndexPath(); From 948e5502f4407baf3dff107a12fa5f7a526960fa Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 15:53:46 +0900 Subject: [PATCH 0397/1261] Add closing message --- app/Libraries/Ip2AsnUpdater.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Libraries/Ip2AsnUpdater.php b/app/Libraries/Ip2AsnUpdater.php index 0d8a9786d60..c0b8e799771 100644 --- a/app/Libraries/Ip2AsnUpdater.php +++ b/app/Libraries/Ip2AsnUpdater.php @@ -66,5 +66,7 @@ public function run(?callable $logger = null): void file_put_contents($dbPath, $tsv); } file_put_contents($indexPath, $index); + + $logger('Finished updating db'); } } From 8ec6b71475544f94c2ffb9141491fa5089a17017 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 16:50:13 +0900 Subject: [PATCH 0398/1261] Translatable text --- resources/assets/lib/chat/message-divider.tsx | 3 ++- resources/lang/en/chat.php | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/assets/lib/chat/message-divider.tsx b/resources/assets/lib/chat/message-divider.tsx index 04374adb10f..2a9177f7021 100644 --- a/resources/assets/lib/chat/message-divider.tsx +++ b/resources/assets/lib/chat/message-divider.tsx @@ -3,6 +3,7 @@ import * as moment from 'moment'; import * as React from 'react'; +import { trans } from 'utils/lang'; interface Props { timestamp: string; @@ -15,7 +16,7 @@ const MessageDividerBase = ({ timestamp, type }: Props, innerRef: React.Ref{moment(timestamp).format('LL')}
    ); case 'UNREAD_MARKER': - return (
    ); + return (
    ); default: return null; diff --git a/resources/lang/en/chat.php b/resources/lang/en/chat.php index b6969172776..dcf1b5e7110 100644 --- a/resources/lang/en/chat.php +++ b/resources/lang/en/chat.php @@ -8,6 +8,7 @@ 'talking_in' => 'talking in :channel', 'talking_with' => 'talking with :name', 'title_compact' => 'chat', + 'unread_messages' => 'unread messages', 'cannot_send' => [ 'channel' => 'You cannot message this channel at this time.', From f7d599057814c3f9e0e4841f757a01f15ab84815 Mon Sep 17 00:00:00 2001 From: nanaya Date: Tue, 10 Jan 2023 17:02:07 +0900 Subject: [PATCH 0399/1261] Set page locale for wiki pages based on its content Better hint for indexing? --- app/Http/Controllers/WikiController.php | 7 ++++++- resources/views/master.blade.php | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php index 96db732c849..b735db094e2 100644 --- a/app/Http/Controllers/WikiController.php +++ b/app/Http/Controllers/WikiController.php @@ -107,7 +107,12 @@ public function show($locale = null, $path = null) return json_item($page, 'WikiPage'); } - return ext_view($page->template(), compact('page'), null, $status ?? null); + return ext_view( + $page->template(), + ['contentLocale' => $page->locale, 'page' => $page], + null, + $status ?? null + ); } public function image($path) diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php index 004c5e6b128..ea69b90b1eb 100644 --- a/resources/views/master.blade.php +++ b/resources/views/master.blade.php @@ -40,7 +40,7 @@ $currentLocaleMeta ??= current_locale_meta(); @endphp - + @include("layout.metadata") {!! $title !!} From 1025155a3f051bf0c9d2c73085299c7e8d7b8e30 Mon Sep 17 00:00:00 2001 From: ThePooN Date: Tue, 10 Jan 2023 14:12:13 +0100 Subject: [PATCH 0400/1261] =?UTF-8?q?=F0=9F=94=A7=20Enable=20GitHub=20envi?= =?UTF-8?q?ronments=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pack.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pack.yml b/.github/workflows/pack.yml index 063c27f44b8..b51c14cddcd 100644 --- a/.github/workflows/pack.yml +++ b/.github/workflows/pack.yml @@ -62,6 +62,7 @@ jobs: runs-on: ubuntu-latest needs: - push_to_registry + environment: production steps: - name: Checkout @@ -90,6 +91,7 @@ jobs: runs-on: ubuntu-latest needs: - push_to_registry + environment: staging steps: - name: Checkout From c5b88365f41cbe3ecf26e1d6dbd97d4e3ff35b89 Mon Sep 17 00:00:00 2001 From: Venix <30481900+venix12@users.noreply.github.com> Date: Tue, 10 Jan 2023 15:41:33 +0100 Subject: [PATCH 0401/1261] seasons --- app/Http/Controllers/SeasonsController.php | 69 ++++++++++++++++ app/Libraries/RouteSection.php | 3 + app/Models/Multiplayer/Room.php | 16 ++++ app/Models/Season.php | 50 ++++++++++++ app/Models/SeasonRoom.php | 20 +++++ app/Transformers/SeasonTransformer.php | 24 ++++++ app/helpers.php | 1 + database/factories/SeasonFactory.php | 28 +++++++ ...2022_12_16_151137_create_seasons_table.php | 38 +++++++++ ...12_16_151601_create_season_rooms_table.php | 37 +++++++++ resources/assets/less/bem-index.less | 2 +- .../assets/less/bem/multiplayer-list.less | 13 +++ .../multiplayer-list.tsx} | 27 +++---- .../multiplayer-room.tsx} | 8 +- .../lib/components/ranking-select-options.tsx | 66 +++++++++++++++ .../assets/lib/entrypoints/seasons-show.tsx | 21 +++++ .../entrypoints/user-multiplayer-index.tsx | 4 +- .../lib/interfaces/multiplayer-list-json.ts | 24 ++++++ .../assets/lib/interfaces/season-json.ts | 10 +++ .../assets/lib/profile-page/header-links.ts | 2 +- .../assets/lib/register-components.coffee | 8 +- resources/assets/lib/seasons-show/main.tsx | 80 +++++++++++++++++++ .../multiplayer-list-store.ts} | 4 +- .../lib/user-multiplayer-index/main.tsx | 12 ++- resources/lang/en/page_title.php | 3 + resources/lang/en/rankings.php | 6 ++ .../views/multiplayer/rooms/show.blade.php | 9 ++- resources/views/rankings/index.blade.php | 57 +++++++------ resources/views/seasons/show.blade.php | 39 +++++++++ routes/web.php | 2 + tests/Browser/SanityTest.php | 4 + 31 files changed, 625 insertions(+), 62 deletions(-) create mode 100644 app/Http/Controllers/SeasonsController.php create mode 100644 app/Models/Season.php create mode 100644 app/Models/SeasonRoom.php create mode 100644 app/Transformers/SeasonTransformer.php create mode 100644 database/factories/SeasonFactory.php create mode 100644 database/migrations/2022_12_16_151137_create_seasons_table.php create mode 100644 database/migrations/2022_12_16_151601_create_season_rooms_table.php create mode 100644 resources/assets/less/bem/multiplayer-list.less rename resources/assets/lib/{user-multiplayer-index/multiplayer-history.tsx => components/multiplayer-list.tsx} (62%) rename resources/assets/lib/{user-multiplayer-index/room.tsx => components/multiplayer-room.tsx} (94%) create mode 100644 resources/assets/lib/components/ranking-select-options.tsx create mode 100644 resources/assets/lib/entrypoints/seasons-show.tsx create mode 100644 resources/assets/lib/interfaces/multiplayer-list-json.ts create mode 100644 resources/assets/lib/interfaces/season-json.ts create mode 100644 resources/assets/lib/seasons-show/main.tsx rename resources/assets/lib/{user-multiplayer-index/multiplayer-history-store.ts => stores/multiplayer-list-store.ts} (86%) create mode 100644 resources/views/seasons/show.blade.php diff --git a/app/Http/Controllers/SeasonsController.php b/app/Http/Controllers/SeasonsController.php new file mode 100644 index 00000000000..f38a4834ac9 --- /dev/null +++ b/app/Http/Controllers/SeasonsController.php @@ -0,0 +1,69 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +namespace App\Http\Controllers; + +use App\Models\Multiplayer\Room; +use App\Models\Season; +use App\Transformers\Multiplayer\RoomTransformer; + +class SeasonsController extends Controller +{ + private function getJson($season, $params) + { + $limit = clamp($params['limit'] ?? 50, 1, 50); + + $search = Room::search([ + 'cursor' => $params['cursor'], + 'limit' => $limit, + 'mode' => 'all', + 'season' => $season, + 'type_group' => 'playlists', + ]); + + [$rooms, $hasMore] = $search['query']->with([ + 'playlist.beatmap', + 'host', + ])->getWithHasMore(); + + $rooms->each->findAndSetCurrentPlaylistItem(); + $rooms->loadMissing('currentPlaylistItem.beatmap.beatmapset'); + + return [ + 'cursor' => $hasMore ? $search['cursorHelper']->next($rooms) : null, + 'rooms' => json_collection($rooms, new RoomTransformer(), ['current_playlist_item.beatmap.beatmapset', 'difficulty_range', 'host', 'playlist_item_stats']), + 'search' => $search['search'], + 'type_group' => 'playlists', + ]; + } + + public function show($id) + { + if ($id === 'latest') { + $season = Season::last(); + + if ($season === null) { + abort(404); + } + } else { + $season = Season::findOrFail($id); + } + + $seasons = Season::orderByDesc('id')->get(); + + $params = get_params(request()->all(), null, [ + 'cursor:array', + 'limit:int', + ], ['null_missing' => true]); + + $roomsJson = $this->getJson($season, $params); + + if (is_json_request()) { + return $roomsJson; + } + + return ext_view('seasons.show', compact('roomsJson', 'season', 'seasons')); + } +} diff --git a/app/Libraries/RouteSection.php b/app/Libraries/RouteSection.php index 9144fd7ccb1..af03c091baf 100644 --- a/app/Libraries/RouteSection.php +++ b/app/Libraries/RouteSection.php @@ -97,6 +97,9 @@ class RouteSection 'scores_controller' => [ '_' => 'beatmaps', ], + 'seasons_controller' => [ + '_' => 'rankings', + ], 'sessions_controller' => [ '_' => 'user', ], diff --git a/app/Models/Multiplayer/Room.php b/app/Models/Multiplayer/Room.php index fcb9f466148..df49ba5e34b 100644 --- a/app/Models/Multiplayer/Room.php +++ b/app/Models/Multiplayer/Room.php @@ -10,6 +10,8 @@ use App\Models\Beatmap; use App\Models\Chat\Channel; use App\Models\Model; +use App\Models\Season; +use App\Models\SeasonRoom; use App\Models\Traits\WithDbCursorHelper; use App\Models\User; use App\Traits\Memoizes; @@ -33,6 +35,7 @@ * @property int $participant_count * @property \Illuminate\Database\Eloquent\Collection $playlist PlaylistItem * @property \Illuminate\Database\Eloquent\Collection $scores Score + * @property-read Collection<\App\Models\Season> $seasons * @property \Carbon\Carbon $starts_at * @property \Carbon\Carbon|null $updated_at * @property int $user_id @@ -109,12 +112,14 @@ public static function search(array $rawParams) 'category', 'limit:int', 'mode', + 'season:any', 'sort', 'type_group', 'user:any', ], ['null_missing' => true]); $user = $params['user']; + $season = $params['season']; $sort = $params['sort']; $category = $params['category']; $typeGroup = $params['type_group']; @@ -132,11 +137,17 @@ public static function search(array $rawParams) $query = static::whereIn('type', static::TYPE_GROUPS[$typeGroup]); + if (isset($season)) { + $query->whereRelation('seasons', 'seasons.id', $season->id); + } + if (in_array($category, static::CATEGORIES, true)) { $query->where('category', $category); } switch ($params['mode']) { + case 'all': + break; case 'ended': $query->ended(); $sort ??= 'ended'; @@ -192,6 +203,11 @@ public function scores() return $this->hasMany(Score::class); } + public function seasons() + { + return $this->belongsToMany(Season::class, SeasonRoom::class); + } + public function userHighScores() { return $this->hasMany(UserScoreAggregate::class); diff --git a/app/Models/Season.php b/app/Models/Season.php new file mode 100644 index 00000000000..d51eade095e --- /dev/null +++ b/app/Models/Season.php @@ -0,0 +1,50 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +namespace App\Models; + +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; + +/** + * @property bool $concluded + * @property string $name + * @property-read Collection $rooms + */ +class Season extends Model +{ + use HasFactory; + + protected $casts = [ + 'concluded' => 'boolean', + ]; + + public function endDate(): ?Carbon + { + return $this->hasRooms() && $this->concluded + ? $this->rooms->sortByDesc('ends_at')->first()->ends_at + : null; + } + + public function hasRooms(): bool + { + return $this->rooms()->count() > 0; + } + + public function startDate(): ?Carbon + { + return $this->hasRooms() + ? $this->rooms->sortBy('starts_at')->first()->starts_at + : null; + } + + public function rooms(): BelongsToMany + { + return $this->belongsToMany(Multiplayer\Room::class, SeasonRoom::class); + } +} diff --git a/app/Models/SeasonRoom.php b/app/Models/SeasonRoom.php new file mode 100644 index 00000000000..86397032a1d --- /dev/null +++ b/app/Models/SeasonRoom.php @@ -0,0 +1,20 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +namespace App\Models; + +use Illuminate\Database\Eloquent\Model; + +/** + * @property int $id + * @property int $room_id + * @property int $season_id + */ +class SeasonRoom extends Model +{ + public $timestamps = false; +} diff --git a/app/Transformers/SeasonTransformer.php b/app/Transformers/SeasonTransformer.php new file mode 100644 index 00000000000..f2b88e06282 --- /dev/null +++ b/app/Transformers/SeasonTransformer.php @@ -0,0 +1,24 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +namespace App\Transformers; + +use App\Models\Season; + +class SeasonTransformer extends TransformerAbstract +{ + public function transform(Season $season): array + { + return [ + 'end_date' => $season->endDate(), + 'id' => $season->id, + 'name' => $season->name, + 'room_count' => $season->rooms()->count(), + 'start_date' => $season->startDate(), + ]; + } +} diff --git a/app/helpers.php b/app/helpers.php index 6597bd743a0..2baca2969a7 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -1072,6 +1072,7 @@ function nav_links() 'rankings.type.score' => route('rankings', ['mode' => $defaultMode, 'type' => 'score']), 'rankings.type.country' => route('rankings', ['mode' => $defaultMode, 'type' => 'country']), 'rankings.type.multiplayer' => route('multiplayer.rooms.show', ['room' => 'latest']), + 'rankings.type.seasons' => route('seasons.show', ['season' => 'latest']), 'layout.menu.rankings.kudosu' => osu_url('rankings.kudosu'), ]; $links['community'] = [ diff --git a/database/factories/SeasonFactory.php b/database/factories/SeasonFactory.php new file mode 100644 index 00000000000..23a708561de --- /dev/null +++ b/database/factories/SeasonFactory.php @@ -0,0 +1,28 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +namespace Database\Factories; + +use App\Models\Season; +use Illuminate\Database\Eloquent\Factories\Factory; + +class SeasonFactory extends Factory +{ + protected $model = Season::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => $this->faker->sentence(), + ]; + } +} diff --git a/database/migrations/2022_12_16_151137_create_seasons_table.php b/database/migrations/2022_12_16_151137_create_seasons_table.php new file mode 100644 index 00000000000..0debe701eec --- /dev/null +++ b/database/migrations/2022_12_16_151137_create_seasons_table.php @@ -0,0 +1,38 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +class CreateSeasonsTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('seasons', function (Blueprint $table) { + $table->id(); + $table->string('name'); + $table->boolean('concluded')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('seasons'); + } +} diff --git a/database/migrations/2022_12_16_151601_create_season_rooms_table.php b/database/migrations/2022_12_16_151601_create_season_rooms_table.php new file mode 100644 index 00000000000..8ecb2c69674 --- /dev/null +++ b/database/migrations/2022_12_16_151601_create_season_rooms_table.php @@ -0,0 +1,37 @@ +. Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +declare(strict_types=1); + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +class CreateSeasonRoomsTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('season_rooms', function (Blueprint $table) { + $table->id(); + $table->integer('room_id')->unsigned(); + $table->integer('season_id')->unsigned(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('season_rooms'); + } +} diff --git a/resources/assets/less/bem-index.less b/resources/assets/less/bem-index.less index e5e911710b8..c560a1ea729 100644 --- a/resources/assets/less/bem-index.less +++ b/resources/assets/less/bem-index.less @@ -223,6 +223,7 @@ @import "bem/mp-history-event"; @import "bem/mp-history-game"; @import "bem/mp-history-player-score"; +@import "bem/multiplayer-list"; @import "bem/multiplayer-room"; @import "bem/nav-button"; @import "bem/nav-click-popup"; @@ -389,7 +390,6 @@ @import "bem/user-level"; @import "bem/user-list"; @import "bem/user-list-popup"; -@import "bem/user-multiplayer-history"; @import "bem/user-name"; @import "bem/user-online-status"; @import "bem/user-profile-pages"; diff --git a/resources/assets/less/bem/multiplayer-list.less b/resources/assets/less/bem/multiplayer-list.less new file mode 100644 index 00000000000..52d5431cae3 --- /dev/null +++ b/resources/assets/less/bem/multiplayer-list.less @@ -0,0 +1,13 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +.multiplayer-list { + display: grid; + grid-gap: 10px; + + &__more { + display: flex; + height: auto; + justify-content: center; + } +} diff --git a/resources/assets/lib/user-multiplayer-index/multiplayer-history.tsx b/resources/assets/lib/components/multiplayer-list.tsx similarity index 62% rename from resources/assets/lib/user-multiplayer-index/multiplayer-history.tsx rename to resources/assets/lib/components/multiplayer-list.tsx index 541e9b40515..1591b26cb81 100644 --- a/resources/assets/lib/user-multiplayer-index/multiplayer-history.tsx +++ b/resources/assets/lib/components/multiplayer-list.tsx @@ -2,23 +2,21 @@ // See the LICENCE file in the repository root for full licence text. import ShowMoreLink from 'components/show-more-link'; -import UserJson from 'interfaces/user-json'; -import UserMultiplayerHistoryJson from 'interfaces/user-multiplayer-history-json'; -import { route } from 'laroute'; +import MultiplayerListJson from 'interfaces/multiplayer-list-json'; import { action, computed, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import * as React from 'react'; -import Room from 'user-multiplayer-index/room'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; import { trans } from 'utils/lang'; -import MultiplayerHistoryStore from './multiplayer-history-store'; +import MultiplayerRoom from './multiplayer-room'; interface Props { - store: MultiplayerHistoryStore; - user: UserJson; + showMoreRoute: string; + store: MultiplayerListStore; } @observer -export default class MultiplayerHistory extends React.Component { +export default class MultiplayerList extends React.Component { @observable private loading = false; @computed @@ -35,7 +33,7 @@ export default class MultiplayerHistory extends React.Component { render() { if (this.props.store.rooms.length === 0) { return ( -
    +
    {trans('multiplayer.empty._', { type_group: trans(`multiplayer.empty.${this.props.store.typeGroup}`), })} @@ -44,9 +42,9 @@ export default class MultiplayerHistory extends React.Component { } return ( -
    - {this.props.store.rooms.map((room) => )} -
    +
    + {this.props.store.rooms.map((room) => )} +
    { if (this.loading) return; this.loading = true; - const url = route('users.multiplayer.index', { typeGroup: this.props.store.typeGroup, user: this.props.user.id }); + + const url = this.props.showMoreRoute; void $.getJSON(url, { cursor_string: this.props.store.cursorString }) - .done(action((response: UserMultiplayerHistoryJson) => { + .done(action((response: MultiplayerListJson) => { this.props.store.updateWithJson(response); })).always(action(() => { this.loading = false; diff --git a/resources/assets/lib/user-multiplayer-index/room.tsx b/resources/assets/lib/components/multiplayer-room.tsx similarity index 94% rename from resources/assets/lib/user-multiplayer-index/room.tsx rename to resources/assets/lib/components/multiplayer-room.tsx index 77b36a2725b..50cfe0c2dca 100644 --- a/resources/assets/lib/user-multiplayer-index/room.tsx +++ b/resources/assets/lib/components/multiplayer-room.tsx @@ -5,26 +5,26 @@ import BeatmapsetCover from 'components/beatmapset-cover'; import DifficultyBadge from 'components/difficulty-badge'; import StringWithComponent from 'components/string-with-component'; import { UserLink } from 'components/user-link'; -import { EndpointRoomJson } from 'interfaces/user-multiplayer-history-json'; +import { EndpointRoomJson } from 'interfaces/multiplayer-list-json'; import { route } from 'laroute'; import { computed, makeObservable } from 'mobx'; import { observer } from 'mobx-react'; import * as moment from 'moment'; import * as React from 'react'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; import { getDiffColour } from 'utils/beatmap-helper'; import { classWithModifiers } from 'utils/css'; import { trans, transChoice } from 'utils/lang'; -import MultiplayerHistoryStore from './multiplayer-history-store'; interface Props { room: EndpointRoomJson; - store: MultiplayerHistoryStore; + store: MultiplayerListStore; } const endingSoonDiffMs = 60 * 60 * 1000; // 60 minutes. @observer -export default class Room extends React.Component { +export default class MultiplayerRoom extends React.Component { private get playlistItemCount() { return this.props.room.active ? this.props.room.playlist_item_stats.count_active diff --git a/resources/assets/lib/components/ranking-select-options.tsx b/resources/assets/lib/components/ranking-select-options.tsx new file mode 100644 index 00000000000..dbe703f027c --- /dev/null +++ b/resources/assets/lib/components/ranking-select-options.tsx @@ -0,0 +1,66 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import { Option, OptionRenderProps, SelectOptions } from 'components/select-options'; +import { route } from 'laroute'; +import * as React from 'react'; +import { navigate } from 'utils/turbolinks'; + +interface ItemJson { + id: number; + name: string; +} + +interface Props { + currentItem: ItemJson; + items: ItemJson[]; + type: 'multiplayer' | 'seasons'; +} + +export default class RankingSelectOptions extends React.PureComponent { + render() { + const options = this.props.items.map((item) => ({ + id: item.id, + text: item.name, + })); + + const selected = { + id: this.props.currentItem.id, + text: this.props.currentItem.name, + }; + + return ( + + ); + } + + private handleChange = (option: Option) => { + navigate(this.href(option.id)); + }; + + private href(id: number | null) { + switch (this.props.type) { + case 'multiplayer': + return route('multiplayer.rooms.show', { room: id ?? 'latest' }); + case 'seasons': + return route('seasons.show', { season: id ?? 'latest' }); + } + } + + private renderOption = (props: OptionRenderProps) => ( + + {props.children} + + ); +} diff --git a/resources/assets/lib/entrypoints/seasons-show.tsx b/resources/assets/lib/entrypoints/seasons-show.tsx new file mode 100644 index 00000000000..ab86506bf47 --- /dev/null +++ b/resources/assets/lib/entrypoints/seasons-show.tsx @@ -0,0 +1,21 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import core from 'osu-core-singleton'; +import * as React from 'react'; +import Main from 'seasons-show/main'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; +import { parseJson } from 'utils/json'; + +core.reactTurbolinks.register('seasons-show', () => { + const store = new MultiplayerListStore(); + store.updateWithJson(parseJson('json-rooms')); + + return ( +
    + ); +}); diff --git a/resources/assets/lib/entrypoints/user-multiplayer-index.tsx b/resources/assets/lib/entrypoints/user-multiplayer-index.tsx index e0001b09ee5..5c3496e404e 100644 --- a/resources/assets/lib/entrypoints/user-multiplayer-index.tsx +++ b/resources/assets/lib/entrypoints/user-multiplayer-index.tsx @@ -3,12 +3,12 @@ import core from 'osu-core-singleton'; import * as React from 'react'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; import Main from 'user-multiplayer-index/main'; -import MultiplayerHistoryStore from 'user-multiplayer-index/multiplayer-history-store'; import { parseJson } from 'utils/json'; core.reactTurbolinks.register('user-multiplayer-index', () => { - const store = new MultiplayerHistoryStore(); + const store = new MultiplayerListStore(); store.updateWithJson(parseJson('json-user-multiplayer-index')); return ( diff --git a/resources/assets/lib/interfaces/multiplayer-list-json.ts b/resources/assets/lib/interfaces/multiplayer-list-json.ts new file mode 100644 index 00000000000..10b74549a64 --- /dev/null +++ b/resources/assets/lib/interfaces/multiplayer-list-json.ts @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import BeatmapJson from './beatmap-json'; +import BeatmapsetJson from './beatmapset-json'; +import RoomJson from './room-json'; + +export type MultiplayerTypeGroup = 'playlists' | 'realtime'; + +type RoomJsonIncludes = + 'current_playlist_item' | + 'difficulty_range' | + 'host' | + 'playlist_item_stats'; + +export type EndpointRoomJson = RoomJson & Required>; + +export default interface MultiplayerListJson { + beatmaps: BeatmapJson[]; + beatmapsets: BeatmapsetJson[]; + cursor_string: string | null; + rooms: EndpointRoomJson[]; + type_group: MultiplayerTypeGroup; +} diff --git a/resources/assets/lib/interfaces/season-json.ts b/resources/assets/lib/interfaces/season-json.ts new file mode 100644 index 00000000000..69e78ab3baf --- /dev/null +++ b/resources/assets/lib/interfaces/season-json.ts @@ -0,0 +1,10 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +export default interface SeasonJson { + end_date: string | null; + id: number; + name: string; + room_count: number; + start_date: string | null; +} diff --git a/resources/assets/lib/profile-page/header-links.ts b/resources/assets/lib/profile-page/header-links.ts index a5892479443..eef5b178d35 100644 --- a/resources/assets/lib/profile-page/header-links.ts +++ b/resources/assets/lib/profile-page/header-links.ts @@ -2,8 +2,8 @@ // See the LICENCE file in the repository root for full licence text. import HeaderLink from 'interfaces/header-link'; +import { MultiplayerTypeGroup } from 'interfaces/multiplayer-list-json'; import UserExtendedJson from 'interfaces/user-extended-json'; -import { MultiplayerTypeGroup } from 'interfaces/user-multiplayer-history-json'; import { route } from 'laroute'; import { trans } from 'utils/lang'; diff --git a/resources/assets/lib/register-components.coffee b/resources/assets/lib/register-components.coffee index fd97be535d8..604946b5269 100644 --- a/resources/assets/lib/register-components.coffee +++ b/resources/assets/lib/register-components.coffee @@ -10,9 +10,9 @@ import { CommentsManager } from 'components/comments-manager' import { CountdownTimer } from 'components/countdown-timer' import { LandingNews } from 'components/landing-news' import MainNotificationIcon from 'components/main-notification-icon' -import MultiplayerSelectOptions from 'components/multiplayer-select-options' import QuickSearchButton from 'components/quick-search-button' import RankingFilter from 'components/ranking-filter' +import RankingSelectOptions from 'components/ranking-select-options' import { SpotlightSelectOptions } from 'components/spotlight-select-options' import { UserCard } from 'components/user-card' import { UserCardStore } from 'components/user-card-store' @@ -57,12 +57,12 @@ core.reactTurbolinks.register 'beatmap-discussion-events', (container) -> core.reactTurbolinks.register 'beatmapset-panel', (container) -> createElement BeatmapsetPanel, observable(JSON.parse(container.dataset.beatmapsetPanel)) +core.reactTurbolinks.register 'ranking-select-options', -> + createElement RankingSelectOptions, parseJson('json-ranking-select-options') + core.reactTurbolinks.register 'spotlight-select-options', -> createElement SpotlightSelectOptions, parseJson('json-spotlight-select-options') -core.reactTurbolinks.register 'multiplayer-select-options', -> - createElement MultiplayerSelectOptions, parseJson('json-multiplayer-select-options') - core.reactTurbolinks.register 'comments', (container) -> props = JSON.parse(container.dataset.props) props.component = Comments diff --git a/resources/assets/lib/seasons-show/main.tsx b/resources/assets/lib/seasons-show/main.tsx new file mode 100644 index 00000000000..a620898f96c --- /dev/null +++ b/resources/assets/lib/seasons-show/main.tsx @@ -0,0 +1,80 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import MultiplayerList from 'components/multiplayer-list'; +import RankingSelectOptions from 'components/ranking-select-options'; +import TimeWithTooltip from 'components/time-with-tooltip'; +import SeasonJson from 'interfaces/season-json'; +import { route } from 'laroute'; +import * as React from 'react'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; +import { trans } from 'utils/lang'; + +interface Props { + currentSeason: SeasonJson; + seasons: SeasonJson[]; + store: MultiplayerListStore; +} + +export default function Main(props: Props) { + return ( + <> +
    + +
    + +
    +
    + {props.currentSeason.start_date !== null && +
    +
    + {trans('rankings.spotlight.start_date')} +
    +
    + +
    +
    + } + +
    +
    + {trans('rankings.spotlight.end_date')} +
    +
    + {props.currentSeason.end_date !== null + ? + :
    ---
    + } +
    +
    + +
    +
    + {trans('rankings.seasons.room_count')} +
    +
    + {props.currentSeason.room_count} +
    +
    +
    +
    + +
    + +
    + + ); +} diff --git a/resources/assets/lib/user-multiplayer-index/multiplayer-history-store.ts b/resources/assets/lib/stores/multiplayer-list-store.ts similarity index 86% rename from resources/assets/lib/user-multiplayer-index/multiplayer-history-store.ts rename to resources/assets/lib/stores/multiplayer-list-store.ts index e77d8aa3ac7..49158656e24 100644 --- a/resources/assets/lib/user-multiplayer-index/multiplayer-history-store.ts +++ b/resources/assets/lib/stores/multiplayer-list-store.ts @@ -1,10 +1,10 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. -import UserMultiplayerHistoryJson, { EndpointRoomJson, MultiplayerTypeGroup } from 'interfaces/user-multiplayer-history-json'; +import UserMultiplayerHistoryJson, { EndpointRoomJson, MultiplayerTypeGroup } from 'interfaces/multiplayer-list-json'; import { action, makeObservable, observable } from 'mobx'; -export default class MultiplayerHistoryStore { +export default class MultiplayerListStore { @observable cursorString: string | null = null; @observable rooms: EndpointRoomJson[] = []; @observable typeGroup: MultiplayerTypeGroup = 'realtime'; diff --git a/resources/assets/lib/user-multiplayer-index/main.tsx b/resources/assets/lib/user-multiplayer-index/main.tsx index 14a75d77699..050ab99ce03 100644 --- a/resources/assets/lib/user-multiplayer-index/main.tsx +++ b/resources/assets/lib/user-multiplayer-index/main.tsx @@ -2,21 +2,22 @@ // See the LICENCE file in the repository root for full licence text. import HeaderV4 from 'components/header-v4'; +import MultiplayerList from 'components/multiplayer-list'; import ProfileTournamentBanner from 'components/profile-tournament-banner'; import UserProfileContainer from 'components/user-profile-container'; import UserExtendedJson from 'interfaces/user-extended-json'; +import { route } from 'laroute'; import core from 'osu-core-singleton'; import Badges from 'profile-page/badges'; import Cover from 'profile-page/cover'; import DetailBar from 'profile-page/detail-bar'; import headerLinks from 'profile-page/header-links'; import * as React from 'react'; -import MultiplayerHistory from 'user-multiplayer-index/multiplayer-history'; +import MultiplayerListStore from 'stores/multiplayer-list-store'; import { trans } from 'utils/lang'; -import MultiplayerHistoryStore from './multiplayer-history-store'; interface Props { - store: MultiplayerHistoryStore; + store: MultiplayerListStore; user: UserExtendedJson; } @@ -45,7 +46,10 @@ export default function Main(props: Props) {

    {trans(`users.show.extra.${props.store.typeGroup}.title`)}

    - +
    diff --git a/resources/lang/en/page_title.php b/resources/lang/en/page_title.php index fc9c5afa291..8d627192274 100644 --- a/resources/lang/en/page_title.php +++ b/resources/lang/en/page_title.php @@ -100,6 +100,9 @@ 'scores_controller' => [ '_' => 'performance', ], + 'seasons_controller' => [ + '_' => 'rankings', + ], 'tournaments_controller' => [ '_' => 'tournaments', ], diff --git a/resources/lang/en/rankings.php b/resources/lang/en/rankings.php index f58c07cea7d..5c64e88f3f3 100644 --- a/resources/lang/en/rankings.php +++ b/resources/lang/en/rankings.php @@ -23,6 +23,12 @@ 'multiplayer' => 'multiplayer', 'performance' => 'performance', 'score' => 'score', + 'seasons' => 'seasons', + ], + + 'seasons' => [ + 'ongoing' => 'This season is still ongoing.', + 'room_count' => 'Playlist count', ], 'spotlight' => [ diff --git a/resources/views/multiplayer/rooms/show.blade.php b/resources/views/multiplayer/rooms/show.blade.php index 01cd45e38fa..6a1bb74a29f 100644 --- a/resources/views/multiplayer/rooms/show.blade.php +++ b/resources/views/multiplayer/rooms/show.blade.php @@ -17,7 +17,7 @@ ]) @section('ranking-header') -
    +
    @@ -27,10 +27,11 @@
    - diff --git a/resources/views/rankings/index.blade.php b/resources/views/rankings/index.blade.php index 876037ef5b9..90ddc89bd86 100644 --- a/resources/views/rankings/index.blade.php +++ b/resources/views/rankings/index.blade.php @@ -7,12 +7,15 @@ 'type' => $type, 'mode' => $mode, 'route' => function($routeMode, $routeType) use ($country, $spotlight) { + if ($routeType === 'country') { + return route('rankings', ['mode' => $routeMode, 'type' => $routeType]); + } + if ($routeType === 'multiplayer') { return route('multiplayer.rooms.show', ['room' => 'latest']); } - - if ($routeType === 'country') { - return route('rankings', ['mode' => $routeMode, 'type' => $routeType]); + if ($routeType === 'seasons') { + return route('seasons.show', ['season' => 'latest']); } return trim(route('rankings', [ @@ -25,7 +28,7 @@ ]; $links = []; - foreach (['performance', 'charts', 'score', 'country', 'multiplayer'] as $tab) { + foreach (['performance', 'charts', 'score', 'country', 'multiplayer', 'seasons'] as $tab) { $links[] = [ 'active' => $tab === $type, 'title' => osu_trans("rankings.type.{$tab}"), @@ -43,6 +46,7 @@ $hasMode = $hasMode ?? true; $hasFilter = $hasFilter ?? true; + $hasScores = $hasScores ?? true; @endphp @extends('master', ['titlePrepend' => $titlePrepend ?? osu_trans("rankings.type.{$type}")]) @@ -117,30 +121,31 @@ class="js-react--ranking-filter"
    @endif -
    - @if ($hasPager) - @include('objects._pagination_v2', [ - 'object' => $scores - ->appends(['country' => $country['acronym'] ?? null]) - ->fragment('scores') - ]) - @endif - -
    - @yield('scores') -
    + @if ($hasScores) +
    + @if ($hasPager) + @include('objects._pagination_v2', [ + 'object' => $scores + ->appends(['country' => $country['acronym'] ?? null]) + ->fragment('scores') + ]) + @endif + +
    + @yield('scores') +
    - @yield('ranking-footer') - - @if ($hasPager) - @include('objects._pagination_v2', [ - 'object' => $scores - ->appends(['country' => $country['acronym'] ?? null]) - ->fragment('scores') - ]) - @endif -
    + @yield('ranking-footer') + @if ($hasPager) + @include('objects._pagination_v2', [ + 'object' => $scores + ->appends(['country' => $country['acronym'] ?? null]) + ->fragment('scores') + ]) + @endif +
    + @endif @endsection @section("script") diff --git a/resources/views/seasons/show.blade.php b/resources/views/seasons/show.blade.php new file mode 100644 index 00000000000..52e9294c9b6 --- /dev/null +++ b/resources/views/seasons/show.blade.php @@ -0,0 +1,39 @@ +{{-- + Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. + See the LICENCE file in the repository root for full licence text. +--}} +@php + $mode = default_mode(); +@endphp +@extends('rankings.index', [ + 'country' => null, + 'hasFilter' => false, + 'hasMode' => false, + 'hasPager' => false, + 'hasScores' => false, + 'spotlight' => null, + 'titlePrepend' => osu_trans('rankings.type.seasons').': '.$season->name, + 'type' => 'seasons', +]) + +@section('ranking-header') +
    +@endsection + +@section ("script") + @parent + + + + + + + + @include('layout._react_js', ['src' => 'js/seasons-show.js']) +@endsection diff --git a/routes/web.php b/routes/web.php index 3b983ce0f5d..9724d17a39c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -269,6 +269,8 @@ Route::resource('reports', 'ReportsController', ['only' => ['store']]); + Route::resource('seasons', 'SeasonsController', ['only' => 'show']); + Route::post('session', 'SessionsController@store')->name('login'); Route::delete('session', 'SessionsController@destroy')->name('logout'); diff --git a/tests/Browser/SanityTest.php b/tests/Browser/SanityTest.php index c7729b4ce72..546da2203b9 100644 --- a/tests/Browser/SanityTest.php +++ b/tests/Browser/SanityTest.php @@ -36,6 +36,7 @@ use App\Models\NewsPost; use App\Models\Notification; use App\Models\Score; +use App\Models\Season; use App\Models\Store; use App\Models\Tournament; use App\Models\UpdateStream; @@ -215,6 +216,9 @@ private static function createScaffolding() // dummy for game mode param self::$scaffolding['mode'] = new ScaffoldDummy('osu'); + // factory for /seasons/* + self::$scaffolding['season'] = Season::factory()->create(); + // factory for /home/changelog/* self::$scaffolding['stream'] = factory(UpdateStream::class)->create(); self::$scaffolding['changelog'] = factory(Changelog::class)->create([ From 6717ba9d275861aedcc484b204e59e34e0ecba26 Mon Sep 17 00:00:00 2001 From: Venix <30481900+venix12@users.noreply.github.com> Date: Tue, 10 Jan 2023 15:43:29 +0100 Subject: [PATCH 0402/1261] Delete multiplayer-select-options.tsx --- .../components/multiplayer-select-options.tsx | 60 ------------------- 1 file changed, 60 deletions(-) delete mode 100644 resources/assets/lib/components/multiplayer-select-options.tsx diff --git a/resources/assets/lib/components/multiplayer-select-options.tsx b/resources/assets/lib/components/multiplayer-select-options.tsx deleted file mode 100644 index 6bd02347083..00000000000 --- a/resources/assets/lib/components/multiplayer-select-options.tsx +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. -// See the LICENCE file in the repository root for full licence text. - -import { Option, OptionRenderProps, SelectOptions } from 'components/select-options'; -import { route } from 'laroute'; -import * as React from 'react'; -import { navigate } from 'utils/turbolinks'; - -interface RoomJson { - id: number; - name: string; -} - -interface Props { - currentRoom: RoomJson; - rooms: RoomJson[]; -} - -export default class MultiplayerSelectOptions extends React.PureComponent { - render() { - const options = this.props.rooms.map((room) => ({ - id: room.id, - text: room.name, - })); - - const selected = { - id: this.props.currentRoom.id, - text: this.props.currentRoom.name, - }; - - return ( - - ); - } - - private handleChange = (option: Option) => { - navigate(this.href(option.id)); - }; - - private href(id: number | null) { - return route('multiplayer.rooms.show', { room: id ?? 'latest' }); - } - - private renderOption = (props: OptionRenderProps) => ( - - {props.children} - - ); -} From 1a140cce207d69dd274540187953a25521529732 Mon Sep 17 00:00:00 2001 From: Venix <30481900+venix12@users.noreply.github.com> Date: Tue, 10 Jan 2023 15:44:17 +0100 Subject: [PATCH 0403/1261] Delete user-multiplayer-history-json.ts --- .../user-multiplayer-history-json.ts | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 resources/assets/lib/interfaces/user-multiplayer-history-json.ts diff --git a/resources/assets/lib/interfaces/user-multiplayer-history-json.ts b/resources/assets/lib/interfaces/user-multiplayer-history-json.ts deleted file mode 100644 index 8fbf8e78389..00000000000 --- a/resources/assets/lib/interfaces/user-multiplayer-history-json.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. -// See the LICENCE file in the repository root for full licence text. - -import BeatmapJson from './beatmap-json'; -import BeatmapsetJson from './beatmapset-json'; -import RoomJson from './room-json'; - -export type MultiplayerTypeGroup = 'playlists' | 'realtime'; - -type RoomJsonIncludes = - 'current_playlist_item' | - 'difficulty_range' | - 'host' | - 'playlist_item_stats'; - -export type EndpointRoomJson = RoomJson & Required>; - -export default interface UserMultiplayerHistoryJson { - beatmaps: BeatmapJson[]; - beatmapsets: BeatmapsetJson[]; - cursor_string: string | null; - rooms: EndpointRoomJson[]; - type_group: MultiplayerTypeGroup; -} From 725d100bdf895e4dfe75220d1c1da927ac4d48e1 Mon Sep 17 00:00:00 2001 From: nanaya Date: Wed, 11 Jan 2023 14:06:56 +0900 Subject: [PATCH 0404/1261] Fix beatmap list scrollbar style on chrome --- resources/assets/less/bem/beatmap-list.less | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/assets/less/bem/beatmap-list.less b/resources/assets/less/bem/beatmap-list.less index cb8b0cc4a56..caf159dd809 100644 --- a/resources/assets/less/bem/beatmap-list.less +++ b/resources/assets/less/bem/beatmap-list.less @@ -68,8 +68,6 @@ } &__selector { - .fancy-scrollbar(); - display: flex; flex-direction: column; overflow-y: scroll; @@ -79,6 +77,7 @@ &__selector-container { .default-box-shadow(); .default-border-radius(); + .fancy-scrollbar(); background-color: @osu-colour-b5; position: absolute; top: 100%; From 8428610dbd9b1b4bc6c5241abe23adb2dd3f6fa4 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 11 Jan 2023 15:13:19 +0900 Subject: [PATCH 0405/1261] document more missing chat events --- app/Http/Controllers/Chat/ChatController.php | 18 ++++++++++++++ resources/views/docs/_using_chat.md | 12 +++++++++ resources/views/docs/_websocket_events.md | 26 ++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/app/Http/Controllers/Chat/ChatController.php b/app/Http/Controllers/Chat/ChatController.php index 20d5cd18737..8062773c522 100644 --- a/app/Http/Controllers/Chat/ChatController.php +++ b/app/Http/Controllers/Chat/ChatController.php @@ -28,6 +28,24 @@ public function __construct() parent::__construct(); } + /** + * Chat Keepalive + * + * Request periodically to reset chat activity timeout. Also returns an updated list of recent silences. + * + * See [Public channels and activity timeout](#public-channels-and-activity-timeout) + * + * --- + * + * ### Response Format + * + * Field | Type + * ---------------- | ----------------- + * silences | [UserSilence](#usersilence)[]? + * + * @queryParam history_since integer [UserSilence](#usersilence)s after the specified id to return. + * @queryParam since integer required Messages after the specified `message_id` to return. + */ public function ack() { Chat::ack(auth()->user()); diff --git a/resources/views/docs/_using_chat.md b/resources/views/docs/_using_chat.md index 5f9f12b4b75..bc070e6137a 100644 --- a/resources/views/docs/_using_chat.md +++ b/resources/views/docs/_using_chat.md @@ -12,6 +12,18 @@ Sending messages is still performed through the HTTP-based API. It is up to the client to handle this. +To begin receiving chat messages, clients should send the [chat.start](#chatstart) event across the socket connection. +To stop receiving chat messages, send [chat.end](#chatend). + +## Public channels and activity timeout + +To continue receiving chat messages in [PUBLIC](#channeltype) channels, +clients must peridiocally request the [Chat Keepalive](#chat-keepalive) endpoint to remain active; +30 seconds is a reasonable interval. +When a client is no longer considered active, the server will stop sending messages in public channels to the client. + +Private messages are not affected by this activity timeout. + ## Getting the user's channel list TODO: update default parameter diff --git a/resources/views/docs/_websocket_events.md b/resources/views/docs/_websocket_events.md index 8cb615d3137..4a25a5f892c 100644 --- a/resources/views/docs/_websocket_events.md +++ b/resources/views/docs/_websocket_events.md @@ -1,6 +1,20 @@ # Websocket Events +Websocket events generally have the following standard format: + +```json +{ + "data": {}, + "event": "some.event" +} +``` + +Field | Type | Description +----- |-------- | ------------- +event | string | Name of the event +data | object? | Event payload + ## `logout` event User session using same authentication key has been logged out (not yet implemented for OAuth authentication). @@ -18,6 +32,10 @@ See [Notification](#notification) object for notification types. Sent when a notification has been read. + + TODO: `ids` should be moved to `data` to match other events. Field | Type | Description @@ -41,6 +59,10 @@ Broadcast to the user when the user leaves a chat channel. [ChatChannel](#chat-channel) with `current_user_attributes`, `last_message_id`, `users` additional attributes. +## chat.end + +Send to the websocket to stop receiving chat messages. + ## chat.message.new Sent to the user when the user receives a chat message. @@ -56,3 +78,7 @@ Messages intented for a user are always sent even if the user does not currently Such messages include PM and Announcement messages. Other messages, e.g. public channel messages are not sent if the user is no longer present in the channel. + +## chat.start + +Send to the websocket to start receiving chat messages. From 06de7ab0ca2d901ccfcc5bf41b1a15569699d12b Mon Sep 17 00:00:00 2001 From: nanaya Date: Wed, 11 Jan 2023 17:57:53 +0900 Subject: [PATCH 0406/1261] Add classic mod icon --- public/images/badges/mods/mod_classic.png | Bin 0 -> 2466 bytes public/images/badges/mods/mod_classic@2x.png | Bin 0 -> 4163 bytes resources/assets/less/bem/mod.less | 1 + 3 files changed, 1 insertion(+) create mode 100644 public/images/badges/mods/mod_classic.png create mode 100644 public/images/badges/mods/mod_classic@2x.png diff --git a/public/images/badges/mods/mod_classic.png b/public/images/badges/mods/mod_classic.png new file mode 100644 index 0000000000000000000000000000000000000000..bd24385639365601cd8ee0a8c5ce426a4a7e7dfd GIT binary patch literal 2466 zcmaJ@c{r4N8=gK)CrcgKQ%r*>nZ-6tMi(`c3BJ6bV^6raxSt&w&NR}biO~nzW2J`_qW~m{XEa_x&L^t*xOo4iSH8!fk0A( z6F3Lqs3UwKKY@kc*voS`;h@C9yKx*D-ke|(3jmo>80P>8fkyHH8~_sKLSQFg0s@IZ zs7`JiHydj-nL&e*wlFX*jVWYK|8_mT)zv`le^Q~<-6!I0q@y9^_ zPRh;39)e}C0Eht$p+iO(A|QrH7*bCkg+d*L=pv8^I6@bW)YUHpf0saGewU@Qzg?5?!r)vI6OM!-wo2Lt+SvSmD2?_V z&E_}&|K$5Wh1pIQm;l@XU^9YPWMSjH)wV)0(O4Eh;xJfF3`W5AE!z7sI1IKgg9*Vp z8bDmBbP6Mw{S|FvgC@|~91@)j5O5f%kPo9$DQKL5u^AF;ZfJ}&!Xc4(oSCk%p}Cn6 z0*gagpzs!`Z7z;M4x#~c&Ni3w4;S@A?v@c~Okrdkz@nZ9C>AUR4f3^MH1)^1=>Jgf z8<+CqTnv85g$t8`Z?*Nm+Pu9b^v>4wyJ>}s@3sf%La(!grvChAg&qh5RwUreoVbFP zbbo7ESK0Q>GQAp!HIS(2*%SCvzqa}fSu_c7x#a}c*Da5chWdy6GW1uo`{0HHgLxGM z)q&wWzjC7L6mMVIp~vzvjw5*KA{TA>8&TSjn3y+!YMEZ$#7uO|>GL~9LOLiuvu~@G z+i$ZsCo+ZSJuNGXV-;e`I_~!o`Pr8Zt|&&Ngr6C#sxBF!SI*YP$i1c9j-fR4;Gg@x z&WMts9_nr;>n2JJE#(G1^+%MaggeW89?-aOrs1Va$y(sQQhqs_UKs$)?a|-#3I|6I z*SYWotTr!=I~NnWq7%kdui2d(Opg=yrz%zK0ibebPd*%*Oky;up`d&;w%DozS8XJ% zwCdxPl#h%|)laZo$XYANDU{lIn;1qU9`o3^Pk~ivELM4`$qw~_@-1GYMR@N%sl<6a zv=TojuSvERh*Oli^e>InU+Y;b7S9^6NT8|S7d1cJD_{HRS&J%OntBCXJyfQ&C+vJh z$a}BBvD|@$0~w)-5dQj$36Ci0WSB_Kjoy(Rbz-F#1)YC2UHx=qH|3+1`*EzpWVdHG zwV`5>sk{`V=|OGI*Z4Ryhv)j2T=Kg;t;kP_zB|=6pO$Ewla;W)8CsEp@1NGi@=v0s z9TRtNx^u)}mTSbj_mHjgJJg$!Woz%M>^z^j*RaGR66$+e>BEZli>nQq&qs+9VDPh7 z#R)E9=BxXb1Pbb6lalL~LhsZKOq4AyD1Hf*gcdCBOq|^XL+_b_*0_QT;{vm7*4Ix( zSw0L5++U)}O*}2N;cT{PlJ9OBYsP!p5G+o-b!l<>7EGSsQHv~uE(X{KY2HqH5)Uus?+=lD+nbI& z{)pJ})TWklxKQCieV3vye5dQXv1O5jb>sFY@gr+#yT=WO4o_&9j$XSTx44@5ak*W7 z)LEzByCD97%fV8~zPSX2YVU(1Pcmusrv@T(-UKJNd-*AdIsR@0CdsO-+OdPAMUi(U zKT36U%b%I^3<|(lKK1U(iXS3w@LaCIXbilfejSov*Q7Pxq|7NP!awI`E{NA3T1Eh4 zIb5UWlCDkJhkbrgn4bgnqUjv1R>#vBZBp!vp9FlZ=3B???UUTT&btM_g-b%%_6|EZZ?skh#O)?nb=cL6 zO&`Vv<}so}75ct#8~XuL*s5}YEcPI5RDx}hq9%TZrC?kAETd9Z;igxq%OtoDbu`Pg z#W@O^l|(JJ?Qd^7|46cUpiIJch3JILPagry^0lVE_*~B|6gbxN-n>oByZ7jdC^h-L zc@6D_C$H|BT)MXoNj=$n34H6+?AuO}Soh2pQ?~h$roEAgo_)V(GqSAA!Mqm9jc%v3 zs$1N6?QR9vs!u~Rtp^&G+uHt|Vq2G$i~1EsfJMmjt$a15JFe7A$GE(+gDTVL)H}9@ zjM2~Mj+CiR8igrLM|fA#9%=Ay@V&eH)n;GWz$;aHZe0u{zR9z!?+hQ(7`d*!SAD$3 z1^mkcxLsAXw7-Ab#(}hzA`xG;$dA`CBGTZ3{`Q{6&T_eF9=%DXG&(fmHB08{Qe3#Z zZO}}U#tjTJXIvkK+2xhN8&5ouIo!N2`Q~_6wL&FoJtnq&m-WIxt$rkKG?sPK^796F zeB^GK{n~hx23eu>2x(UU)xEI=!@K1*Gd~?I1^NEYg)v zvz#1E-EE;&5YhNB@^H3ReZ?^q literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/mod_classic@2x.png b/public/images/badges/mods/mod_classic@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba2d1d442d54949474cd0c68ddb13061c8293e7 GIT binary patch literal 4163 zcmaJ^cT`hZzYRr22qo0eBcWJ;6lx;9qx7OQm4qZDlq7~ARj>dCrHLpchzLqYq)St& zB4q?Y=|!5Lfbxlei0BJ5<9zRrH}9@>?}P);>rMo*2T8iQ8{L^gpod^+cz`jEg2h9u12MjMCp-ohcD@U*2LNzENG@)4 zH(MLD4<%3?vxiX+4WzQ!0DzuhC>7)5kEcVhcwZ7(U*U7(a|H+qr>}5Y%NA}+HN_K2 zR^c?fbGV(0Pq@Di3a4Ob0MQFYvjqb2bPOakFn}C{4%JuqQy0yi?`^{rAb&#W{`v}k zCFN%805PS|@DMF^xS9`K8xGM%s3SBqb#!!8AxJm^4ud0M2&5W92d#lb!{Ly>9|d+a z8jgT=GPC$Q7JH?yK%~>DXc#OcBt$(#L!CnNg&|NV)Sd~>hQgiegkc7|9@y; z;6Lafx)c7t`Tn26K`vobJj@9nLfOLNEh%p3mPR5@@K(l z(!b`SY4NXme{*sFo(ue6xiEGzu)SmbU&s7=i|w7g=|84rFaEJTp3L?-jcsa!q1s;n z0I=TL%-AJ#Z2oQ-)n!Ar`T6J7rzoD36eG@qLb*a$jC3D%Ba9AO^26PZ+<(;Vm|x@E z`HHCKobLzPE!YGfIDTJrK?r!Ac+i-~;UPq5p4a=5k%@59L>D2XYIu2Tr)NKB)03T~ z$&`oFOr4$7$%~)23_kBX8~(iGDPRJfxMCUeaNcr8;*M1YLDO`9pDB>8@SpAbuNGo7 z1f(OKBL#*ijjgWlp6~m^yE-bm$!_T@^TVz!W0a6qdBL!H54HO> zfcK96mI88IC}j;rQ;9T!N}9M_Y`rJ!e1TQhxCq=3<_^w6Nz#JDmjuqZHOUpiUS2C* zRhl@jmGTzw9yvq%ykgFkocX936jPQnD@-j?{nXUgETRn)Al1kRu>c>7<+dw4iw0kDF#0{GY1&-=Vl{?_s$; z6Hm_x&^XZh$BIwJ9d2`2%8v&2HuO(#dFGXG!@?%`>Xvy`yrWXBGj!(`%VFFCsqvTW z&ph2xbkSafj#Rx9xywrG46aU)#iFLBNGrY)q z4UT=8*1E9yc4kf*y4=rQ+gdLha4)x9Z|u~W=%v7WeEJDBxfXKGr!Gq|L}_cNQrqm_mQDe0H zW8qD-_x2t6y5MFzup8`AiouVm#BUb(}Ib2XmUn1iV#c}sV1CG~mz~|c2 zw~r2U)L|n8Sxu+MU=v>^+cU!$%w(&JtbCu2c4NYa(R=d4CT03*m-y|ICpQYtTElHW za^YVk5)Csy$8&z1+!qMpb9g@j9G1<#&k=N_NtKQVqn7G{$o|tGj#1lS%Euaxhc^+lQ?{u)}Hp}lNxOTO@d{q)%Bi8}QoI=+z5GVpYE={$BC|T-|cKcz6a>%}nlUEbZb6sn> zP9>3H&f;f(v^proqz;VhWp>P8e&vikcR-HL@{0k3junYmaSYkZJ}2gl@>a|=tnKe3 ziF3RZd*UFdlXdPv;BKl|beh#&($TL~&mh|d9jj@M#UQL%DTC?NJOQrDdac7Re$Bb+ z?v%6xE<##Aswkn`Lqt^Tr=-skKlmgi=0@T%(22y{^^Q!!eduod{Lbw^BHZGNEEr-4 zkwGk?IX}K?_LNVrKQJWD-0^_1Kz^4C#(#%-CuOB>c3sI`yyBaO-gjz?+M;@Jl9)S4 zLtKKJqt{Rj)|;>j&8mp?So)7D`Fp3n`@7v)kd%4#Sk5;u8H0}9Qdp&ML52g`Hs2~y zNCO*UI2iGh5rY6hm0SF3Vl8WC*UonGmAHb-N`jJHZln~Kh4qWRt$XHrQMNq^e1c=> z7ri|MW^Q)1*v~3P-F2h6w}Bf@UDa6^O|Eq-7I&OO=X$s^WDx<&YaStW^pQzv)1=dH z1<<1n+|2?}o=09r5lIaNj~7sPAl2#BLntY|MY+(vPih41doS{k0TEieJCo9U81%xj z$uaM?hw<(daKgt3$%IJzJL9*i9CA5U57s{Vs%a~_Z$)IHl!`+ZbJ+mn@iWG5cIt7I z*HcfASQnKa7Ue3qE@6DDQD5~CKe_0Y{$UUQx9zDJ!k(O^eZ3i90wQAYveq_{GUS88 zc28_FQxElkJ~&%pHn>L;4!yvAdoE%}+Z=raj|ZvkQ*05%p1h=X69F%*nwdde+AH>~aMeqnV^bf+cFmlR(bNCIYTxSKJC z={>UJE~ero=VOj)Z)t3RyoX1jQ*-?-u^u^2r6#! zW3FlG(DoEJVP|a5&M}R|;POT6r#sz`vXle_aO%ZgJ6Db$idTmYxjsC7E?g;Yul?gg zp)urzRgsj+nNvs7LgZe~zHb$3j~ml7EVn%ok=WEwe->*AjL*ydkaa1!x~}WMX6j^E z{jU`p$ul?V-7XZ6Vpn`qw|zOD2MunES>1Mt07pLzS7rNBxMxVDI&rE?{B-s;W+QJh zZ`GiDx?km|43>?oiDtat>kWQzrxSnO&_x>sy&I?a>(&m73LVET`5s|a_S;~?evXQL zZal-gV=7!Yq77?OGSexCp5a9Ft4|eXJu5ItWmyDZO%oWdo}Cwx=h9@P z4ti}iN z$jy;aX$@Bwl?v{vWvN-z54V6bu3E$KRZ5i}G5HZ> zoke6-f8|$g2cSMkchTZG&A2FM12;=+Tl? zv%FEy7QK3KXm@Gxr zA(lTW>t^LsnpVa(U}C=>M{DNj$r+N`rPZkthY_KsFvd!*d3q}WdAL^VfyhA6`F3|L`pnBC%4S`=J){|3?YH0n=YX1?fRM7-yKT*m_EZG7J2%wV?+yV# z$-2@xWLJpRM=6WDNSyp5QX%tbNcgcUEMZPd&*iluXzF^OBHtBD?cNtr3u6?q8$&ZSb)DQjlgc61OeVsKHB#p^r=9%*o&v+$ZG|i+3Bm*k*W>TznACwYo zN|+|_KIQopx1Ce`k-?%{{>JYop3P=!G^+*L<*p5%*T6Ux8fk{}=J3|kzuMK0bLVFz znJ+UR@VB{1-Z~nPwI)3t zqz9W9Gj}-OMA(_$TI3xJ@BoN>BbAq*JzGKsT#>!rDOnsg;M803T5GW8zzwNtKX?gn zc1TBZin;sa%J5XRg$XwuQ!#%3!#U5XGwz(ve+mC;65x$?vap>ssx7FO+Z^&b?t551 zMHi!JQhUL??yXKv_~52%$%%J@VJ_hg#ZT|I7&(SovNB~3La!ww#Z>Rr3cXnVI);3j zq;OU+bSogvRE4EsSlwdXz3f?VIdXMhofs0OfBm9UcgpP@06eOLimhUF`vnq31_H*q3-)`Cwu{9Da9&&*kd3>x&K z_I7pJcge%#(#>H>y|t7m4@Y2i$8$;7v8`)#fc0%*sr>ulx`D(?oCp literal 0 HcmV?d00001 diff --git a/resources/assets/less/bem/mod.less b/resources/assets/less/bem/mod.less index ffc11380ed5..73054ec2b2c 100644 --- a/resources/assets/less/bem/mod.less +++ b/resources/assets/less/bem/mod.less @@ -21,6 +21,7 @@ .all(8K, '8K'); .all(9K, '9K'); .all(AP, 'autopilot'); + .all(CL, 'classic'); .all(DT, 'double-time'); .all(EZ, 'easy'); .all(FI, 'fader'); From 62595d1978039d2620db681ca2fe9dce40d37081 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 11 Jan 2023 18:02:15 +0900 Subject: [PATCH 0407/1261] set min-height on entire section instead. scroll position pinning has issues if the page shrinks after a load; we can't reliably tell if the scroll position moved up from a user scroll or load to handle it effectively. Also move the flex gap to stop kudosu box from shrinking from negative margin. --- resources/assets/less/bem/kudosu-box.less | 2 +- resources/assets/less/bem/lazy-load.less | 8 ++++---- resources/assets/less/bem/value-display.less | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/assets/less/bem/kudosu-box.less b/resources/assets/less/bem/kudosu-box.less index 463d65b8f6c..8f844828248 100644 --- a/resources/assets/less/bem/kudosu-box.less +++ b/resources/assets/less/bem/kudosu-box.less @@ -2,6 +2,6 @@ // See the LICENCE file in the repository root for full licence text. .kudosu-box { - margin: -4px; display: flex; + gap: 4px; } diff --git a/resources/assets/less/bem/lazy-load.less b/resources/assets/less/bem/lazy-load.less index a4203ae8673..66c59c442f0 100644 --- a/resources/assets/less/bem/lazy-load.less +++ b/resources/assets/less/bem/lazy-load.less @@ -2,14 +2,14 @@ // See the LICENCE file in the repository root for full licence text. .lazy-load { + // TODO: need better min-height for different sections? + // most extra pages will be larger than this unless they have less than the default number of items. + min-height: 150px; // excludes the non-lazy-loaded part (e.g. headers) + &--loading { display: flex; align-items: center; justify-content: center; - // TODO: need better min-height for different sections? - // most extra pages will be larger than this unless they have less than the default number of items. - // TODO: define min-height for the extra page itself instead of just the lazy-load part. - min-height: 150px; // excludes the non-lazy-loaded part (e.g. headers) } &__button { diff --git a/resources/assets/less/bem/value-display.less b/resources/assets/less/bem/value-display.less index 60d2487ed06..29090d9247d 100644 --- a/resources/assets/less/bem/value-display.less +++ b/resources/assets/less/bem/value-display.less @@ -26,7 +26,6 @@ --value-font-size-desktop: @font-size--large-3; --value-font-size: @font-size--large-3; - padding: 4px; flex: 1; &::before { From b4bbc5d99cc8b7325a2c62c6381810bb22067a74 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 11 Jan 2023 20:02:03 +0900 Subject: [PATCH 0408/1261] missing space --- resources/assets/lib/profile-page/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/lib/profile-page/main.tsx b/resources/assets/lib/profile-page/main.tsx index 79f92fe563d..753900d3f9b 100644 --- a/resources/assets/lib/profile-page/main.tsx +++ b/resources/assets/lib/profile-page/main.tsx @@ -1,7 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. -import LazyLoadContext, { Props as ContextProps, Snapshot} from 'components/lazy-load-context'; +import LazyLoadContext, { Props as ContextProps, Snapshot } from 'components/lazy-load-context'; import UserProfileContainer from 'components/user-profile-container'; import { ProfileExtraPage } from 'interfaces/user-extended-json'; import { pull, last, first, throttle, debounce } from 'lodash'; From 7ad99cda507d4c54e142f3a1087a055beb3d6db1 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Wed, 11 Jan 2023 20:19:35 +0900 Subject: [PATCH 0409/1261] workaround for element shrinking in Safari... --- resources/assets/less/bem/lazy-load.less | 14 ++++++++------ resources/assets/lib/components/lazy-load.tsx | 8 +++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/resources/assets/less/bem/lazy-load.less b/resources/assets/less/bem/lazy-load.less index 66c59c442f0..8600a1f38ec 100644 --- a/resources/assets/less/bem/lazy-load.less +++ b/resources/assets/less/bem/lazy-load.less @@ -2,20 +2,22 @@ // See the LICENCE file in the repository root for full licence text. .lazy-load { + display: flex; // TODO: need better min-height for different sections? // most extra pages will be larger than this unless they have less than the default number of items. min-height: 150px; // excludes the non-lazy-loaded part (e.g. headers) - - &--loading { - display: flex; - align-items: center; - justify-content: center; - } + align-items: center; + justify-content: center; &__button { text-align: center; } + // workaround wrapper for Safari making consecutive blocks smaller than they should be. + &__content { + flex: 1; + } + &__error { display: flex; flex-direction: column; diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index b5fcf81c5d2..4204c139ce7 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -103,7 +103,13 @@ export default class LazyLoad extends React.Component + {this.props.children} +
    + ); } private renderNotLoaded() { From 28d2f7783480414805c609762606c9e907cc4d1d Mon Sep 17 00:00:00 2001 From: nanaya Date: Wed, 11 Jan 2023 21:41:05 +0900 Subject: [PATCH 0410/1261] Support generic mod icon --- .../images/badges/mods/blanks/Automation.png | Bin 0 -> 1751 bytes .../badges/mods/blanks/Automation@2x.png | Bin 0 -> 2571 bytes .../images/badges/mods/blanks/Conversion.png | Bin 0 -> 1645 bytes .../badges/mods/blanks/Conversion@2x.png | Bin 0 -> 2438 bytes .../badges/mods/blanks/DifficultyIncrease.png | Bin 0 -> 1742 bytes .../mods/blanks/DifficultyIncrease@2x.png | Bin 0 -> 2558 bytes .../mods/blanks/DifficultyReduction.png | Bin 0 -> 1668 bytes .../mods/blanks/DifficultyReduction@2x.png | Bin 0 -> 2493 bytes public/images/badges/mods/blanks/Fun.png | Bin 0 -> 1650 bytes public/images/badges/mods/blanks/Fun@2x.png | Bin 0 -> 2434 bytes resources/assets/less/bem/mod.less | 48 ++++++++++++++++++ resources/assets/less/functions.less | 6 +++ .../assets/lib/cli/mod-names-generator.js | 18 +++++-- resources/assets/lib/components/mod.tsx | 13 +++-- resources/assets/lib/globals.d.ts | 4 +- resources/assets/lib/interfaces/mod-json.ts | 8 +++ resources/assets/lib/utils/score-helper.ts | 5 -- 17 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 public/images/badges/mods/blanks/Automation.png create mode 100644 public/images/badges/mods/blanks/Automation@2x.png create mode 100644 public/images/badges/mods/blanks/Conversion.png create mode 100644 public/images/badges/mods/blanks/Conversion@2x.png create mode 100644 public/images/badges/mods/blanks/DifficultyIncrease.png create mode 100644 public/images/badges/mods/blanks/DifficultyIncrease@2x.png create mode 100644 public/images/badges/mods/blanks/DifficultyReduction.png create mode 100644 public/images/badges/mods/blanks/DifficultyReduction@2x.png create mode 100644 public/images/badges/mods/blanks/Fun.png create mode 100644 public/images/badges/mods/blanks/Fun@2x.png create mode 100644 resources/assets/lib/interfaces/mod-json.ts diff --git a/public/images/badges/mods/blanks/Automation.png b/public/images/badges/mods/blanks/Automation.png new file mode 100644 index 0000000000000000000000000000000000000000..90238116772e1bebd8a1996fc3dc7cf9e0464d88 GIT binary patch literal 1751 zcmaJ?c~BEq9FBtpR6rTIkGfqs1kAA{fh6ThSP;~3B#4M-NEWhUvN2g8Tq1`kVpY_7 zQ7kE=hyq%`GKgTcwW3n4Sfmu8Eebd&9xx~>LpLbcKT3CI_r3R<@B4n|o6QRgS!KM? zW+910G7b)c1;k1wUcgYF_~z!kgo(u(4~W8rSS+3-QX(X-1dBm{V3{Zm5g;N-^3FSm z7m1_?pb=4c6n`y8jL9e>9fqQoDF`-+DCVp2?^2 z75<164N6fW!jzB*aZ0?HEdhOf053I%5Rf6b2vEy*$Wt%1&2yaN=l+6(J7cRjta5aY@LR?JDEU`RmpN(q$bN%%V!i|L?u?D z3LM4cfKE{qgC*eJAQ9<@6l987S-I+CnTUc>)glEIqR@0H%>eoQ|A)$CvuG7AKt9F$ zpTeq$WCcPMASx_DDJB{hyIki=!SPojA{i4a0_#z^1WQs) zqxpPJuv~?UU6My^mbU+_A9c=f*`Xy4vty6QiCI??LycY%5jRbb9}IIN)ZO>Hwgw5qtw=9awGZp3v}9(P zoyhf~U$(n8%_S%2*lJ4@HXDoNb^15VpG;j+c9^%UJj_UYb9I}6TZ*aM8dr0^uw+xD z`0Rk7v~XlRy+5S0yJ7N++WN<fbdlS`JmGwtDwznlNy(%MlT@WP;IUy;P0$()SLI zQ@#T|l)>VA(7NA*854K&?`r8hOCfLYhi@wK4z_kbT#1;KIRrtT!$Vfv>rOpP8EIqL zRb^Hd81{tP(p9e63w}9#=j*bU8%HmGpV1iqrtQdPrhT2VXqUkPF0H$1)6;KTEnnPz zY+GIP_6^g~At!UPq(8L1s`;q-D#^liycO+TzMRWXGFmd6iaqQbmRO!>e5UVM;2N|q zJAAm4etKVb!MH)9rr_Mts@G=*L5zH`cP8`;$%MoCC>!?H=ct zKC4Oety^XyjgPbC6h+OKn!g=NNF5pTY)Z(rYCl+&-kj*xCplw1)seUS+3sAVxNhL; z$yL_rL-3{Ao({iCiq!5xM@7_?$Q|3>HT}{1wrGKY=63`3lgR^L0=|inCyrIiYd1#F z_0?^Ad|K)*kDuIY_Z+*{89R(-I5;sAmr&>?&EG!D-8;v{)+o^bRG28JC*%*q_fXQ*1c@BTblgp>>TbzH6%UmS#hv za#85o8+)F=8`)f8^mv7MYRK=<)H&lmlcP2rlFDIMPY0*c&uqOsx+cptw8u2YJ9f=B zW=LA>(d76C{h}y!DL0^ev4y&0d-CfSITOdk&EqyE&Oy5?ARoq-p)A|dKE}H19Y5P3 z`G{20zu))rdcWVF_viA*FWG;Gr>2^*8VCf^ z^!6eK%2%rV-L^(q{;jfqCXg>+A&Dxa@K{0-oezNAn7nWR;?1G&0|Eg$GxlI7-~<9G zK-fW4A(iZlXYe=(`Z5L~=0wTaAdr)bIEv1Q0ECcmU>}?744rOlfkN0!XXq|FGKw5U z0QR%J;`jh1ZbuL!E`s5}gt}~lIEnFc0S+LfL&Tg&t^hA~hJMw>%lFIINGRkhL>S== z{l^rQ><=OE_yEKXfr2woSQG?{MxbqMaX1_dfy zlZ6i?dVGr|KRHA93x!d5BvK?2Aw)I^9)BMa?cm_BtbxJ6A~l5AYT*4vw!S`_(Q#K zT;>nG*phz8Mas<}m)rVZZC<&O&(8Ap`_Re{-^U){%4eM~AL^pf=tU4nInkTw79{SU zd=?)`2{u*v>+|dQ=}L`un#pN}4&^(pByUJh!k?~se`qNBYPe|^BnNy6fNu45E3|9? zp%W5JPT6EDzS@*FmOf(yfQRYr%GMQy0Ao*M%wci!b2zy0Id?#v`DWf?%Vd3{`B-nQ z;OM8pyqYt%^nDx`9K`8}^iXJNPFtrQ7}i0uakfNUs%>Ro8#jIQXo>u|94EuZ7j4i| z(bS!kQI5{pSR9#qa$i5^l#)hwSN7n#3*~oN+T^z5XCS9~zyT-js;Krf-57b5)v(FzQ?=>FTeB}4a#K8plWIDX1fCa^ zB|S>-O3s8WP+GD)d)4C|FE`ejZcJ(}xSyzT$2DQZd$?xTj2dv%f+&&Sz5cwUJQ_MT zBdwiyGG}VhCfQavEz6l#ub523#$_n>dH$RWKi+ITZHRIycg6W>Z^-C8zW;&9Na}8z z^F)N?jPB`grLYX6Zonj}L!hVqw8iVPMeo{lGb%P*c5>s4TJUP!mx-%jG^jqxaj2JE zI<%B(h_-zzU2PGbLJCjNSIEzo9CNDF0kg#5YF{5Y*hnw}-fg|l~N^>qvA#lQvoVsk8NqRjaH2Svy5L6w0Pl`BLOje@Rh3LwR%+JpmlNw8nrF;zfBt@rF zD`tqhC;fmak`kzsoH#&^6=gqSv9SR<>|wN0b!}ZMmEc`;mNubSJ+(8KWMzIHD=F2K zX1-hOBOxvoo~`lHrQX!52XUJ|-f!+c@lIF8@~my5xi4Lv=EyE#SR0N#t;}R~>4wnO z_+*9aN~uR52y5R7fe*hGOr={kNY`bek}AhG=*Z5#(k~mT6$Ou#Glq4oGQM2N(x_`; zZW*(Wti;#Enn?4yGmLJ-UnNhxZ>b9NEL|?=8lTqLyvAP}o}*{`!mJ;WwBnr7Qj`4% zee)E@Q13lnM=JCZ!1t5e_ZH?}?WdSzRz~9|W4bI5)e`WeBB9+7m1$+Sc#Zct*#z+X z|MspO<68#=U#}Y@H@4ag#5s1)=t%zqH zs*P*U&_+s)@h;PEbo<3ll3`%HC~}}=yw@cuaL`21BvZ5M9zEyK@Qm{5G`LmNg{@(b z=Tq!r(;vpu6be&-Y$~lSvA3z_?Dfy&3qtes_iv?&*qc^YZatokzIOcA4BNx(!H$SK zjzD3Bs0(A_OEWV`<^~c(*OD<>bHvw%n}FAku2Hi|6l$3P*M1 zW>Ys>S6eAlCj)oiSodf&w3oBQf}6EoQ2HQkINltl3nPN(YWoNG)@K+V`XV|^8vo6| zmz4ker?*`-v;^nJRCzEBLW8q%h7(9RmYbfO9*`}m* z#(%hkncC^oJyZ2!X>#Jq^OKz=iR_k>u`d#w>#p>Pht8B1zdgWlADs)p6#sh{V&~OC zEcoZDkebDpm&x%-*B?(zNBp%)_9E+8PrJ{)H|1*$GH*L!U|8s;SV%WNgqINQuzu}f z_RLVz^!+=1`LJ!TuS67xKHmysg6TRo#BY`lf19Qmi!0_wm7_75_@!3{SZ#ei)wpF+N_cWb9CE zs*k;Ogm#%?Pn}1}l5y3=Sg)|k*P6TGwxo5v_ivphxYn1}rEUg2UZfl}+j6`T%-s?Mkn;b(CORq)b6-d(f`5SK5Qtg5bs? zBNYfvg@I)}6b(N1kQl`&BNoWiVFh%;B)Ccn<4BDW_h)ONj^ts(N(0~{NK3m6bg1=tMPMhj%)5~p+_eDAxa5`ifQ zrsoo0CZ&`n0Rq&F04xfPtfs}#fEbVhGMKTkvC#mX2GXcBIu)do!B~hvhiEil`XS=c z%$iI{28*U+;U_Lpi(w{+O0`<86f1**nzN`No6YuV(CK6xLALBLVk#TiXd%rgz=%a{ z)|oIJY6N_Ws_kel#wFsJzAV9Dnw2$LrrU%!jA~Pvs33*rD`^HOmHt1}V3pAg88v*kWU9eAuq58)9 zuQAVD;ok9WXHAPAW^Iocaj%j`fey`Q4xP1Ap1^oTe>RUT50{=e_@)~ovZ+0zXrF|?YCv0yHf^7G%3>pW!W#p z3{p%{!q3of&KkWze(dZi|6p%H_xR(x+^hL@8%oHHZ;ZpHfro{z&g)p%Xz%2SmGY9-b(`}WmIU2AtPIY$6?13Q)bx?$d4wcSnqD)u zqDOb*#n3`VLMF4-x;dCu)S{O)j8jrcgB^5?_*%~Q^UEgW6MGA_{HqsgGM~Qf=y;B0 zhdGOW>G$aK9VSk#cH~HL-3fPF#FQOIt$({%6g1+wW@8}!q z&pVUM{Nk{fxACu0GiP$iHc?4d+RA=zNJVFUYL(zU;i!g@N<6?C+&^z5kagjB`@C;P zT+gm7a7O1;IvZo75;-=Dmvry-@Uwm2#+&-cQTgQ_PZePS;eIQDG_MH|guF z(t*KX`d*%-0Od+kz8e>6E5GL)`a$Kg5+c)}Kz=k7PZt6(Hzq#{fO~Q2EFb`&Gk0vi z4LHGI8gLGk2GJ;+2@F0LO;=&iVy-~RhQXX%!~!}a27usE0E@$OMoiT;BH$dRGa}fQ zf~5$E0Gs2PAOr#ve5s6t7=|Mg;j$6#Bqk^YxBx_li@C8pkRWzOe992oex5nE3d3bi6g1FJxhGj*gBh4LlyDM4-SOJcuqv@j&Ff z0to;aLXH69@Of~RB0Y*Pf}9b`O8;(wEBGeM1HWFA^1?7;x&VViV^uB911XgM59M;d zp+P7B_^00gDGX9~2mnj~0P;mbhH`MxNL4BUfhYv%5MM~;^JC|4(VxwS_#m4vfD;34 z;lUgplOGR$K~pFMFCGZdc?`gdXc(i`tT}X;fV^?Uv78gd%c}TA`x9r!p+KBfjV^PEk`|?^IjN7v|K29V_zl>zEq= z6VGZhWT^ZJKi~Y6;G%RI6NI-iuL<-{LZXtZinPPU(GzpyHXA?B$byi?GdJ~?kB>ji zn?nkX|J*a|MMJL%!#Q+!36>Y`8c4tBo!s~6g6mE7*kz@0qt~ln9v_ex=v|XvEE#K~ zI|Yi}He7YvX)mF4l+UsNjBED8l%*@0Uy5WGl3cbatZGUV4p9;Yb7L==<`p0OanFy( zmL{9rXsGH)&@NjOIqnqvK4Fvk4W#ci)lnv{OTBPZG3O^uUgEQaML+TI9lKqoRqIlm z^;Vl|s(~w*sGIXuD~?`#e;4|`?Tfz-vpXiod0R+ z!V&)d+dH@Yp>c1wkqu6V*6K#~=(G7l`^byV6!UE9i05uD7;a%&uvxG!G~IkX+r5w` zp`4|Ea@rzWA5`(#N?~-*yolb|C`aDUuU;~4z?$w%^GJ}icd)`kH$rR6E$$4J=x4mQ zQn;(dtepK7dJk0uN$2)?$aO?bx>~Uz4y@-2*;=oFz4X@FwV|n&iWIe&>g~=kQQAi> z8g98;6=J1xJom%O1A63B75 zXwrp+J?#MNSvC3;vQ;m`re<01`pl#_a+KKC zEf9>)@1bTTkfUPN%QatI3E5+*49hsilKRt&|H`yn#z0c)HD|UpA2{CN3#~I^xcd}z zA8q2+%(jKkAiWJTa3w!cI6gzZU1P1hOFE&2T@~UeU44#MVBfO54?le3xW2qB{`Gai+qzPt<)tNZQbgnpWa!&Zfxp|wi9dfp9{EJHD(LcEHB&Yf zywjm#L!tjzSN~Lb8H-*uqI)7ab@utY%+!eersuRr2mO(G9OKEp?4u!CGC7-?q#C;{ zUruz0%p56?Hrdda81^KHykfM;T*@X}Yd#dN9;@RN?c(Pm8RLfbmIe%!m*iu~kq0#| z)y2NP9=7!(NSDa;*7SA$79V0{A$V7y<@fGWvuK)z_x^Lr$YnRB= zgTU!)cl2cjFD-kDtJ-{)_jw|pX^p;kmG*n@bXb?s1XV7qccXRgwOd%N;gS>XVRE_V z=jmIcX@z6m%kb&X(T@CBH5FWz`p9#rxT-zFaKYlqYnYeitsASShVN9- zc593q*e*B|ZrXBBEh`x~0fh9dX^&~|+PT@`oqRY-@dUg(o_`nwD{HULRkrm+%abm1 z2R_vFLQ5{5r9y*VL$2KZ!TmY!58Ue+lP>~U=4%mj>_|^IaiC{1riVJx?ks%4&6?Tu ztfBH4yMH1(XMcXyXm9H=RKilQ%_yATn`|8Mb5cu0=^I+&%;|QAyNTsmXbsT-Y6yn6 zch53Ji42O135!lV2BNbH>~I>(n}3U2eEwfe;9pK>I&vQzkNfj}vS@a=LVU%&*k3F- z#^3zl!`uEX)>NCpXh6zFK6zG4AL@6yjp?`($~@9^`RIe5g2zRPe!R*RdVLm!l&2qe m`mwarC$drIy{?}OBVhqGhCTW@tGrczMqXrJ(pmS&l>Y!;X&e3k literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/DifficultyIncrease.png b/public/images/badges/mods/blanks/DifficultyIncrease.png new file mode 100644 index 0000000000000000000000000000000000000000..778098cc35fe44647a71aceb6f9a8ef371eca1c0 GIT binary patch literal 1742 zcmaJ?eKb^g7@ksViKgfv+1v(;-JOp+%#67i%ov{;gnX=uF>{BBnLB3g>M z$Jo%)5QoDV`}uN1u#t$pz^9*J-^}k{bFpC~>J^EGA|h19m%})=5Q&2UKM6k`4uSc? zl;pdxD-Ndzh{Gb$NL~OWKqMr-4ntB)WEdNVb9GnC_<}?j1>)d%v6MxaXt+%P#6lJ! zg2topWS($>*f&)Uho%OG2~raUOd-MD4RBRMn1BRE`G8uIBvn9a7GYi&!sfbdG69%} zpouKPhomBT!GI?shXERiLKINw6o3wrKqqGggYgwWrGOMNg-QmgM34bFQ6UNiSa=9n zG`Ua&g>bzWVqq&5Apu2Y5Sgq}sYog(5+aW$gG?qF$7VOB1QRXqEunCsKA94 z0=Za*iV-QGQ{=}XN|Z&wGW}43M7AU=RV*A6c3@;RUq%K=6kSP+KpyY^p%TdwT7ibZ zAM^cBVMSPq3?_%b3PdRvV2u;m=t9XLPdUs-5qTJbBrTp|Z~}rNiUdRkc!tt|2(eU% zs1);P9uM-9Dp0;u0Q+%S1dLA-i-nMjCx=3z(43hd+ZhDCxEwDw=)wTK8K9FFh0dfd za=C~=DS@TvB3Jm4OIwz!GlE2hMdreC@i(y0TaHM8`GO(w^0`o#)mz{Sm(Rs%SuPn% zhOBGrzuLUGg?UFeT{11USh77V#k?-ZOs(~6YsKyg*N@8%Q$OkLi}nrWTj3@r3V-}e z_2~Y#b3Nyrt33{o9{y&x&cr|aYrHp?jo1lUz1zB8vP(IJX*C?MBbSun78#7^pEW2u zZWonLPb3bar#pFdJ#+3&Sr>~=oaldS{eH4&(@3kT^UuziIg6>&H{{J4*V@qN@^Gqt z3Nuf?!DVVrpxtU?6j*<-zDi~Fs8jo-!ltN$3u$F;G-b@Odfv}Yn|$+|U#_o5>Kd|- z?zFger@SWE8QFWaHtMoKb8FWRcz!8gaV zLiEUPPhX2qk<_QOxL|^;EzD~_$t9$F=%>~=W{UbN3#x;HhS#n$Se@EM8-lEhYM3$G z?@|s=O}`uWz}I(~XAkeDi%!KJ>gU*6jB;WoHyLSENjt`-3ht6k4D|o%+Q@CM479wL zZxC=jzkAfvK6U*?edT&0{!$0sK>Gpz8V8q@Bl zBWcAyy#DUhsDVqP%NcF??>DdM&E%+zAv&)z_VgX(et#l8t!_58red(mLYkl$%$Ji( z@I|A>;Uvqp9TU+x$}e-KXd!z0DG%O^yr5fW4oCY&Ofp_&T3tAQ=KR~)tQh~;H<~qR zy-dc;B>M?c>#`M!334wmv1E;Mtd;Mb+owJD5pO3|rDv-{3}aD^{;uAc_TCLKYg!NQ z3)(;4b3x>&=}zB_Zjb4+TQ#6%({@h2YPw>O*_;!Z&M$p;Retm)Ixsd-mcXtaXx7V< zJ*ybU7hb#a0>--2Wm=zLb3L-8#W4v96)E?TVk{)GAx&MC27T_}tnUED(E^8$eBKn_ zSiI$=+MMH6ebh|dN1g3P@1?fvnQlzKZ(t%42N)f(@BHat=pPp^MLZs(M){k>cR57S zdXqW`9Z&x*0MD#;yY=??6mkMLabPgK?QxA#P|8M2oE literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/DifficultyIncrease@2x.png b/public/images/badges/mods/blanks/DifficultyIncrease@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..53c488c4f15bdb78511483a8472e7c5e9e73a833 GIT binary patch literal 2558 zcmaJ@dpy&7A0I^yqvIN()}#xw{kGZ07_Vg(GWW|w*=#?V?9w*Z3YDWrp*j^hh1@18 zw=|U|=_YX$T^yH6>S4K*IMm2F)2W{4kEiGNdi{Ri%j^Aqf8L+Z_w#+dei=Sqo3%Ap zYC<3oZFe_{pK_!tUndQ9<+s|dU!)vN#IAI)KR;3&&lG|XGMgU(!rZyc9iSh`WGC*r z4?031OJJM;x|mM$B(nHiBy$miOyCNXYzV~BIYGc=?F7ZJ2yh37M}og=ya9)C*d%x` zjt0;KE?^YLElCLaCwT?1l6JD}*>Gnkm}3G_DZmBAOjrUph9@E>kld!T&Kur}@BK_(BkdLjpD|01v?MXe1hIOCS&sFbseOPyhyn#@L_rldg#=gfksJ=2NU$Sdu&%aLdoB{-s}3N@)hQc&z_*%-^<@y|Xy|-n7ca_qGRl%3c>Lo7y$T{&xsOU0DHg zKtk_We`1V5pxLtbgyFc|4JXRR_un~iYpbSTX7O5MV1tAVMN43e2#q#fTBhQNo^O%n zO4pm}|591nRjhv8gQ8pUbG?VIhh>@BPxUow9*xue1E(ei=cJeDZOHrq^X9l0ghcr& zXvf^x=;;^jW2V{0`V)obPm5e^Ud|EN z>BWMkvBSpey2eu!a1t0%CI6g8Pgc37n*mMzxTo||$KU{cd)f7=$6Z^3E%s$E%_}d7 zn{RC_eaFst0AB(`mseN)J8bw8ODpE2@#_ZtJm>4UsiIvao{ee+rAJlFj^x${6a*BU z0UDa%W^AW3%io*_Idc2iHiut4Ke#9EQr^dg#( z{4Q61B*gC*RXvbg_-NLrW0M-5){4J~KdTryGFabqnrB$!6Bv=7YtT7-Y=gE!X9<0T z+C3+iIa;sb&P;#Q^L?r3X0WW4)=^NsywJy-n$4K(_;jCtr!`DH<3lsV2taG*_03Pb zJQgB<1#jsxq&HJKo7|SyIDYn>@+er3&J1!XF#`6{N}J~wv`zdu8JGjL&wZpFskHEP z!d{VEB_ml-Kd(CkHS1~K5XLBq*?V_?8r|ujueweQLwqS3(PP?gI`u2!lH|5wcO4?f zSKT|p%$Y2o=6)K=>(Xu0Fv@i*ypp-nsUcDuCLcC4dp@cuxC}XDBqaW3qN$gBlTI>yJ&fbYDA}d3z*(TW-Zt2HC() z-vW*Qt>R&zE5j@48RV z{0YI-423k#%*!1`BUkEj9~tY@TMVR-xbDdCy2{$tijTb}-t2vAzQ91l--XiRQs<4$_5Wnc}a@?ke)wx{kx=ZY%<;f8yAH5q@&Ju+YE zD5&G<@A{r%E8nX+7`OOgWrJ25knx#S3vnZgxpz4qj883`vFrO3KOsTYG7F<$BU`AH=8&FqG^$gAGnbuq}j^eh&X z)SQ&trKl&p`Ndm$`GSRdKjPf#yXAj=-XB@?0CwWZ%&Ok8!rc0WAm58)NATOGP4=!I z2)1%eYS8*KS=a7qRZ3Y6hh{te{$cQRi1mXLK2pO?pRr_ z-ddX&JlEOVe?Co-qQP9?wUe`1z3U)k)@(RMU_GK@|LQM|Y_WLZ$BIlS*w zHNhaqJkGon^(4KHrB&{!g->Cvnf|#q-MbwJ-UvEs8#^Cme=l11qB!96+#dli>v31O zo1-5O6&g0oZ{1#Y*1)0M+{f-dw+X$ibG){A-7zV-J|t?3<-oHUc2^3o;B|L)8?oL> zMa0#YJKY;y7eDg!(7v-BTaR1hB~SFUpIzf{*+}<-^Iw_(Wat(jRVT@3F8-0ZyLwTo IHZk`94R0et2><{9 literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/DifficultyReduction.png b/public/images/badges/mods/blanks/DifficultyReduction.png new file mode 100644 index 0000000000000000000000000000000000000000..964edff82e326c0a36e4eee451385a79541f700c GIT binary patch literal 1668 zcmeAS@N?(olHy`uVBq!ia0vp^xDSr z1<%~X^wgl##FWaylc_cg49p6dArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`LU?9gN`84U zShcUOm1kaYNn&1ds;7&s5>UThW@d_&v4w@HlasTdrJ*(J3ovn(~mttdZN0qkL`Oq_0Ua>HpJ zRBsAyw;15ms}FRHJ}6p|q8TOxOgkVZJkbI<@MNEw2Tbclz(n1&U}g*h1Jf^07srr_ zTUT!QdrVH0VgK;{-|m-bnT;ZDE>7(emV~UjsAyH;v8&{zzO1#%7yeh57Rm@U3A)O; ztq#{OWLdW+24(uMVs`hCP-8_l(@<6OP^ z`-0OcZmQEX(+*esS|M#}{@PHp?%0)e7t?p#4|&*9ZF!JqGwamQ-4CDsc)8BA{o3{W zj=B4oe=l&n@n!{3sAd(rdHBJ7Wz2fchadbX`J;QQ;*E{pjL#bay-kiUZ=QFhc;!@w z@((Irr?)>|7uRo-A#<%JXRGLfuTPU%jBGP6_esT=NCa|lHt|&jsizu6)qm64CMx#W zK!vO7h1WK<#k#3aGp@Yc^y%Y|_Y2zfeg$1*3)lYEEwo)&h%NSu>azryy+=8Z&-z;6 z_-H}@IhI=$Pk3G(nVvECOvbMlOQvVcUd+Khfq9`tZehth-qf89VRH(%MAqu6CjKd! z^;o#@6o0(l3}L@T>F#V7Cv(4e_`LAB&P8K6@mtH7C8kUI++WMK<)U|qh5=`My||6h z;+Kmj$1PG;Qjc1<;PGpBo|7EQy6vo9`qmtCR04}qu-k~DC2NuuFaUv z=*wPnDE0TELubX?g^+5R^ zG5fy(H>HeIBK*&GN;lWemC(>@ytt3aRZRPn>-lBTpQ2=(uh=(kOs{>BXVvP)C?9g~ zX-C%m87r5E%sLsWz=mmWF#Pjv5w$46Ste|x9?cbv~! m60%ZYPRYR%e+xl-Rtbg#`5!%ZJ@XcV>IF|%KbLh*2~7Z<^@S$@ literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/DifficultyReduction@2x.png b/public/images/badges/mods/blanks/DifficultyReduction@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7edbf2ccdf953e9b6f6f5a9d4a1dc107761b9b GIT binary patch literal 2493 zcmaJ@dpwi-A6K~x-HwExW@%B`_RM9Br7CBd6qkYOjot+`8u) zigM|KlS}R=GbEK;p^}_#oavl`QwTAaC1^u)lrp`lT&xz zgZGrJB-y)5SyA>awjAKemQ8#I65op*#21jcpd60M4g?|2OmZ;j36iPdM;?MUa&oI6 zbZ-)$L~zAW*i1Ni2?G~0IWo4KoQxY5IPkL^)V+P2^@Qn zM&A>`1-&BNyeSbO6e}v!b{E7(h>-~}K|UEGWHMMhj1UX`s*92Bm#z^|$X5tI1PlGg z6p7#gv1fBZh&dc-LP1&}Ar=4}Ff~J?(K{h1B!EO9Q3wEK0-!ObC=3z_`Sw6%(YVwg zj3?glTP)cL3#IY-91H>>5D4G`Q#hL&i~y{xtd=xTC=(gNgcr`@lZ7TM-j-zrJjkPP z=^Q?t&4Mf`k^|YHd@NMv^q&-%obR$M-nTNz3WgApIS2rbTuNyfNFe-wD3kde&EtE5 z|N8x(!aVPA4v6psdF)UwMb@~WElZ&|7<(>A=CirpY&K)LiXJpJpUtDOIS_j$YnDjUlYdAf9wVQL%nZY>W{rx z{*a51nL#YI^}pJ@d?lNmrS12jl^wp1J;;*HI#)K-i(O;C%gHI4I^%KP!v0qSk*=wr zp3>`?NESyU&JMpeqc1N#SEG|VdUe7PY%Q!fOr7vADr8htg_iQgv!V)LQ(j}jY0Gk7 z=BSw|p->#JbNZ=*OMsnGOx(bu6^|x9)Ydi)^I0=i#TzZ#1(8Z)ijlj3;wZsL9Xrw=}lAyy$a z;znzvJ29YPONCE~Tk62N%2eiPv5#)wyT+zlw#Eu4;z~=}7`G3Z z*3=)NG+upD5Yv~KSAm^Aydu+waZk?)`gTn|SxV0do>rYtZcf^E3NuG!pfZ8gfFAVb z&5_yerVct)vvNagLr7qWyHnCh#qykZB9;^$rBZf-M>O24rA8gzv%APhT5EG><5=?e z-AWa&Qa`}pP}gCs8>!>CMd!-Qp^x&W_;{2{*+MZR(;?F%7U!>*y)rV$Vkk9h!CqI# zL6s53!;UsspW0&l<)np~szsVY1TLJR(FJpNI&0LTCqgN6SHkAr=M;Pt@W&_aia%c} zC7m(6B0^Fn;=R{)gPC>u*IWHlRD7S6{Coxsa@NL#DZ!{ochO3Md>~6-FO9eP=Qz&? zu!(zcDZ^}5kacfkUwMJH>H3pf{L3cP+Gt}Tm|@&UnqgA4*B2NSsys#0R_-ecFduD_ z97!uk*jb)WUQ}tfjyHC%jZPY%8<{^mI5G~qBmX?UIj{VxUfRd`fS0Qjgi^*PzsIP7 zxLgC1+;fMZC2xBY|Ij;~AQ3gCcZe>gsjUVMxkf0rH%BZtd>s-kMmt z$-)lXrR5$Fd1sZc=)o{$LmFX9zB1vM6;Y(UOVZi1H{iy@>oeZvuH&?eK^3mNuv`a` zwr;WUvB9+c#BI(=$w8B_l4}d)5ifF*j&-^ol%MYRjV)xMBMcLP+^qz<%kZ?V#&D0n z)0>(C09IaL%v2fJQ7IPfBaLw<>lXF}1<>}mWORw^{eI z^#V&_*-C4}gTmaO+GtAWFC1DZO5`LIzUc-@j|bxuMF=4czaxVlrmWC6YC){3#-**Y0Rkx+Ez}vyx1C+cx=O>!$O5G`qGP3h5?|!}&wi=q&xC7Z~d| zUzg6E=>GzKK5k()=`TK^cHJ#yU{Jb0>0oH@Uk+T2)dX7p)Vg_v2>;7ltd$U`)4<8f8D29_b{#_2DZ?Qs;OTcIV~AUHJW6kT@urF zt7XtE;8X3Y zJ(;Ho@oU?g7JAi6M*0js8)jeaH7%WU_eNh_uiG?y z;DPw8xjtpH@q?sR#&g3<2KMg`e}d?$R>QOGYtsEwq7K9k_NGn>59CjI@So~DNiSL) ztIC5pGtlwL^F)`mx@jm0Qpn1F-ub>6Q@;He#iYHkf=-zZt*XegrQNQS*9%-pE|3PrhWo7FFDqDDkZKUB^RZula*fSA7l+rTwQ literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/Fun.png b/public/images/badges/mods/blanks/Fun.png new file mode 100644 index 0000000000000000000000000000000000000000..62ed95ea2610fca193d2fd7d3b3a883ec1ced6f5 GIT binary patch literal 1650 zcmeAS@N?(olHy`uVBq!ia0vp^xDSr z1<%~X^wgl##FWaylc_cg49p6dArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`LU?9gN`84U zShcUOm1kaYNn&1ds;7&s5>UThW@d_&p^1^HqlJrsrJ*(J3ovn(~mttdZN0qkL`Oq_0UcExEP zRBsASw>Z1u)TklMZiQ|m%r>E0|V0wPZ!6K zid$E1-1iPnlwkkx-qQN^9j)%b3E!GEwDX0UL~<^=n%rnj62HrG@onCxP4)^eoc8oC z;+$yCcGXo-$jc+dtK-C?pbMh2X0CgB>CDc@ceXsQJ-_=xY1yYmZ}(I`kbP5duF}rh z`hD@a-x}otEuk$oymBU2w=Hto%`|=SG&9Q&|CO6d%(!fe`TOtP=TTl1{dP^nf~f&l zZ`xYKU-rFGHAU;vO~o%g?1%6Fe*W_IuA6$Rjz098V|gVo$bfs=`#Tf;=IwV7aaz6b z*tE2eUC{~dIpwCG|FG69la>zH%iLa@yTMq)zC1^8?OdK8>n|Nyy;0Qn=gwxE|4!P9 z<$vu$!sD8G9QocUP8Yq^`C#Mg3s>d_EtuI{`AKc*uFOxe{BxSl7fTwkR_@4dE>*tO zyK7b1iY{j@lg|d?pPw$2Rs7%D9rEbU1j7?YYaeBvxww4e{z+bEcu&YYdF^Typli%%Y(`y}+|FCLGU$<6(S ze~Vqb40i75pL1q*bkOGY&Uz1jzrH%nXd@wd~Iw$9aF2_1?_7qtSTtVP1_7 z&n>29du;Y=6h`M>+i=O~?)Oiw(nzvwM9jjo`cs2&$BH{tcmvwu`p^PDVy6nAdM+q|0%BHbtNn($q?aat-& z!|(c(tM^sQ=4RF`G*tJRlgS*k*+S6TL0mmaH9hEy{FNk|?=Gzglk;|75IuJ^pOKB> XFCR}|=DZ|+P%Yr;>gTe~DWM4fvOt*l literal 0 HcmV?d00001 diff --git a/public/images/badges/mods/blanks/Fun@2x.png b/public/images/badges/mods/blanks/Fun@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9aa772bb1a1fbb2c6396900317f4ad6c10e739 GIT binary patch literal 2434 zcmaJ@dpuO@8lJLE<&xbECC)Ui#oS#-lQ76I5t9a~88d5Gv1X>3!3^0_D3@-M*rIl_ z+oas*xTTS)!>Q=XxO9r7+=`Uz?sSIIK7X9f`u*1W-tYT8&-1?D`#yiHWbd7Bnra)= zU@(}b`wp^?a-}QZZOh@xZ;5S>P`RuZxzI(vJdP-eDF9%OY+f*caEF*7fDgcAOAfXG zTVXI21W2Qc=u}T4iwB{Z^BA-k;w#xO*j5KIpUDaXM2KJ@1mu#C@9S zQu)q6D7Yh90Qg4lq_LvISaxir!#2cLF;OW10U{77bQSCzFs$J{knsM4XE)9`A(1+2I_ma5xvT6T#JvY)P=S zv~;p2SUM6Gxnv$I0s^?AMK1d;+W)>L%zqFdVbF!;M9*BEFs<--?p zQLIT%r*tx&9>Ly$Ilc;7`(q8gQ6f zWP&zcFO}9PLeF$*uT+$)-w5x&8h2@}VM3Z>%l##ojipehUxypb-ET|d@hZqTFtHE{ zXb$izJ*Y46d9gcsS5mRULcXs!aqEk*r$dw?WTdf91XNMse|%zXS8UZt_Gk&Rsm#Cd zjxL^6r~3QUp)&a3y+5L9TTsuduBU4@!Mgvs|CiS!+weOSN=Wlb%{TgEl{G4Q?QeFy zR$R-_=#btF->fCBkhzPYQPWazJ*AnE@LOpH1_Rbl1$d|r)_mGo!0M8u@{gsfadwYsu({s6q1_939oat73(#*NUMD+?(&;`qo^x{d z{T2S@n>*EB7MgsF`fXwWG-mlUr&C+}U~Lbr_s+$=phjoeCV$G4nkVOiF$Pn&JC5e- z@BZ4H7N1}LHIb4;Pd!%j@WYx~H?-MxdRS+(s?^XKOiq*`&sKi=EF3tck~Q9DR%Pbw z7w#JQ_~+ikpDUl+op@(bx$=UyV18a{BUhMo#wsmH#WY|@>+!_kt^%F$3r%K$XR<4u zjTmLNbuqmSX%%};nKdroWGF=v5~};Hdt#o*XJf9-x_(~OllRsyh3RA+PWGG73V#F> zLKB7$hi4i_FQsefGY!)QI?6-iT@GC)#+_*QeY=5JVylzjsW6$&Q0TntMg}=yT>|6W zpo#M|mwHOXjZ8^rLim+cAD0TDFjEs0XFuI^=k9?t$ukcR zwoIFigcxhH+N7UY#pH|w{h$?|`V@at)_3OD zOQW-I$J}i`rm8LTvv%LN;GCk})4p4)>GCjsWJa&4 zspk5-hSx4L#yg}1a^oA_1kq^DY^=lOVV#=E=-|)mq7R33yh=9Lt+7%_K9%%kr&;tD zkTgt*2n_`O|fLCyOD{a$t@^qoT& zQ(~4!UK1vxRL|0yX8ALbF)XjS?8u&>D}i;d*QB)2&%+6aXWp!;zig6gJ&rTC`&nmD zrO(I2KC|_hscL^k`N7WB@@u#Is;vG#Qdb*R_#naF8udP-nxG;m(XMVcmSU%kK3wV1 fXlxyDSOSM7B^rQBr7H{O|BBpQc9L&6F^>EPW!(?$ literal 0 HcmV?d00001 diff --git a/resources/assets/less/bem/mod.less b/resources/assets/less/bem/mod.less index 73054ec2b2c..0de7a7d3582 100644 --- a/resources/assets/less/bem/mod.less +++ b/resources/assets/less/bem/mod.less @@ -7,10 +7,23 @@ background-size: contain; background-position: center; background-repeat: no-repeat; + display: flex; + position: relative; + --generic-display: flex; .all(@name, @filename) { &--@{name} { .at2x-simple("~@images/badges/mods/mod_@{filename}.png"); + + &::after, &::before { + --generic-display: none; + } + } + } + + .type-bg(@name) { + &--type-@{name} { + .at2x-var(--type-bg, "~@images/badges/mods/blanks/@{name}.png"); } } @@ -39,4 +52,39 @@ .all(SO, 'spun-out'); .all(TD, 'touchdevice'); .all(V2, 'v2'); + + .type-bg(Automation); + .type-bg(Conversion); + .type-bg(DifficultyIncrease); + .type-bg(DifficultyReduction); + .type-bg(Fun); + + &::before { + .full-size(); + background-image: var(--type-bg); + background-size: contain; + content: ''; + display: var(--generic-display); + + @media @highdpi { + background-image: var(--type-bg-2x); + } + } + + &::after { + .full-size(); + content: attr(data-acronym); + display: var(--generic-display); + align-items: center; + justify-content: center; + color: #545454; + padding-top: 1px; // slightly more centered? + padding-right: 1px; // slightly more centered? + font-family: @font-grade; + font-size: 8px; // icon size + + @media @highdpi { + font-size: 9px; // icon size + } + } } diff --git a/resources/assets/less/functions.less b/resources/assets/less/functions.less index fcbb2d2c6c5..447855e33ea 100644 --- a/resources/assets/less/functions.less +++ b/resources/assets/less/functions.less @@ -258,6 +258,12 @@ } } +.at2x-var(@key, @url) { + @url2x: replace(@url, "(\.[^.]+)$", "@2x$1"); + @{key}: url(@url); + @{key}-2x: url(@url2x); +} + // Will force the element to be rendered in its own layer // in hardware accelerated mode. // Be careful that elements using this will have z-index context applied. diff --git a/resources/assets/lib/cli/mod-names-generator.js b/resources/assets/lib/cli/mod-names-generator.js index 4fa0f57d3ce..36a5708eb68 100644 --- a/resources/assets/lib/cli/mod-names-generator.js +++ b/resources/assets/lib/cli/mod-names-generator.js @@ -13,13 +13,25 @@ function modNamesGenerator() { const modNames = {}; for (const mods of modsByRuleset) { for (const mod of mods.Mods) { - modNames[mod.Acronym] = mod.Name; + modNames[mod.Acronym] = { + acronym: mod.Acronym, + name: mod.Name, + type: mod.Type, + }; } } // extra for mod icons - modNames.V2 = 'Score V2'; - modNames.NM = 'No Mod'; + modNames.V2 = { + acronym: 'V2', + name: 'Score V2', + type: 'Conversion', + }; + modNames.NM = { + acronym: 'NM', + name: 'No Mod', + type: 'Conversion', // not really relevant + }; const outDir = `${root}/resources/assets/build`; fs.mkdirSync(outDir, { recursive: true }); diff --git a/resources/assets/lib/components/mod.tsx b/resources/assets/lib/components/mod.tsx index 0080278e2dc..dae081acd5b 100644 --- a/resources/assets/lib/components/mod.tsx +++ b/resources/assets/lib/components/mod.tsx @@ -1,19 +1,26 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import modNames from 'mod-names.json'; import * as React from 'react'; import { classWithModifiers } from 'utils/css'; -import { modName } from 'utils/score-helper'; interface Props { mod: string; } export default function Mod({ mod }: Props) { + const modJson = modNames[mod] ?? { + acronym: '??', + name: '??', + type: 'fun', + }; + return (
    ); } diff --git a/resources/assets/lib/globals.d.ts b/resources/assets/lib/globals.d.ts index 68504a2f076..51f454464d0 100644 --- a/resources/assets/lib/globals.d.ts +++ b/resources/assets/lib/globals.d.ts @@ -2,7 +2,9 @@ // See the LICENCE file in the repository root for full licence text. declare module 'mod-names.json' { - const modNames: Partial>; + import ModJson from 'interfaces/mod-json'; + + const modNames: Partial>; export default modNames; } diff --git a/resources/assets/lib/interfaces/mod-json.ts b/resources/assets/lib/interfaces/mod-json.ts new file mode 100644 index 00000000000..7d6a8e7fb01 --- /dev/null +++ b/resources/assets/lib/interfaces/mod-json.ts @@ -0,0 +1,8 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +export default interface ModJson { + acronym: string; + name: string; + type: string; +} diff --git a/resources/assets/lib/utils/score-helper.ts b/resources/assets/lib/utils/score-helper.ts index 917749a9be4..2f6ca4fe335 100644 --- a/resources/assets/lib/utils/score-helper.ts +++ b/resources/assets/lib/utils/score-helper.ts @@ -4,7 +4,6 @@ import GameMode from 'interfaces/game-mode'; import SoloScoreJson, { SoloScoreStatisticsAttribute } from 'interfaces/solo-score-json'; import { route } from 'laroute'; -import modNames from 'mod-names.json'; import core from 'osu-core-singleton'; import { rulesetName } from './beatmap-helper'; import { trans } from './lang'; @@ -93,10 +92,6 @@ export const modeAttributesMap: Record = { ], }; -export function modName(acronym: string): string { - return modNames[acronym] ?? 'unknown'; -} - export function scoreDownloadUrl(score: SoloScoreJson) { if (score.type === 'solo_score') { return route('scores.download', { score: score.id }); From efbde9a9bdadc7702bfbb3fa3872fd24394255a8 Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 15:45:53 +0900 Subject: [PATCH 0411/1261] Allow autofill fields and set correct focus --- resources/views/users/create.blade.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index 7af290e4e1b..692d0e04b0d 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -2,6 +2,14 @@ Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. See the LICENCE file in the repository root for full licence text. --}} +@php + $params = get_params(request()->all(), null, [ + 'username', + 'email', + ], ['null_missing' => true]); + $focus = $params['username'] === null ? 'username' : 'password'; +@endphp + @extends('master') @section('content') @@ -23,6 +31,8 @@ class="simple-form simple-form--user-create js-form-error js-captcha--reset-on-e class="simple-form__input" name="user[username]" required + value="{{ $params['username'] }}" + {{ $focus === 'username' ? 'autofocus' : '' }} >
    @@ -37,6 +47,7 @@ class="simple-form__input js-form-confirmation" name="user[password]" type="password" required + {{ $focus === 'password' ? 'autofocus' : '' }} >
    @@ -64,6 +75,7 @@ class="simple-form__input js-form-confirmation" class="simple-form__input js-form-confirmation" name="user[user_email]" required + value="{{ $params['email'] }}" >
    @@ -77,6 +89,7 @@ class="simple-form__input js-form-confirmation" class="simple-form__input js-form-confirmation" name="user[user_email_confirmation]" required + value="{{ $params['email'] }}" >
    From 05c5078a1ea9ae2f1620b198be8f32120b9cbc7f Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 15:48:29 +0900 Subject: [PATCH 0412/1261] Set correct email input type --- resources/views/users/create.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index 692d0e04b0d..fea6d7fdb5a 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -75,6 +75,7 @@ class="simple-form__input js-form-confirmation" class="simple-form__input js-form-confirmation" name="user[user_email]" required + type="email" value="{{ $params['email'] }}" >
    @@ -89,6 +90,7 @@ class="simple-form__input js-form-confirmation" class="simple-form__input js-form-confirmation" name="user[user_email_confirmation]" required + type="email" value="{{ $params['email'] }}" >
    From 802342a8073297859746278e06c72e0204a9c276 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 15:58:01 +0900 Subject: [PATCH 0413/1261] not optional unlike updates response --- app/Http/Controllers/Chat/ChatController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Chat/ChatController.php b/app/Http/Controllers/Chat/ChatController.php index 8062773c522..03c091de921 100644 --- a/app/Http/Controllers/Chat/ChatController.php +++ b/app/Http/Controllers/Chat/ChatController.php @@ -41,7 +41,7 @@ public function __construct() * * Field | Type * ---------------- | ----------------- - * silences | [UserSilence](#usersilence)[]? + * silences | [UserSilence](#usersilence)[] * * @queryParam history_since integer [UserSilence](#usersilence)s after the specified id to return. * @queryParam since integer required Messages after the specified `message_id` to return. From 9c91b2caf68c0cf92daf819aab0aeb74efd6854e Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 16:20:46 +0900 Subject: [PATCH 0414/1261] since isn't required anymore --- app/Http/Controllers/Chat/ChatController.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Chat/ChatController.php b/app/Http/Controllers/Chat/ChatController.php index 03c091de921..7ed19a59ec3 100644 --- a/app/Http/Controllers/Chat/ChatController.php +++ b/app/Http/Controllers/Chat/ChatController.php @@ -44,7 +44,8 @@ public function __construct() * silences | [UserSilence](#usersilence)[] * * @queryParam history_since integer [UserSilence](#usersilence)s after the specified id to return. - * @queryParam since integer required Messages after the specified `message_id` to return. + * This field is preferred and takes precedence over `since`. + * @queryParam since integer [UserSilence](#usersilence)s after the specified [ChatMessage.message_id](#chatmessage) to return. No-example */ public function ack() { @@ -187,8 +188,9 @@ public function presence() * silences | [UserSilence](#usersilence)[]? * * @queryParam history_since integer [UserSilence](#usersilence)s after the specified id to return. - * @queryParam includes string[] List of fields from `presence`, `silences` to include in the response. Returns all if not specified. - * @queryParam since integer required Messages after the specified `message_id` to return. + * This field is preferred and takes precedence over `since`. + * @queryParam includes string[] List of fields from `presence`, `silences` to include in the response. Returns all if not specified. No-example + * @queryParam since integer [UserSilence](#usersilence)s after the specified [ChatMessage.message_id](#chatmessage) to return. No-example * * @response { * "presence": [ From e73233460d6a50a38debd5fac6cd285aeb26bac2 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 16:28:07 +0900 Subject: [PATCH 0415/1261] should be markdown --- resources/views/docs/_using_chat.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/docs/_using_chat.md b/resources/views/docs/_using_chat.md index bc070e6137a..57a0bf82078 100644 --- a/resources/views/docs/_using_chat.md +++ b/resources/views/docs/_using_chat.md @@ -42,7 +42,7 @@ Re-creating a `PM` channel will simply rejoin the existing channel. Make a request to the [Join Channel](#join-channel) endpoint where `channel` is the `channel_id`. -A chat.channel.join event is sent when the over the websocket when the user joins a channel. +A [chat.channel.join](#chatchanneljoin) event is sent when the over the websocket when the user joins a channel. ## Leaving a channel @@ -50,14 +50,14 @@ Make a request to the [Leave Channel](#leave-channel) endpoint. Leaving a channel will remove it from the User's channel list. -A chat.channel.part event is sent over the websocket when the user leaves a channel. +A [chat.channel.part](#chatchannelpart) event is sent over the websocket when the user leaves a channel. ## Sending messages Channels should be [joined](#joining-a-channel) or [created](#creating-a-channel) before messages are sent to them. To send a message a channel, make a request to the [Send Message to Channel](#send-message-to-channel) endpoint. -A chat.message.new event is sent over the websocket when the user receives a message. +A [chat.message.new](#chatmessagenew) event is sent over the websocket when the user receives a message. ## Getting info about a channel From d6d371cfa9127bf3b69fb3f34ccaeb8e7479f455 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 16:31:13 +0900 Subject: [PATCH 0416/1261] so there was a copy of this here.., --- resources/views/docs/_websocket.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/resources/views/docs/_websocket.md b/resources/views/docs/_websocket.md index 926c8ead6da..44f0a08454f 100644 --- a/resources/views/docs/_websocket.md +++ b/resources/views/docs/_websocket.md @@ -11,9 +11,4 @@ wscat -c "{notification_endpoint}" This endpoint allows you to receive notifications and chat events without constantly polling the server. -Events received over the websocket have the follow basic format: - -Field | Type | Description ------ | ------- | ----------------------- -event | string | The name of the event. -data | object? | Payload of the event; see [Websocket Events](#websocket-events) +See [Websocket Events](#websocket-events) for the structure of websocket messages. From bfe2a05f24eaff921a0c321a9556cb16e5f73b45 Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 16:30:52 +0900 Subject: [PATCH 0417/1261] Split client and web registration endpoints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CSRF requirement with web registration makes it rather difficult to return correct error message. Also add tests which discovered confirmation field check isn't actually working 👀 Although as there's already check on frontend it may be not actually needed? --- app/Http/Controllers/UsersController.php | 184 ++++++++++++---------- app/Http/Middleware/VerifyCsrfToken.php | 11 +- resources/views/users/create.blade.php | 2 +- routes/web.php | 1 + tests/Controllers/UsersControllerTest.php | 93 +++++++++++ 5 files changed, 199 insertions(+), 92 deletions(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 1a9cce70527..d43b15f7043 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -211,108 +211,56 @@ public function extraPages($_id, $page) public function store() { - if (!config('osu.user.allow_registration')) { - return abort(403, 'User registration is currently disabled'); + if (config('osu.user.registration_mode') !== 'client') { + return response([ + 'error' => osu_trans('users.store.from_web'), + 'url' => route('users.create'), + ], 403); } - $ip = Request::ip(); + if (!starts_with(Request::header('User-Agent'), config('osu.client.user_agent'))) { + return error_popup(osu_trans('users.store.from_client'), 403); + } - if (IpBan::where('ip', '=', $ip)->exists()) { - return error_popup('Banned IP', 403); + return $this->storeUser(request()->all()); + } + + public function storeWeb() + { + if (config('osu.user.registration_mode') !== 'web') { + return error_popup(osu_trans('users.store.from_client'), 403); } $rawParams = request()->all(); + + if (captcha_enabled()) { + static $captchaField = 'g-recaptcha-response'; + $token = $rawParams[$captchaField] ?? null; + + $validCaptcha = NoCaptcha::verifyResponse($token); + + if (!$validCaptcha) { + return abort(422, 'invalid captcha'); + } + } + $params = get_params($rawParams, 'user', [ 'password', 'password_confirmation', 'user_email', 'user_email_confirmation', - 'username', ], ['null_missing' => true]); - $webRegistration = config('osu.user.registration_mode') === 'web'; - $fromClient = starts_with(Request::header('User-Agent'), config('osu.client.user_agent')); - - if ($webRegistration) { - if ($fromClient) { + foreach (['user_email', 'password'] as $confirmableField) { + $confirmationField = "{$confirmableField}_confirmation"; + if ($params[$confirmableField] !== $params[$confirmationField]) { return response([ - 'error' => osu_trans('users.store.from_web'), - 'url' => route('users.create'), + 'form_error' => ['user' => [$confirmationField => osu_trans('model_validation.wrong_confirmation')]], ], 422); } - - if (captcha_enabled()) { - static $captchaField = 'g-recaptcha-response'; - $token = $rawParams[$captchaField] ?? null; - - $validCaptcha = NoCaptcha::verifyResponse($token); - - if (!$validCaptcha) { - return abort(422, 'invalid captcha'); - } - - foreach (['user_email', 'password'] as $confirmableField) { - $confirmationField = "{$confirmableField}_confirmation"; - if ($params[$confirmationField] !== $params[$confirmationField]) { - return response([ - 'form_error' => ['user' => [$confirmationField => osu_trans('model_validation.wrong_confirmation')]], - ], 422); - } - } - } - } elseif (!$fromClient) { - return error_popup(osu_trans('users.store.from_client'), 403); } - $countryCode = request_country(); - $country = Country::find($countryCode); - $params['user_ip'] = $ip; - $params['country_acronym'] = $country === null ? '' : $country->getKey(); - - $registration = new UserRegistration($params); - - try { - $registration->assertValid(); - - if (get_bool($rawParams['check'] ?? null)) { - return response(null, 204); - } - - $throttleKey = 'registration:asn:'.app('ip2asn')->lookup($ip); - - if (app(RateLimiter::class)->tooManyAttempts($throttleKey, 10)) { - abort(429); - } - - $registration->save(); - app(RateLimiter::class)->hit($throttleKey, 600); - - $user = $registration->user(); - - if ($country === null) { - app('sentry')->getClient()->captureMessage( - 'User registered from unknown country: '.$countryCode, - null, - (new Scope()) - ->setExtra('country', $countryCode) - ->setExtra('ip', $ip) - ->setExtra('user_id', $user->getKey()) - ); - } - - if ($webRegistration) { - $this->login($user); - session()->flash('popup', osu_trans('users.store.saved')); - - return ujs_redirect(route('home')); - } else { - return json_item($user->fresh(), new CurrentUserTransformer()); - } - } catch (ValidationException $e) { - return response(['form_error' => [ - 'user' => $registration->user()->validationErrors()->all(), - ]], 422); - } + return $this->storeUser($rawParams); } /** @@ -981,4 +929,72 @@ private function fillDeprecatedDuplicateFields(array $userJson): array return $userJson; } + + private function storeUser(array $rawParams) + { + if (!config('osu.user.allow_registration')) { + return abort(403, 'User registration is currently disabled'); + } + + $ip = Request::ip(); + + if (IpBan::where('ip', '=', $ip)->exists()) { + return error_popup('Banned IP', 403); + } + + $params = get_params($rawParams, 'user', [ + 'password', + 'user_email', + 'username', + ], ['null_missing' => true]); + $countryCode = request_country(); + $country = Country::find($countryCode); + $params['user_ip'] = $ip; + $params['country_acronym'] = $country === null ? '' : $country->getKey(); + + $registration = new UserRegistration($params); + + try { + $registration->assertValid(); + + if (get_bool($rawParams['check'] ?? null)) { + return response(null, 204); + } + + $throttleKey = 'registration:asn:'.app('ip2asn')->lookup($ip); + + if (app(RateLimiter::class)->tooManyAttempts($throttleKey, 10)) { + abort(429); + } + + $registration->save(); + app(RateLimiter::class)->hit($throttleKey, 600); + + $user = $registration->user(); + + if ($country === null) { + app('sentry')->getClient()->captureMessage( + 'User registered from unknown country: '.$countryCode, + null, + (new Scope()) + ->setExtra('country', $countryCode) + ->setExtra('ip', $ip) + ->setExtra('user_id', $user->getKey()) + ); + } + + if (config('osu.user.registration_mode') === 'web') { + $this->login($user); + session()->flash('popup', osu_trans('users.store.saved')); + + return ujs_redirect(route('home')); + } else { + return json_item($user->fresh(), new CurrentUserTransformer()); + } + } catch (ValidationException $e) { + return response(['form_error' => [ + 'user' => $registration->user()->validationErrors()->all(), + ]], 422); + } + } } diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index c9d8eb3ebb2..8d37a3d5784 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -19,20 +19,17 @@ class VerifyCsrfToken extends BaseVerifier 'payments/paypal/ipn', 'payments/shopify/callback', 'payments/xsolla/callback', + 'users', ]; public function handle($request, Closure $next) { - $currentRouteData = app('route-section')->getCurrent(); - $currentRoute = "{$currentRouteData['controller']}@{$currentRouteData['action']}"; - - if ($currentRoute === 'users_controller@store' && config('osu.user.registration_mode') === 'client') { - return $next($request); - } - try { return parent::handle($request, $next); } catch (TokenMismatchException $e) { + $currentRouteData = app('route-section')->getCurrent(); + $currentRoute = "{$currentRouteData['controller']}@{$currentRouteData['action']}"; + if ($currentRoute === 'sessions_controller@store') { DatadogLoginAttempt::log('invalid_csrf'); } diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index 7af290e4e1b..288a497fc0e 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -8,7 +8,7 @@ @include('layout._page_header_v4')
    name('users.check-username-exists'); Route::get('users/disabled', 'UsersController@disabled')->name('users.disabled'); Route::get('users/create', 'UsersController@create')->name('users.create'); + Route::post('users/store-web', 'UsersController@storeWeb')->name('users.store-web'); Route::group(['as' => 'users.', 'prefix' => 'users/{user}'], function () { Route::get('card', 'UsersController@card')->name('card'); diff --git a/tests/Controllers/UsersControllerTest.php b/tests/Controllers/UsersControllerTest.php index 0f183d6408e..0b84bfab6e5 100644 --- a/tests/Controllers/UsersControllerTest.php +++ b/tests/Controllers/UsersControllerTest.php @@ -50,6 +50,26 @@ public function testStore() $this->assertSame($previousCount + 1, User::count()); } + public function testStoreRegModeWeb() + { + config()->set('osu.user.registration_mode', 'web'); + $this->expectCountChange(fn () => User::count(), 0); + + $this + ->json('POST', route('users.store'), [ + 'user' => [ + 'username' => 'user1', + 'user_email' => 'user1@example.com', + 'password' => 'hunter22', + ], + ], [ + 'HTTP_USER_AGENT' => config('osu.client.user_agent'), + ])->assertStatus(403) + ->assertJsonFragment([ + 'error' => osu_trans('users.store.from_web'), + ]); + } + /** * Passing check=1 only validates user and not create. */ @@ -111,6 +131,57 @@ public function testStoreInvalid() $this->assertSame($previousCount, User::count()); } + public function testStoreWebRegModeClient() + { + $this->expectCountChange(fn () => User::count(), 0); + + $this->post(route('users.store'), [ + 'user' => [ + 'username' => 'user1', + 'user_email' => 'user1@example.com', + 'password' => 'hunter22', + ], + ])->assertStatus(403) + ->assertJsonFragment([ + 'error' => osu_trans('users.store.from_client'), + ]); + } + + public function testStoreWeb(): void + { + config()->set('osu.user.registration_mode', 'web'); + $this->expectCountChange(fn () => User::count(), 1); + + $this->post(route('users.store-web'), [ + 'user' => [ + 'username' => 'user1', + 'user_email' => 'user1@example.com', + 'user_email_confirmation' => 'user1@example.com', + 'password' => 'hunter22', + 'password_confirmation' => 'hunter22', + ], + ])->assertRedirect(route('home')); + } + + /** + * @dataProvider dataProviderForStoreWebInvalidParams + */ + public function testStoreWebInvalidParams($username, $email, $emailConfirmation, $password, $passwordConfirmation): void + { + config()->set('osu.user.registration_mode', 'web'); + $this->expectCountChange(fn () => User::count(), 0); + + $this->post(route('users.store-web'), [ + 'user' => [ + 'username' => $username, + 'user_email' => $email, + 'user_email_confirmation' => $emailConfirmation, + 'password' => $password, + 'password_confirmation' => $passwordConfirmation, + ], + ])->assertStatus(422); + } + public function testStoreWithCountry() { $country = Country::inRandomOrder()->first() ?? Country::factory()->create(); @@ -223,6 +294,28 @@ public function testUsernameRedirectToIdForApi() ->assertSuccessful(); } + public function dataProviderForStoreWebInvalidParams(): array + { + return [ + ['user1', 'user@email.com', 'user@email.com', 'short', 'short'], + ['user1', 'user@email.com', 'user@email.com', '', ''], + ['user1', 'user@email.com', 'user@email.com', 'userpassword', 'userpassword1'], + ['user1', 'user@email.com', 'user@email.com', 'userpassword', null], + ['user1', 'user@email.com', 'user@email.com', null, null], + + ['user1', 'notemail@.com', 'notemail@.com', 'userpassword', 'userpassword'], + ['user1', '', '', 'userpassword', 'userpassword'], + ['user1', 'user@email.com', 'user1@email.com', 'userpassword', 'userpassword'], + ['user1', 'user@email.com', null, 'userpassword', 'userpassword'], + ['user1', null, null, 'userpassword', 'userpassword'], + + [null, 'user@email.com', 'user@email.com', 'userpassword', 'userpassword'], + ['', 'user@email.com', 'user@email.com', 'userpassword', 'userpassword'], + [null, 'user@email.com', 'user@email.com', null, null], + [null, null, null, 'userpassword', 'userpassword'], + ]; + } + protected function setUp(): void { parent::setUp(); From 799c38e85484668556cf5c54e922948e39d5336f Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 18:34:53 +0900 Subject: [PATCH 0418/1261] No need to put inside the before/after --- resources/assets/less/bem/mod.less | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/resources/assets/less/bem/mod.less b/resources/assets/less/bem/mod.less index 0de7a7d3582..3c6a23de64d 100644 --- a/resources/assets/less/bem/mod.less +++ b/resources/assets/less/bem/mod.less @@ -14,10 +14,7 @@ .all(@name, @filename) { &--@{name} { .at2x-simple("~@images/badges/mods/mod_@{filename}.png"); - - &::after, &::before { - --generic-display: none; - } + --generic-display: none; } } From 742120f859763daa97d9de0d6c6fc249bf839cee Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 18:40:19 +0900 Subject: [PATCH 0419/1261] add websocket connection example for javascript --- resources/views/docs/_websocket.md | 13 ++++++++ resources/views/docs/_websocket_commands.md | 32 +++++++++++++++++++ resources/views/docs/_websocket_events.md | 12 ++----- .../scribe/partials/frontmatter.blade.php | 1 + 4 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 resources/views/docs/_websocket_commands.md diff --git a/resources/views/docs/_websocket.md b/resources/views/docs/_websocket.md index 44f0a08454f..4e09510672c 100644 --- a/resources/views/docs/_websocket.md +++ b/resources/views/docs/_websocket.md @@ -7,6 +7,19 @@ wscat -c "{notification_endpoint}" -H "Authorization: Bearer {{token}}" ``` +```javascript +// Requires nodejs with using ESM. +// Browser WebSocket does not support header option. +import WebSocket from 'ws'; + +const url = 'notification-endpoint'; +const token = 'some-token'; +const headers = { Authorization: `Bearer ${token}`}; + +const ws = new WebSocket(url, [], { headers }); +ws.on('message', (buffer) => console.log(buffer.toString())); +``` + > The above command will wait and display new notifications as they arrive This endpoint allows you to receive notifications and chat events without constantly polling the server. diff --git a/resources/views/docs/_websocket_commands.md b/resources/views/docs/_websocket_commands.md new file mode 100644 index 00000000000..b827a74e2c7 --- /dev/null +++ b/resources/views/docs/_websocket_commands.md @@ -0,0 +1,32 @@ + +# Websocket Commands + +Similar to Websocket commands have the format: + +```json +{ + "event": "some.event" +} +``` + +Field | Type | Description +----- |-------- | ------------- +event | string | Name of the event. + +Commands currently do not have any payload. + +## chat.start + +Send to the websocket to start receiving chat messages. + +```javascript +webSocket.send(JSON.stringify({ event: 'chat.start' })); +``` + +## chat.end + +Send to the websocket to stop receiving chat messages. + +```javascript +webSocket.send(JSON.stringify({ event: 'chat.start' })); +``` diff --git a/resources/views/docs/_websocket_events.md b/resources/views/docs/_websocket_events.md index 4a25a5f892c..310358646bc 100644 --- a/resources/views/docs/_websocket_events.md +++ b/resources/views/docs/_websocket_events.md @@ -12,8 +12,8 @@ Websocket events generally have the following standard format: Field | Type | Description ----- |-------- | ------------- -event | string | Name of the event -data | object? | Event payload +event | string | Name of the event. +data | object? | Event payload. ## `logout` event @@ -59,10 +59,6 @@ Broadcast to the user when the user leaves a chat channel. [ChatChannel](#chat-channel) with `current_user_attributes`, `last_message_id`, `users` additional attributes. -## chat.end - -Send to the websocket to stop receiving chat messages. - ## chat.message.new Sent to the user when the user receives a chat message. @@ -78,7 +74,3 @@ Messages intented for a user are always sent even if the user does not currently Such messages include PM and Announcement messages. Other messages, e.g. public channel messages are not sent if the user is no longer present in the channel. - -## chat.start - -Send to the websocket to start receiving chat messages. diff --git a/resources/views/vendor/scribe/partials/frontmatter.blade.php b/resources/views/vendor/scribe/partials/frontmatter.blade.php index 5e6afcc79de..c234dc19fef 100644 --- a/resources/views/vendor/scribe/partials/frontmatter.blade.php +++ b/resources/views/vendor/scribe/partials/frontmatter.blade.php @@ -18,6 +18,7 @@ - "../views/docs/_using_chat.md" - "../views/docs/_websocket.md" - "../views/docs/_websocket_events.md" +- "../views/docs/_websocket_commands.md" - "../views/docs/_structures.md" - "../views/docs/_structures/*.md" From 1793cd87a01fb8181d34693e298aa642784ae0a3 Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 20:32:31 +0900 Subject: [PATCH 0420/1261] Limit to guests --- app/Http/Controllers/UsersController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index d43b15f7043..4ff0512eb61 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -71,7 +71,7 @@ class UsersController extends Controller public function __construct() { - $this->middleware('guest', ['only' => ['create', 'store']]); + $this->middleware('guest', ['only' => ['create', 'store', 'storeWeb']]); $this->middleware('auth', ['only' => [ 'checkUsernameAvailability', 'checkUsernameExists', From 9998c10331c6a8f89ec806388ac36d5b3a115f8f Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 20:37:30 +0900 Subject: [PATCH 0421/1261] Add test and adjust indents --- tests/Controllers/UsersControllerTest.php | 34 +++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tests/Controllers/UsersControllerTest.php b/tests/Controllers/UsersControllerTest.php index 0b84bfab6e5..381f1b6c863 100644 --- a/tests/Controllers/UsersControllerTest.php +++ b/tests/Controllers/UsersControllerTest.php @@ -153,14 +153,14 @@ public function testStoreWeb(): void $this->expectCountChange(fn () => User::count(), 1); $this->post(route('users.store-web'), [ - 'user' => [ - 'username' => 'user1', - 'user_email' => 'user1@example.com', - 'user_email_confirmation' => 'user1@example.com', - 'password' => 'hunter22', - 'password_confirmation' => 'hunter22', - ], - ])->assertRedirect(route('home')); + 'user' => [ + 'username' => 'user1', + 'user_email' => 'user1@example.com', + 'user_email_confirmation' => 'user1@example.com', + 'password' => 'hunter22', + 'password_confirmation' => 'hunter22', + ], + ])->assertRedirect(route('home')); } /** @@ -182,6 +182,24 @@ public function testStoreWebInvalidParams($username, $email, $emailConfirmation, ])->assertStatus(422); } + public function testStoreWebLoggedIn(): void + { + config()->set('osu.user.registration_mode', 'web'); + $user = User::factory()->create(); + + $this->expectCountChange(fn () => User::count(), 0); + + $this->actingAsVerified($user)->post(route('users.store-web'), [ + 'user' => [ + 'username' => 'user1', + 'user_email' => 'user1@example.com', + 'user_email_confirmation' => 'user1@example.com', + 'password' => 'hunter22', + 'password_confirmation' => 'hunter22', + ], + ])->assertRedirect('/'); + } + public function testStoreWithCountry() { $country = Country::inRandomOrder()->first() ?? Country::factory()->create(); From af430dcd18f48f1c64614d8f923b7de7b830e94c Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 21:43:15 +0900 Subject: [PATCH 0422/1261] correct text --- resources/views/docs/_websocket_commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/docs/_websocket_commands.md b/resources/views/docs/_websocket_commands.md index b827a74e2c7..4fc7777889e 100644 --- a/resources/views/docs/_websocket_commands.md +++ b/resources/views/docs/_websocket_commands.md @@ -1,7 +1,7 @@ # Websocket Commands -Similar to Websocket commands have the format: +Websocket commands have the format: ```json { From 630ebfcb642e0c27bb5acb86b6908cfdbf84b7b9 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Thu, 12 Jan 2023 21:48:12 +0900 Subject: [PATCH 0423/1261] remove code block from event title --- resources/views/docs/_websocket_events.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/docs/_websocket_events.md b/resources/views/docs/_websocket_events.md index 310358646bc..815f3328494 100644 --- a/resources/views/docs/_websocket_events.md +++ b/resources/views/docs/_websocket_events.md @@ -15,12 +15,12 @@ Field | Type | Description event | string | Name of the event. data | object? | Event payload. -## `logout` event +## logout event User session using same authentication key has been logged out (not yet implemented for OAuth authentication). Server will disconnect session after sending this event so don't try to reconnect. -## `new` event +## new event Sent when a new notification is received. @@ -28,7 +28,7 @@ Sent when a new notification is received. See [Notification](#notification) object for notification types. -## `read` event +## read event Sent when a notification has been read. From b1fdbd1a768b58d84e14e5e220417bba49a18af4 Mon Sep 17 00:00:00 2001 From: nanaya Date: Thu, 12 Jan 2023 19:34:04 +0900 Subject: [PATCH 0424/1261] Start dependencies from docker compose instead --- .github/workflows/tests.yml | 66 ++++++------------------------------- docker-compose.yml | 6 ++++ 2 files changed, 16 insertions(+), 56 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 69d3a363f78..970d47f950c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,11 +11,9 @@ env: APP_URL: http://localhost:8000 CACHE_DRIVER: redis DB_HOST: 127.0.0.1 - DB_USERNAME: root ES_SOLO_SCORES_HOST: http://localhost:9200 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NOTIFICATION_ENDPOINT: ws://127.0.0.1:2345 - NOTIFICATION_REDIS_HOST: 127.0.0.1 OSU_INSTALL_DEV: 1 OSU_USE_SYSTEM_COMPOSER: 1 OSU_DB_CREATE: 1 @@ -101,64 +99,20 @@ jobs: php: ['8.0'] name: Tests runs-on: ubuntu-latest - services: - db: - image: mysql:8.0 - ports: - - 3306:3306 - options: >- - --health-cmd="mysqladmin ping" - --health-interval=10s - --health-timeout=5s - --health-retries=5 - -e MYSQL_ALLOW_EMPTY_PASSWORD=1 - --entrypoint sh mysql:8.0 -c "exec docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password" - - elasticsearch: - env: - action.auto_create_index: false - discovery.type: single-node - ingest.geoip.downloader.enabled: false - image: elasticsearch:7.17.6 - ports: - - 9200:9200 - - redis: - image: redis - ports: - - 6379:6379 - - osu-beatmap-difficulty-lookup-cache: - image: pppy/osu-beatmap-difficulty-lookup-cache - ports: - - 5000:80 - - osu-elastic-indexer: - image: pppy/osu-elastic-indexer - options: >- - -e DB_CONNECTION_STRING=Server=db;Database=osu;Uid=root - -e ES_HOST=http://elasticsearch:9200 - -e REDIS_HOST=redis - -e SCHEMA=test - --entrypoint sh pppy/osu-elastic-indexer -c "exec dotnet osu.ElasticIndexer.dll queue watch --force-version --wait" - - osu-notification-server: - env: - APP_KEY: ${{ env.APP_KEY }} - DB_HOST: db - DB_USERNAME: ${{ env.DB_USERNAME }} - NOTIFICATION_REDIS_HOST: redis - NOTIFICATION_SERVER_LISTEN_HOST: 0.0.0.0 - PASSPORT_PUBLIC_KEY: ${{ env.PASSPORT_PUBLIC_KEY }} - REDIS_HOST: redis - image: pppy/osu-notification-server - ports: - - 2345:2345 - steps: - name: Checkout uses: actions/checkout@v3 + - name: Services + run: 'docker compose up --quiet-pull --wait + beatmap-difficulty-lookup-cache + db + elasticsearch + notification-server + redis + score-indexer + ' + - name: Setup node.js uses: actions/setup-node@v3 with: diff --git a/docker-compose.yml b/docker-compose.yml index c5212a07ebd..bd8e40a29b0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ version: '3.4' x-env: &x-env + APP_KEY: "${APP_KEY}" BEATMAPS_DIFFICULTY_CACHE_SERVER_URL: http://beatmap-difficulty-lookup-cache:5000 BROADCAST_DRIVER: redis CACHE_DRIVER: redis @@ -11,6 +12,7 @@ x-env: &x-env ES_SOLO_SCORES_HOST: http://elasticsearch:9200 GITHUB_TOKEN: "${GITHUB_TOKEN}" NOTIFICATION_REDIS_HOST: redis + PASSPORT_PUBLIC_KEY: "${PASSPORT_PUBLIC_KEY:-}" REDIS_HOST: redis SESSION_DRIVER: redis @@ -57,6 +59,8 @@ services: beatmap-difficulty-lookup-cache: image: pppy/osu-beatmap-difficulty-lookup-cache + ports: + - "${BEATMAPS_DIFFICULTY_CACHE_EXTERNAL_PORT:-5000}:80" notification-server: image: pppy/osu-notification-server @@ -70,6 +74,8 @@ services: - ./storage/oauth-public.key:/app/oauth-public.key environment: <<: *x-env + ports: + - "${NOTIFICATION_EXTERNAL_PORT:-2345}:2345" notification-server-dusk: image: pppy/osu-notification-server From 36abe425cc4cd6ba187b3d5486aa90ab38b6e5c4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 13 Jan 2023 15:41:10 +0900 Subject: [PATCH 0425/1261] Update registration redirection message to slightly better english --- resources/lang/en/users.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/en/users.php b/resources/lang/en/users.php index 06f936671f3..700e7056ff5 100644 --- a/resources/lang/en/users.php +++ b/resources/lang/en/users.php @@ -468,7 +468,7 @@ ], 'store' => [ 'from_client' => 'please register via the game client instead!', - 'from_web' => 'please register through web', + 'from_web' => 'please complete registration using the osu! website', 'saved' => 'User created', ], 'verify' => [ From ef5b578463b9f08b88f129b6207044764e874df3 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 13 Jan 2023 15:56:53 +0900 Subject: [PATCH 0426/1261] bump karma and jasmine versions --- package.json | 14 +- yarn.lock | 470 ++++++++++++++++++--------------------------------- 2 files changed, 170 insertions(+), 314 deletions(-) diff --git a/package.json b/package.json index 0d10190a108..f8860630acd 100644 --- a/package.json +++ b/package.json @@ -103,14 +103,14 @@ "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-typescript-sort-keys": "^1.7.0", - "jasmine-core": "^3.4.0", - "karma": "^6.3.16", - "karma-chrome-launcher": "^2.2.0", - "karma-jasmine": "^2.0.1", + "jasmine-core": "^4.1.0", + "karma": "^6.4.1", + "karma-chrome-launcher": "^3.1.1", + "karma-jasmine": "^5.1.0", "karma-mocha-reporter": "^2.2.5", - "karma-sourcemap-loader": "^0.3.7", - "karma-typescript": "^5.0.2", - "karma-webpack": "3.0.0", + "karma-sourcemap-loader": "^0.3.8", + "karma-typescript": "^5.5.3", + "karma-webpack": "^5.0.0", "mobx-react-devtools": "^6.0.3" } } diff --git a/yarn.lock b/yarn.lock index 4da5a77c907..f78271fd7d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,6 +190,11 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@discordapp/twemoji@^14.0.2": version "14.0.2" resolved "https://registry.yarnpkg.com/@discordapp/twemoji/-/twemoji-14.0.2.tgz#50cc19f6f3769dc6b36eb251421b5f5d4629e837" @@ -267,10 +272,10 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@socket.io/base64-arraybuffer@~1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#568d9beae00b0d835f4f8c53fd55714986492e61" - integrity sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ== +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== "@types/anymatch@*": version "1.3.1" @@ -284,11 +289,6 @@ dependencies: "@types/jquery" "*" -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== - "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -969,21 +969,26 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn-walk@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.1.0: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1117,11 +1122,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-includes@^3.1.2, array-includes@^3.1.3, array-includes@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" @@ -1233,13 +1233,6 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async@^2.0.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772" @@ -1288,14 +1281,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-runtime@^6.0.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - bail@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.4.tgz#7181b66d508aa3055d3f6c13f0a0c720641dde9b" @@ -1459,12 +1444,12 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== dependencies: - resolve "1.1.7" + resolve "^1.17.0" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -1941,11 +1926,6 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -colors@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - combine-source-map@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" @@ -1983,7 +1963,7 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1, component-emitter@~1.3.0: +component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -2101,11 +2081,6 @@ copy-webpack-plugin@^6.0.3: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -core-js@^2.4.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2383,13 +2358,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -2644,14 +2612,6 @@ d3@^7.1.1: d3-transition "3" d3-zoom "3" -d@1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2659,10 +2619,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-format@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.3.tgz#f63de5dc08dc02efd8ef32bf2a6918e486f35873" - integrity sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ== +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== deasync@^0.1.26: version "0.1.26" @@ -2686,7 +2646,7 @@ debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2891,10 +2851,10 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domain-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.0.0.tgz#45021cf8d2928f116b89a3308c3c30b746776909" - integrity sha512-q9seD1JK98fzT69I0sAzp0cxb6gUS1grmCaq6cLxTbm9msb9eqYFXGJU94VOIOi2nKmYmKdUFkTnGvIViuX9qA== +domain-browser@^4.16.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" + integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== domelementtype@1: version "1.3.1" @@ -3010,17 +2970,15 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-parser@~5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.3.tgz#ca1f0d7b11e290b4bfda251803baea765ed89c09" - integrity sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg== - dependencies: - "@socket.io/base64-arraybuffer" "~1.0.2" +engine.io-parser@~5.0.3: + version "5.0.5" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.5.tgz#c6fa52e57d8d2dc68b24754348f779aa6e44f886" + integrity sha512-mjEyaa4zhuuRhaSLOdjEb57X0XPP9JEsnXI4E+ivhwT0GgzUogARx4MqoY1jQyB+4Bkz3BUOmzL7t9RMKmlG3g== -engine.io@~6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.2.tgz#e7b9d546d90c62246ffcba4d88594be980d3855a" - integrity sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ== +engine.io@~6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.1.tgz#e3f7826ebc4140db9bbaa9021ad6b1efb175878f" + integrity sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -3030,7 +2988,7 @@ engine.io@~6.1.0: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.0" + engine.io-parser "~5.0.3" ws "~8.2.3" enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: @@ -3116,24 +3074,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14: - version "0.10.50" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" - integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "^1.0.0" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" @@ -3144,14 +3084,6 @@ es6-promise-pool@^2.5.0: resolved "https://registry.yarnpkg.com/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz#147c612b36b47f105027f9d2bf54a598a99d9ccb" integrity sha1-FHxhKza0fxBQJ/nSv1SlmKmdnMs= -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3392,10 +3324,10 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== +events@^3.0.0, events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3645,10 +3577,10 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flatted@^3.1.0, flatted@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" - integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== +flatted@^3.1.0, flatted@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flush-write-stream@^1.0.0: version "1.1.1" @@ -3716,23 +3648,7 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-access@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" - integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= - dependencies: - null-check "^1.0.0" - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^8.0.1: +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -4359,7 +4275,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4515,10 +4431,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0, is-core-module@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== +is-core-module@^2.2.0, is-core-module@^2.4.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" @@ -4857,10 +4773,10 @@ istanbul-reports@^3.0.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jasmine-core@^3.3, jasmine-core@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.4.0.tgz#2a74618e966026530c3518f03e9f845d26473ce3" - integrity sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg== +jasmine-core@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.5.0.tgz#1a6bd0bde3f60996164311c88a0995d67ceda7c3" + integrity sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw== jest-worker@^26.3.0: version "26.6.2" @@ -5027,20 +4943,19 @@ jsprim@^1.2.2: array-includes "^3.1.2" object.assign "^4.1.2" -karma-chrome-launcher@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" - integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== +karma-chrome-launcher@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" + integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== dependencies: - fs-access "^1.0.0" which "^1.2.1" -karma-jasmine@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-2.0.1.tgz#26e3e31f2faf272dd80ebb0e1898914cc3a19763" - integrity sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA== +karma-jasmine@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-5.1.0.tgz#3af4558a6502fa16856a0f346ec2193d4b884b2f" + integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== dependencies: - jasmine-core "^3.3" + jasmine-core "^4.1.0" karma-mocha-reporter@^2.2.5: version "2.2.5" @@ -5051,23 +4966,23 @@ karma-mocha-reporter@^2.2.5: log-symbols "^2.1.0" strip-ansi "^4.0.0" -karma-sourcemap-loader@^0.3.7: +karma-sourcemap-loader@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== dependencies: graceful-fs "^4.1.2" -karma-typescript@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/karma-typescript/-/karma-typescript-5.0.2.tgz#f5c118b0d7d3ba2711afaebbc48e583f39eae1f6" - integrity sha512-cq3ETrnYMynLvUt29bqZhKMCHHDcqx0v0SfcsFqQsn/WWbMqXHNZq9dOLVXt6t3PiqfL0SLGq317LSNVmgLtqw== +karma-typescript@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/karma-typescript/-/karma-typescript-5.5.3.tgz#29c04d9677f8bd78dfacd89e8fa6f475dd25aba2" + integrity sha512-l1FHurolXEBIzRa9ExpNtjzysAhsi/vLpTazpwLHWWK86mknvVpqor6pRZ5Nid7jvOPrTBqAq0JRuLgiCdRkFw== dependencies: - acorn "^7.1.0" - acorn-walk "^7.0.0" + acorn "^8.1.0" + acorn-walk "^8.0.2" assert "^2.0.0" async "^3.0.1" - browser-resolve "^1.11.3" + browser-resolve "^2.0.0" browserify-zlib "^0.2.0" buffer "^5.4.3" combine-source-map "^0.8.0" @@ -5076,8 +4991,8 @@ karma-typescript@^5.0.2: convert-source-map "^1.7.0" crypto-browserify "^3.12.0" diff "^4.0.1" - domain-browser "^4.0.0" - events "^3.0.0" + domain-browser "^4.16.0" + events "^3.2.0" glob "^7.1.6" https-browserify "^1.0.0" istanbul-lib-coverage "^3.0.0" @@ -5086,8 +5001,8 @@ karma-typescript@^5.0.2: istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.0" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - log4js "^6.1.0" + lodash "^4.17.19" + log4js "^6.3.0" minimatch "^3.0.4" os-browserify "^0.3.0" pad "^3.2.0" @@ -5097,37 +5012,34 @@ karma-typescript@^5.0.2: querystring-es3 "^0.2.1" readable-stream "^3.1.1" source-map "^0.7.3" - stream-browserify "^2.0.2" + stream-browserify "^3.0.0" stream-http "^3.1.0" string_decoder "^1.3.0" timers-browserify "^2.0.11" - tmp "^0.1.0" + tmp "^0.2.1" tty-browserify "^0.0.1" url "^0.11.0" util "^0.12.1" vm-browserify "^1.1.2" -karma-webpack@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-3.0.0.tgz#bf009c5b73c667c11c015717e9e520f581317c44" - integrity sha512-Ja1o9LLoqWaJyUNhTKaXjWiEH9y7a9H3mzP8pYB30SBsgoF5KBS/65NeHFd+QPuT9ITrym8xFt8BZeGbcOfujA== +karma-webpack@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== dependencies: - async "^2.0.0" - babel-runtime "^6.0.0" - loader-utils "^1.0.0" - lodash "^4.0.0" - source-map "^0.5.6" - webpack-dev-middleware "^2.0.6" + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" -karma@^6.3.16: - version "6.3.16" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.16.tgz#76d1a705fd1cf864ee5ed85270b572641e0958ef" - integrity sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ== +karma@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.1.tgz#f2253716dd3a41aaa813fa9f54b6ee047e1127d9" + integrity sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA== dependencies: + "@colors/colors" "1.5.0" body-parser "^1.19.0" braces "^3.0.2" chokidar "^3.5.1" - colors "1.4.0" connect "^3.7.0" di "^0.0.1" dom-serialize "^2.2.1" @@ -5143,7 +5055,7 @@ karma@^6.3.16: qjobs "^1.2.0" range-parser "^1.2.1" rimraf "^3.0.2" - socket.io "^4.2.0" + socket.io "^4.4.1" source-map "^0.6.1" tmp "^0.2.1" ua-parser-js "^0.7.30" @@ -5257,7 +5169,7 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -5318,7 +5230,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5330,24 +5242,16 @@ log-symbols@^2.1.0: dependencies: chalk "^2.0.1" -log4js@^6.1.0, log4js@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.4.1.tgz#9d3a8bf2c31c1e213fe3fc398a6053f7a2bc53e8" - integrity sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg== +log4js@^6.3.0, log4js@^6.4.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.1.tgz#06e12b1ac915dd1067146ffad8215f666f7d2c51" + integrity sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ== dependencies: - date-format "^4.0.3" - debug "^4.3.3" - flatted "^3.2.4" + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" rfdc "^1.3.0" - streamroller "^3.0.2" - -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A== - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" + streamroller "^3.1.3" loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -5356,14 +5260,6 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5471,7 +5367,7 @@ memfs@^3.1.2: dependencies: fs-monkey "1.0.3" -memory-fs@^0.4.1, memory-fs@~0.4.1: +memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -5549,7 +5445,7 @@ mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.1.0, mime@^2.5.2: +mime@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== @@ -5787,11 +5683,6 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -5929,11 +5820,6 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" -null-check@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" - integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= - num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -5985,7 +5871,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: +object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -6317,7 +6203,7 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -6916,7 +6802,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@^1.2.1: +range-parser@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -7031,7 +6917,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7056,11 +6942,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -7257,18 +7138,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.20.0, resolve@^1.3.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: version "2.0.0-next.3" @@ -7620,31 +7497,30 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-adapter@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" - integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ== +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== -socket.io-parser@~4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.5.tgz#cb404382c32324cc962f27f3a44058cf6e0552df" - integrity sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig== +socket.io-parser@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" + integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@^4.2.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8" - integrity sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg== +socket.io@^4.4.1: + version "4.5.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.4.tgz#a4513f06e87451c17013b8d13fdfaf8da5a86a90" + integrity sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ== dependencies: accepts "~1.3.4" base64id "~2.0.0" debug "~4.3.2" - engine.io "~6.1.0" - socket.io-adapter "~2.3.3" - socket.io-parser "~4.0.4" + engine.io "~6.2.1" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.2.1" source-list-map@^2.0.0: version "2.0.1" @@ -7785,7 +7661,7 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-browserify@^2.0.1, stream-browserify@^2.0.2: +stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== @@ -7793,6 +7669,14 @@ stream-browserify@^2.0.1, stream-browserify@^2.0.2: inherits "~2.0.1" readable-stream "^2.0.2" +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -7827,14 +7711,14 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= -streamroller@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.0.2.tgz#30418d0eee3d6c93ec897f892ed098e3a81e68b7" - integrity sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA== +streamroller@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.4.tgz#844a18e795d39c1089a8216e66a1cf1151271df0" + integrity sha512-Ha1Ccw2/N5C/IF8Do6zgNe8F3jQo8MPBnMBGvX0QjNv/I97BcNRzK6/mzOpZHHK7DjMLTI3c7Xw7Y1KvdChkvw== dependencies: - date-format "^4.0.3" - debug "^4.1.1" - fs-extra "^10.0.0" + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" string-width@^1.0.1: version "1.0.2" @@ -7993,6 +7877,11 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svgo@^1.0.0: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -8123,13 +8012,6 @@ tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmp@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - tmp@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -8306,11 +8188,6 @@ type-is@~1.6.17: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" - integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -8511,11 +8388,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-join@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" - integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -8573,7 +8445,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.1.0, uuid@^3.3.2: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -8703,28 +8575,12 @@ webpack-cli@^3.3.12: v8-compile-cache "^2.1.1" yargs "^13.3.2" -webpack-dev-middleware@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz#a51692801e8310844ef3e3790e1eacfe52326fd4" - integrity sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw== - dependencies: - loud-rejection "^1.6.0" - memory-fs "~0.4.1" - mime "^2.1.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - url-join "^2.0.2" - webpack-log "^1.0.1" - -webpack-log@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" - integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA== +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" + lodash "^4.17.15" webpack-sentry-plugin@^2.0.2: version "2.0.3" From 963ed302f1558b00f50b2c93ffb9c41cc46f52bd Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 13 Jan 2023 16:13:00 +0900 Subject: [PATCH 0427/1261] add webpack to frameworks --- karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index 72e2edc328b..80b8e49e390 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -77,7 +77,7 @@ module.exports = function(config) { concurrency: Infinity, exclude: [], files, - frameworks: ['jasmine'], + frameworks: ['jasmine', 'webpack'], logLevel: config.LOG_INFO, mime: { 'text/x-typescript': ['ts', 'tsx'] }, port: 9876, From 9c8bd12aef40f287f023cc892f3bd8bc1f834724 Mon Sep 17 00:00:00 2001 From: nanaya Date: Fri, 13 Jan 2023 16:13:42 +0900 Subject: [PATCH 0428/1261] Better variable name --- app/Libraries/NotificationsBundle.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Libraries/NotificationsBundle.php b/app/Libraries/NotificationsBundle.php index ffa3d934c44..516b8fb5bd1 100644 --- a/app/Libraries/NotificationsBundle.php +++ b/app/Libraries/NotificationsBundle.php @@ -148,12 +148,12 @@ private function fillStackTotal(): void $query->where('is_read', false); } - foreach ($query->get() as $count) { - $name = $count->getRawAttribute('name'); + foreach ($query->get() as $row) { + $name = $row->getRawAttribute('name'); $category = Notification::NAME_TO_CATEGORY[$name] ?? $name; - $key = "{$count->getRawAttribute('notifiable_type')}-{$count->getRawAttribute('notifiable_id')}-{$category}"; + $key = "{$row->getRawAttribute('notifiable_type')}-{$row->getRawAttribute('notifiable_id')}-{$category}"; $this->stacks[$key]['total'] ??= 0; - $this->stacks[$key]['total'] += $count->getRawAttribute('count'); + $this->stacks[$key]['total'] += $row->getRawAttribute('count'); } } From f3bc81ce4fab4a9539ec06f0c979447848201aa6 Mon Sep 17 00:00:00 2001 From: nanaya Date: Fri, 13 Jan 2023 16:28:51 +0900 Subject: [PATCH 0429/1261] Function to generate stack key --- app/Libraries/NotificationsBundle.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/Libraries/NotificationsBundle.php b/app/Libraries/NotificationsBundle.php index 516b8fb5bd1..512674d2655 100644 --- a/app/Libraries/NotificationsBundle.php +++ b/app/Libraries/NotificationsBundle.php @@ -16,6 +16,11 @@ class NotificationsBundle const PER_STACK_LIMIT = 50; const STACK_LIMIT = 50; + private static function stackKey(string $objectType, int $objectId, string $category): string + { + return "{$objectType}-{$objectId}-{$category}"; + } + private $category; private $cursorId; private $objectId; @@ -64,7 +69,7 @@ public function toArray() private function fillStacks(string $objectType, int $objectId, string $category) { - $key = "{$objectType}-{$objectId}-{$category}"; + $key = static::stackKey($objectType, $objectId, $category); // skip multiple notification names mapped to the same category. if (isset($this->stacks[$key])) { return; @@ -151,7 +156,7 @@ private function fillStackTotal(): void foreach ($query->get() as $row) { $name = $row->getRawAttribute('name'); $category = Notification::NAME_TO_CATEGORY[$name] ?? $name; - $key = "{$row->getRawAttribute('notifiable_type')}-{$row->getRawAttribute('notifiable_id')}-{$category}"; + $key = static::stackKey($row->getRawAttribute('notifiable_type'), $row->getRawAttribute('notifiable_id'), $category); $this->stacks[$key]['total'] ??= 0; $this->stacks[$key]['total'] += $row->getRawAttribute('count'); } From 1d429063a5e8ab43036e3653e9ecf16e15edda0a Mon Sep 17 00:00:00 2001 From: nanaya Date: Fri, 13 Jan 2023 17:51:04 +0900 Subject: [PATCH 0430/1261] Fix fallback mod Always show the passed acronym (hopefully it's acronym otherwise it'll overflow) and fix type name as it should be capitalised. Oh and don't show tooltip. --- resources/assets/lib/components/mod.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/assets/lib/components/mod.tsx b/resources/assets/lib/components/mod.tsx index dae081acd5b..799b100aefe 100644 --- a/resources/assets/lib/components/mod.tsx +++ b/resources/assets/lib/components/mod.tsx @@ -11,9 +11,9 @@ interface Props { export default function Mod({ mod }: Props) { const modJson = modNames[mod] ?? { - acronym: '??', - name: '??', - type: 'fun', + acronym: mod, + name: '', + type: 'Fun', }; return ( From 1dbd0ad160377f3aa62444665e9c34112f016ae7 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 13 Jan 2023 17:56:05 +0900 Subject: [PATCH 0431/1261] formatting fixes --- resources/views/docs/_websocket_events.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/views/docs/_websocket_events.md b/resources/views/docs/_websocket_events.md index 815f3328494..11335a6fcd5 100644 --- a/resources/views/docs/_websocket_events.md +++ b/resources/views/docs/_websocket_events.md @@ -1,4 +1,3 @@ - # Websocket Events Websocket events generally have the following standard format: @@ -33,7 +32,7 @@ See [Notification](#notification) object for notification types. Sent when a notification has been read. TODO: `ids` should be moved to `data` to match other events. From 17847b540ff93a5e206da266a36e2f5177545649 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 13 Jan 2023 18:07:49 +0900 Subject: [PATCH 0432/1261] newline --- resources/views/docs/_websocket_commands.md | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/views/docs/_websocket_commands.md b/resources/views/docs/_websocket_commands.md index 4fc7777889e..701d2ffa8de 100644 --- a/resources/views/docs/_websocket_commands.md +++ b/resources/views/docs/_websocket_commands.md @@ -1,4 +1,3 @@ - # Websocket Commands Websocket commands have the format: From fe468e8b12049588ea439694d05ad3468c090d37 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Fri, 13 Jan 2023 18:01:58 +0900 Subject: [PATCH 0433/1261] Run karma after tests; karma deletes and overrides assets in the output directory now (instead of its own) --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 69d3a363f78..3700c17865f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -194,15 +194,15 @@ jobs: - name: Generate docs run: php artisan scribe:generate - - name: Run karma - run: yarn karma start --single-run --browsers ChromeHeadless - - name: Run PHPUnit run: ./bin/phpunit.sh - name: Run Dusk run: ./bin/run_dusk.sh + - name: Run karma + run: yarn karma start --single-run --browsers ChromeHeadless + # this only tests that the rollback functions are valid and doesn't check # if they actually do what they're expected to do. - name: Migration rollback test From 2f530299e9f64a974126c93a7987e83fdb2afd21 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 14:08:45 +0900 Subject: [PATCH 0434/1261] copy paste fail; should be announce --- app/Http/Controllers/Chat/ChannelsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Chat/ChannelsController.php b/app/Http/Controllers/Chat/ChannelsController.php index c92b957d0c7..1d0beb806a2 100644 --- a/app/Http/Controllers/Chat/ChannelsController.php +++ b/app/Http/Controllers/Chat/ChannelsController.php @@ -228,7 +228,7 @@ public function show($channelId) * @bodyParam channel.description string the channel description; required if `type` is `ANNOUNCE`. No-example * @bodyParam message string message to send with the announcement; required if `type` is `ANNOUNCE`. No-example * @bodyParam target_id integer target user id; required if `type` is `PM`; ignored, otherwise. Example: 2 - * @bodyParam target_ids integer[] target user ids; required if `type` is `PM`; ignored, otherwise. No-example + * @bodyParam target_ids integer[] target user ids; required if `type` is `ANNOUNCE`; ignored, otherwise. No-example * @bodyParam type string required channel type (currently only supports `PM` and `ANNOUNCE`) Example: PM * * @response { From 060eb3ffa0ed1b9f6a5b660457de0eb2bd25d7d0 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 14:53:44 +0900 Subject: [PATCH 0435/1261] index as deleted if topic is deleted --- app/Models/Traits/Es/ForumPostSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Traits/Es/ForumPostSearch.php b/app/Models/Traits/Es/ForumPostSearch.php index 23156af9ef5..621377cc1f5 100644 --- a/app/Models/Traits/Es/ForumPostSearch.php +++ b/app/Models/Traits/Es/ForumPostSearch.php @@ -53,7 +53,7 @@ public function toEsJson() foreach ($mappings as $field => $mapping) { switch ($field) { case 'is_deleted': - $value = $this->trashed(); + $value = $this->trashed() || $this->topic->trashed(); break; case 'topic_title': if ($this->topic !== null && $this->topic->topic_first_post_id === $this->getKey()) { From 8d255556e6533b7193c3df2ff26e3f471a645575 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 15:00:37 +0900 Subject: [PATCH 0436/1261] not an array --- app/Libraries/Search/ForumSearch.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Libraries/Search/ForumSearch.php b/app/Libraries/Search/ForumSearch.php index 2ddb4e3efcc..bb6b8f232c0 100644 --- a/app/Libraries/Search/ForumSearch.php +++ b/app/Libraries/Search/ForumSearch.php @@ -84,8 +84,6 @@ public function data() /** * Returns a Builder for a Collection of all the posts that appeared in this query. - * - * @return array */ public function topics(): Builder { From f1c73982183e7d42dabf75f9cb9655267dad4ac3 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 15:02:17 +0900 Subject: [PATCH 0437/1261] fix missing title of deleted topics in search --- app/Libraries/Search/ForumSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Libraries/Search/ForumSearch.php b/app/Libraries/Search/ForumSearch.php index bb6b8f232c0..3b7b4d8faa8 100644 --- a/app/Libraries/Search/ForumSearch.php +++ b/app/Libraries/Search/ForumSearch.php @@ -87,7 +87,7 @@ public function data() */ public function topics(): Builder { - return Topic::whereIn('topic_id', $this->response()->ids('topic_id')); + return Topic::withTrashed()->whereIn('topic_id', $this->response()->ids('topic_id')); } public function response(): SearchResponse From 9e3a90e8e004c9a0c1af6ff949b75a36808badbc Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 18:04:16 +0900 Subject: [PATCH 0438/1261] send mode when requesting extra-page --- resources/assets/lib/profile-page/controller.tsx | 2 +- resources/assets/lib/profile-page/extra-page.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/assets/lib/profile-page/controller.tsx b/resources/assets/lib/profile-page/controller.tsx index deee172c4ec..a81d59a9aea 100644 --- a/resources/assets/lib/profile-page/controller.tsx +++ b/resources/assets/lib/profile-page/controller.tsx @@ -368,7 +368,7 @@ export default class Controller { @action get(page: T) { - const xhr = getPage(this.state.user, page) + const xhr = getPage(this.state.user, page, this.currentMode) .done((json) => runInAction(() => { this.state.lazy[page] = json; })); diff --git a/resources/assets/lib/profile-page/extra-page.ts b/resources/assets/lib/profile-page/extra-page.ts index 1f3d68021ad..d36981156b0 100644 --- a/resources/assets/lib/profile-page/extra-page.ts +++ b/resources/assets/lib/profile-page/extra-page.ts @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import GameMode from 'interfaces/game-mode'; import { ProfileExtraPage } from 'interfaces/user-extended-json'; import UserJson from 'interfaces/user-json'; import { route } from 'laroute'; @@ -18,6 +19,7 @@ export interface PageSectionWithoutCountJson { pagination: OffsetPaginationJson; } -export default function getPage(user: Pick, page: ProfileExtraPage) { - return $.ajax(route('users.extra-page', { page, user: user.id })) as JQuery.jqXHR; +// TODO: how to require mode conditionally based on page? +export default function getPage(user: Pick, page: ProfileExtraPage, mode?: GameMode) { + return $.ajax(route('users.extra-page', { mode, page, user: user.id })) as JQuery.jqXHR; } From fd0693f0216cba15bb03291e70411056fbb227cd Mon Sep 17 00:00:00 2001 From: nanaya Date: Mon, 16 Jan 2023 18:19:58 +0900 Subject: [PATCH 0439/1261] Revert "workaround for element shrinking in Safari..." This reverts commit 7ad99cda507d4c54e142f3a1087a055beb3d6db1. --- resources/assets/less/bem/lazy-load.less | 14 ++++++-------- resources/assets/lib/components/lazy-load.tsx | 8 +------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/resources/assets/less/bem/lazy-load.less b/resources/assets/less/bem/lazy-load.less index 8600a1f38ec..66c59c442f0 100644 --- a/resources/assets/less/bem/lazy-load.less +++ b/resources/assets/less/bem/lazy-load.less @@ -2,20 +2,18 @@ // See the LICENCE file in the repository root for full licence text. .lazy-load { - display: flex; // TODO: need better min-height for different sections? // most extra pages will be larger than this unless they have less than the default number of items. min-height: 150px; // excludes the non-lazy-loaded part (e.g. headers) - align-items: center; - justify-content: center; - &__button { - text-align: center; + &--loading { + display: flex; + align-items: center; + justify-content: center; } - // workaround wrapper for Safari making consecutive blocks smaller than they should be. - &__content { - flex: 1; + &__button { + text-align: center; } &__error { diff --git a/resources/assets/lib/components/lazy-load.tsx b/resources/assets/lib/components/lazy-load.tsx index 4204c139ce7..b5fcf81c5d2 100644 --- a/resources/assets/lib/components/lazy-load.tsx +++ b/resources/assets/lib/components/lazy-load.tsx @@ -103,13 +103,7 @@ export default class LazyLoad extends React.Component - {this.props.children} -
    - ); + return this.props.children; } private renderNotLoaded() { From b315d3dfdf92a5e6e5ce45f648692898a18c6482 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 16:57:36 +0900 Subject: [PATCH 0440/1261] add message length counter to create announcements ui --- resources/assets/less/bem-index.less | 2 +- ...unter.less => message-length-counter.less} | 2 +- .../message-length-counter.tsx | 2 +- .../assets/lib/chat/create-announcement.tsx | 5 ++++ .../lib/chat/message-length-counter.tsx | 28 +++++++++++++++++++ .../lib/models/chat/create-announcement.ts | 5 ++++ 6 files changed, 41 insertions(+), 3 deletions(-) rename resources/assets/less/bem/{beatmap-discussion-message-length-counter.less => message-length-counter.less} (89%) create mode 100644 resources/assets/lib/chat/message-length-counter.tsx diff --git a/resources/assets/less/bem-index.less b/resources/assets/less/bem-index.less index decac69dcb5..34843e2a9f4 100644 --- a/resources/assets/less/bem-index.less +++ b/resources/assets/less/bem-index.less @@ -34,7 +34,6 @@ @import "bem/beatmap-discussion-editor-insertion-menu"; @import "bem/beatmap-discussion-editor-toolbar"; @import "bem/beatmap-discussion-expand"; -@import "bem/beatmap-discussion-message-length-counter"; @import "bem/beatmap-discussion-message-type"; @import "bem/beatmap-discussion-new"; @import "bem/beatmap-discussion-new-float"; @@ -215,6 +214,7 @@ @import "bem/logo"; @import "bem/love-beatmap-modal"; @import "bem/medals-group"; +@import "bem/message-length-counter"; @import "bem/mobile-menu"; @import "bem/mobile-menu-tab"; @import "bem/mod"; diff --git a/resources/assets/less/bem/beatmap-discussion-message-length-counter.less b/resources/assets/less/bem/message-length-counter.less similarity index 89% rename from resources/assets/less/bem/beatmap-discussion-message-length-counter.less rename to resources/assets/less/bem/message-length-counter.less index 3ee279b0e4b..93b6f298126 100644 --- a/resources/assets/less/bem/beatmap-discussion-message-length-counter.less +++ b/resources/assets/less/bem/message-length-counter.less @@ -1,7 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. -.beatmap-discussion-message-length-counter { +.message-length-counter { flex: 1 0 auto; font-size: @font-size--normal; text-align: right; diff --git a/resources/assets/lib/beatmap-discussions/message-length-counter.tsx b/resources/assets/lib/beatmap-discussions/message-length-counter.tsx index 961f0736863..88e5c65dc3a 100644 --- a/resources/assets/lib/beatmap-discussions/message-length-counter.tsx +++ b/resources/assets/lib/beatmap-discussions/message-length-counter.tsx @@ -21,7 +21,7 @@ export default function MessageLengthCounter({ message, isTimeline }: Props) { } return ( -
    +
    {`${message.length} / ${maxLengthTimeline}`}
    ); diff --git a/resources/assets/lib/chat/create-announcement.tsx b/resources/assets/lib/chat/create-announcement.tsx index 372adce6a85..46dad20e964 100644 --- a/resources/assets/lib/chat/create-announcement.tsx +++ b/resources/assets/lib/chat/create-announcement.tsx @@ -13,6 +13,7 @@ import { maxLength } from 'models/chat/message'; import core from 'osu-core-singleton'; import * as React from 'react'; import { trans } from 'utils/lang'; +import MessageLengthCounter from './message-length-counter'; type Props = Record; @@ -60,6 +61,7 @@ export default class CreateAnnouncement extends React.Component { onBlur={this.handleBlur} onChange={this.handleInput} /> + { onBlur={this.handleBlur} onChange={this.handleInput} /> +
    @@ -100,7 +103,9 @@ export default class CreateAnnouncement extends React.Component { placeholder={trans('chat.input.placeholder')} rows={10} /> + +
    . Licensed under the GNU Affero General Public License v3.0. +// See the LICENCE file in the repository root for full licence text. + +import * as React from 'react'; +import { classWithModifiers } from 'utils/css'; + +interface Props { + maxLength: number; + message: string; +} + +function modifier(message: string, maxLength: number) { + if (message.length > maxLength) { + return 'over'; + } else if (message.length > maxLength * 0.95) { + return 'almost-over'; + } + + return null; +} + +export default function MessageLengthCounter({ maxLength, message }: Props) { + return ( +
    + {`${message.length} / ${maxLength}`} +
    + ); +} diff --git a/resources/assets/lib/models/chat/create-announcement.ts b/resources/assets/lib/models/chat/create-announcement.ts index 0d22773cf9b..df14394e415 100644 --- a/resources/assets/lib/models/chat/create-announcement.ts +++ b/resources/assets/lib/models/chat/create-announcement.ts @@ -28,6 +28,11 @@ export function isInputKey(key: string): key is InputKey { export default class CreateAnnouncement implements FormWithErrors { @observable inputs: Record; @observable lookingUpUsers = false; + readonly maxLengths = Object.freeze({ + description: 255, + message: 1024, + name: 50, + }); @observable showError: Record; @observable validUsers = new Map(); From fe66e428814b09951e914083d204bcb4f10906dc Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 17:54:55 +0900 Subject: [PATCH 0441/1261] reuse existing counter --- .../message-length-counter.tsx | 17 +++-------------- .../assets/lib/chat/create-announcement.tsx | 2 +- .../message-length-counter.tsx | 0 3 files changed, 4 insertions(+), 15 deletions(-) rename resources/assets/lib/{chat => components}/message-length-counter.tsx (100%) diff --git a/resources/assets/lib/beatmap-discussions/message-length-counter.tsx b/resources/assets/lib/beatmap-discussions/message-length-counter.tsx index 88e5c65dc3a..e11556d7c22 100644 --- a/resources/assets/lib/beatmap-discussions/message-length-counter.tsx +++ b/resources/assets/lib/beatmap-discussions/message-length-counter.tsx @@ -1,28 +1,17 @@ // Copyright (c) ppy Pty Ltd . Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. +import MessageLengthCounter from 'components/message-length-counter'; import * as React from 'react'; import { maxLengthTimeline } from 'utils/beatmapset-discussion-helper'; -import { classWithModifiers } from 'utils/css'; interface Props { isTimeline: boolean; message: string; } -export default function MessageLengthCounter({ message, isTimeline }: Props) { +export default function DiscussionMessageLengthCounter({ message, isTimeline }: Props) { if (!isTimeline) return null; - let modifier = null; - if (message.length > maxLengthTimeline) { - modifier = 'over'; - } else if (message.length > maxLengthTimeline * 0.95) { - modifier = 'almost-over'; - } - - return ( -
    - {`${message.length} / ${maxLengthTimeline}`} -
    - ); + return ; } diff --git a/resources/assets/lib/chat/create-announcement.tsx b/resources/assets/lib/chat/create-announcement.tsx index 46dad20e964..f83d042bcb6 100644 --- a/resources/assets/lib/chat/create-announcement.tsx +++ b/resources/assets/lib/chat/create-announcement.tsx @@ -13,7 +13,7 @@ import { maxLength } from 'models/chat/message'; import core from 'osu-core-singleton'; import * as React from 'react'; import { trans } from 'utils/lang'; -import MessageLengthCounter from './message-length-counter'; +import MessageLengthCounter from '../components/message-length-counter'; type Props = Record; diff --git a/resources/assets/lib/chat/message-length-counter.tsx b/resources/assets/lib/components/message-length-counter.tsx similarity index 100% rename from resources/assets/lib/chat/message-length-counter.tsx rename to resources/assets/lib/components/message-length-counter.tsx From 17f373085c44f186ce7354609e161b33a276f1c6 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 19:32:28 +0900 Subject: [PATCH 0442/1261] validate input with lengths; also allow inputed text to be longer --- resources/assets/lib/chat/create-announcement.tsx | 4 ---- .../assets/lib/models/chat/create-announcement.ts | 13 +++++++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/resources/assets/lib/chat/create-announcement.tsx b/resources/assets/lib/chat/create-announcement.tsx index f83d042bcb6..eaf1b647f7b 100644 --- a/resources/assets/lib/chat/create-announcement.tsx +++ b/resources/assets/lib/chat/create-announcement.tsx @@ -9,7 +9,6 @@ import UserJson from 'interfaces/user-json'; import { action, computed, makeObservable, runInAction } from 'mobx'; import { observer } from 'mobx-react'; import { isInputKey } from 'models/chat/create-announcement'; -import { maxLength } from 'models/chat/message'; import core from 'osu-core-singleton'; import * as React from 'react'; import { trans } from 'utils/lang'; @@ -56,7 +55,6 @@ export default class CreateAnnouncement extends React.Component { { { autoComplete='off' className='chat-form__input chat-form__input--box' defaultValue={this.model.inputs.message} - maxLength={maxLength} name='message' onBlur={this.handleBlur} onChange={this.handleInput} diff --git a/resources/assets/lib/models/chat/create-announcement.ts b/resources/assets/lib/models/chat/create-announcement.ts index df14394e415..9c57271f91f 100644 --- a/resources/assets/lib/models/chat/create-announcement.ts +++ b/resources/assets/lib/models/chat/create-announcement.ts @@ -10,6 +10,7 @@ import core from 'osu-core-singleton'; import { onError } from 'utils/ajax'; import { uuid } from 'utils/seq'; import { presence, present } from 'utils/string'; +import { maxLength } from './message'; interface LocalStorageProps extends Record { validUsers: number[]; @@ -30,7 +31,7 @@ export default class CreateAnnouncement implements FormWithErrors { @observable lookingUpUsers = false; readonly maxLengths = Object.freeze({ description: 255, - message: 1024, + message: maxLength, name: 50, }); @observable showError: Record; @@ -44,9 +45,9 @@ export default class CreateAnnouncement implements FormWithErrors { @computed get errors() { return { - description: !present(this.inputs.description), - message: !present(this.inputs.message), - name: !present(this.inputs.name), + description: !this.isValidLength('description'), + message: !this.isValidLength('message'), + name: !this.isValidLength('name'), users: this.validUsers.size === 0 || present(this.inputs.users.trim()), // implies invalid ids left }; @@ -180,6 +181,10 @@ export default class CreateAnnouncement implements FormWithErrors { this.validUsers.delete(core.currentUserOrFail.id); } + private isValidLength(key: Exclude) { + return present(this.inputs[key]) && this.inputs[key].length <= this.maxLengths[key]; + } + @action private async lookupUsers() { this.xhrLookupUsers?.abort(); From 033daf8d2b8244a91af4c0fe9e33460230d192d2 Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 19:38:09 +0900 Subject: [PATCH 0443/1261] rename to match class --- ...ngth-counter.tsx => discussion-message-length-counter.tsx} | 0 resources/assets/lib/beatmap-discussions/new-discussion.tsx | 4 ++-- resources/assets/lib/beatmap-discussions/new-reply.tsx | 4 ++-- resources/assets/lib/beatmap-discussions/post.tsx | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename resources/assets/lib/beatmap-discussions/{message-length-counter.tsx => discussion-message-length-counter.tsx} (100%) diff --git a/resources/assets/lib/beatmap-discussions/message-length-counter.tsx b/resources/assets/lib/beatmap-discussions/discussion-message-length-counter.tsx similarity index 100% rename from resources/assets/lib/beatmap-discussions/message-length-counter.tsx rename to resources/assets/lib/beatmap-discussions/discussion-message-length-counter.tsx diff --git a/resources/assets/lib/beatmap-discussions/new-discussion.tsx b/resources/assets/lib/beatmap-discussions/new-discussion.tsx index a4387153b2f..48d8eff69ec 100644 --- a/resources/assets/lib/beatmap-discussions/new-discussion.tsx +++ b/resources/assets/lib/beatmap-discussions/new-discussion.tsx @@ -26,8 +26,8 @@ import { joinComponents, trans } from 'utils/lang'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; import { present } from 'utils/string'; import CurrentDiscussions from './current-discussions'; +import DiscussionMessageLengthCounter from './discussion-message-length-counter'; import DiscussionsMode from './discussions-mode'; -import MessageLengthCounter from './message-length-counter'; const bn = 'beatmap-discussion-new'; @@ -393,7 +393,7 @@ export class NewDiscussion extends React.Component { value={this.canPost ? this.message : ''} /> - diff --git a/resources/assets/lib/beatmap-discussions/new-reply.tsx b/resources/assets/lib/beatmap-discussions/new-reply.tsx index 42af07c91d8..35bbee9fa0f 100644 --- a/resources/assets/lib/beatmap-discussions/new-reply.tsx +++ b/resources/assets/lib/beatmap-discussions/new-reply.tsx @@ -19,7 +19,7 @@ import { InputEventType, makeTextAreaHandler, TextAreaCallback } from 'utils/inp import { trans } from 'utils/lang'; import { hideLoadingOverlay, showLoadingOverlay } from 'utils/loading-overlay'; import { present } from 'utils/string'; -import MessageLengthCounter from './message-length-counter'; +import DiscussionMessageLengthCounter from './discussion-message-length-counter'; const bn = 'beatmap-discussion-post'; @@ -195,7 +195,7 @@ export class NewReply extends React.Component {
    {trans('beatmaps.discussions.reply_notice')} - +
    diff --git a/resources/assets/lib/beatmap-discussions/post.tsx b/resources/assets/lib/beatmap-discussions/post.tsx index 25224b7fc47..cd8c7bce7e0 100644 --- a/resources/assets/lib/beatmap-discussions/post.tsx +++ b/resources/assets/lib/beatmap-discussions/post.tsx @@ -30,7 +30,7 @@ import { badgeGroup, canModeratePosts, format, validMessageLength } from 'utils/ import { classWithModifiers } from 'utils/css'; import { InputEventType, makeTextAreaHandler } from 'utils/input-handler'; import { trans } from 'utils/lang'; -import MessageLengthCounter from './message-length-counter'; +import DiscussionMessageLengthCounter from './discussion-message-length-counter'; import { UserCard } from './user-card'; const bn = 'beatmap-discussion-post'; @@ -291,7 +291,7 @@ export default class Post extends React.Component { style={{ minHeight: this.textareaMinHeight }} value={this.message} /> - + )}
    From f7c8ef794d4f14cad126f37dc37b872b58c01ddf Mon Sep 17 00:00:00 2001 From: bakaneko Date: Mon, 16 Jan 2023 20:02:38 +0900 Subject: [PATCH 0444/1261] expand form to fill height --- resources/assets/less/bem/chat-form.less | 6 ++++-- resources/assets/less/bem/input-container.less | 5 +++++ resources/assets/lib/chat/create-announcement.tsx | 3 +-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/resources/assets/less/bem/chat-form.less b/resources/assets/less/bem/chat-form.less index 2d7ebd92033..dd541bd6789 100644 --- a/resources/assets/less/bem/chat-form.less +++ b/resources/assets/less/bem/chat-form.less @@ -4,6 +4,8 @@ .chat-form { --input-size: @font-size--title-small-3; + display: flex; + flex-direction: column; flex: 1; background: hsl(var(--hsl-b4)); @@ -11,12 +13,11 @@ display: flex; justify-content: flex-end; padding: 10px 20px; - // TODO: chat background shades probably need some adjustment. - background: hsl(var(--hsl-b5)); } &__fields { display: flex; + flex: 1; flex-direction: column; gap: 10px; padding: 20px 20px 10px 20px; @@ -28,6 +29,7 @@ font-size: var(--input-size); &--box { + flex: 1; resize: none; } diff --git a/resources/assets/less/bem/input-container.less b/resources/assets/less/bem/input-container.less index a6e23b6e336..5899723b793 100644 --- a/resources/assets/less/bem/input-container.less +++ b/resources/assets/less/bem/input-container.less @@ -39,6 +39,11 @@ border-color: hsl(var(--hsl-red-2)); } + &--fill { + flex: 1; + min-height: 150px; + } + &--genre { --label-colour: hsl(var(--hsl-c1)); background: none; diff --git a/resources/assets/lib/chat/create-announcement.tsx b/resources/assets/lib/chat/create-announcement.tsx index 372adce6a85..8afbc6e3439 100644 --- a/resources/assets/lib/chat/create-announcement.tsx +++ b/resources/assets/lib/chat/create-announcement.tsx @@ -88,7 +88,7 @@ export default class CreateAnnouncement extends React.Component {
    - +