Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/Http/Controllers/SessionsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

namespace App\Http\Controllers;

use App\Http\Middleware\SetLocale;
use App\Libraries\User\CountryChange;
use App\Libraries\User\DatadogLoginAttempt;
use App\Libraries\User\ForceReactivation;
Expand Down Expand Up @@ -106,9 +107,11 @@ public function store()

DatadogLoginAttempt::log(null);
$this->login($user);
SetLocale::setLocaleWeb($request);

return [
'csrf_token' => csrf_token(),
'current_locale' => \App::getLocale(),
'header' => view('layout._header_user')->render(),
'header_popup' => view('layout._popup_user')->render(),
'user' => json_item($user, new CurrentUserTransformer()),
Expand Down
39 changes: 21 additions & 18 deletions app/Http/Middleware/SetLocale.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,39 +14,42 @@

class SetLocale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle(Request $request, Closure $next)
public static function setLocaleWeb(Request $request): void
{
$this->setLocale(
Auth::user()?->user_lang ?? presence($request->cookie('locale')),
$request,
);

return $next($request);
$locale = Auth::user()?->user_lang ?? presence($request->cookie('locale'));
static::setLocale($locale, $request);
}

protected function setLocale(?string $locale, Request $request): void
protected static function setLocale(?string $locale, Request $request): void
{
if ($locale !== null) {
$locale = get_valid_locale($locale);
}
$locale ??= $this->localeFromHeader($request);
$locale ??= static::localeFromHeader($request);

App::setLocale($locale);
// Carbon setLocale normalizes the locale
Carbon::setLocale(locale_meta($locale)->carbon());
}

private function localeFromHeader(Request $request): string
private static function localeFromHeader(Request $request): string
{
return (new Parser())->languageRegionCompatibleFor($request->server('HTTP_ACCEPT_LANGUAGE'))
?? $GLOBALS['cfg']['app']['fallback_locale'];
}

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
static::setLocaleWeb($request);

return $next($request);
}
}
2 changes: 1 addition & 1 deletion app/Http/Middleware/SetLocaleApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public function handle(Request $request, Closure $next)
$locale = Auth::user()?->user_lang;
}

$this->setLocale($locale ?? null, $request);
static::setLocale($locale ?? null, $request);

return $next($request);
}
Expand Down
10 changes: 4 additions & 6 deletions resources/js/app-deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import 'setup-jquery';
// imported separately as it requires window jquery (setup by the import above)
import 'jquery-ujs';

import { patchPluralHandler } from 'lang-overrides';
import Lang from 'lang.js';
import { configure as mobxConfigure } from 'mobx';
import * as moment from 'moment';
import { resetLang } from 'utils/lang';
import { popup } from 'utils/popup';
import { reloadPage } from 'utils/turbolinks';

Expand Down Expand Up @@ -52,6 +52,8 @@ declare global {
_styles: SharedStyles;
currentLocale: string;
currentUser: CurrentUserJson | { id: undefined };
defaultNumberFormatter: Intl.NumberFormat;
defaultSuffixedNumberFormatter: Intl.NumberFormat;
fallbackLocale: string;
jQuery: JQueryStatic;
Lang: Lang;
Expand All @@ -63,11 +65,7 @@ declare global {
}

window.LangMessages ??= {};
window.Lang = patchPluralHandler(new Lang({
fallback: window.fallbackLocale,
locale: window.currentLocale,
messages: window.LangMessages,
}));
resetLang();
window.moment = moment;
window.popup = popup;
window.reloadPage = reloadPage;
Expand Down
5 changes: 5 additions & 0 deletions resources/js/core/user/user-login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import UserJson from 'interfaces/user-json';
import core from 'osu-core-singleton';
import { xhrErrorMessage } from 'utils/ajax';
import { createClickCallback } from 'utils/html';
import { resetLang } from 'utils/lang';
import { reloadPage } from 'utils/turbolinks';

declare global {
Expand All @@ -21,6 +22,7 @@ interface CaptchaTriggeredResponse {

interface LoginSuccessJson {
csrf_token: string;
current_locale: string;
header: string;
header_popup: string;
user: UserJson;
Expand Down Expand Up @@ -114,6 +116,9 @@ export default class UserLogin {
}
const callback = this.callback;

window.currentLocale = data.current_locale;
resetLang();

if (callback == null) {
reloadPage();
return;
Expand Down
13 changes: 2 additions & 11 deletions resources/js/utils/html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,9 @@ export function formatDuration(valueSecond: number) {
return `${m}:${padTimeComponent(s)}`;
}

const defaultNumberFormatter = new Intl.NumberFormat(window.currentLocale);

export function formatNumber(num: number, precision?: number, options?: Intl.NumberFormatOptions, locale?: string) {
if (precision == null && options == null && locale == null) {
return defaultNumberFormatter.format(num);
return window.defaultNumberFormatter.format(num);
}

options ??= {};
Expand All @@ -88,17 +86,10 @@ export function formatStarRating(num: number) {
return formatNumber(floor(num, 2), 2);
}

const defaultSuffixedNumberOptions = {
maximumFractionDigits: 1,
minimumFractionDigits: 0,
notation: 'compact',
} as const;
const defaultSuffixedNumberFormatter = new Intl.NumberFormat(window.currentLocale, defaultSuffixedNumberOptions);

export function formatNumberSuffixed(num?: number) {
return num == null
? undefined
: defaultSuffixedNumberFormatter.format(num);
: window.defaultSuffixedNumberFormatter.format(num);
}

export function htmlElementOrNull(thing: unknown) {
Expand Down
15 changes: 15 additions & 0 deletions resources/js/utils/lang.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
// See the LICENCE file in the repository root for full licence text.

import { patchPluralHandler } from 'lang-overrides';
import Lang from 'lang.js';
import * as React from 'react';
import { formatNumber } from 'utils/html';
Expand Down Expand Up @@ -31,6 +32,20 @@ export function joinComponents(array: React.ReactElement[], key = 'common.array_
return <>{nodes}</>;
}

export function resetLang() {
window.defaultNumberFormatter = new Intl.NumberFormat(window.currentLocale);
window.defaultSuffixedNumberFormatter = new Intl.NumberFormat(window.currentLocale, {
maximumFractionDigits: 1,
minimumFractionDigits: 0,
notation: 'compact',
});
window.Lang = patchPluralHandler(new Lang({
fallback: window.fallbackLocale,
locale: window.currentLocale,
messages: window.LangMessages,
}));
}

export function trans(key: string, replacements: Replacements = {}, locale?: string) {
if (!transExists(key, locale)) {
locale = fallbackLocale;
Expand Down
Loading