forked from baron/baron-sso
70 lines
1.8 KiB
Dart
70 lines
1.8 KiB
Dart
import 'dart:ui';
|
|
|
|
import 'locale_storage.dart';
|
|
|
|
const supportedLocaleCodes = ['en', 'ko'];
|
|
const defaultLocaleCode = 'en';
|
|
|
|
String normalizeLocaleCode(String? code) {
|
|
if (code == null || code.isEmpty) {
|
|
return defaultLocaleCode;
|
|
}
|
|
final normalized = code.toLowerCase();
|
|
if (normalized == 'ko' || normalized.startsWith('ko-')) {
|
|
return 'ko';
|
|
}
|
|
if (normalized == 'en' || normalized.startsWith('en-')) {
|
|
return 'en';
|
|
}
|
|
return defaultLocaleCode;
|
|
}
|
|
|
|
String resolvePreferredLocaleCode() {
|
|
final stored = LocaleStorage.read();
|
|
if (stored != null && supportedLocaleCodes.contains(stored)) {
|
|
return stored;
|
|
}
|
|
final deviceLocale = PlatformDispatcher.instance.locale;
|
|
return normalizeLocaleCode(deviceLocale.languageCode);
|
|
}
|
|
|
|
String? extractLocaleFromPath(Uri uri) {
|
|
if (uri.pathSegments.isEmpty) {
|
|
return null;
|
|
}
|
|
final code = uri.pathSegments.first.toLowerCase();
|
|
if (supportedLocaleCodes.contains(code)) {
|
|
return code;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
String stripLocalePath(Uri uri) {
|
|
final segments = uri.pathSegments;
|
|
if (segments.isNotEmpty && supportedLocaleCodes.contains(segments.first)) {
|
|
final rest = segments.skip(1).join('/');
|
|
if (rest.isEmpty) {
|
|
return '/';
|
|
}
|
|
return '/$rest';
|
|
}
|
|
return uri.path;
|
|
}
|
|
|
|
String buildLocalizedPath(String localeCode, Uri uri) {
|
|
final segments = uri.pathSegments;
|
|
Iterable<String> restSegments = segments;
|
|
if (segments.isNotEmpty) {
|
|
final head = segments.first.toLowerCase();
|
|
if (supportedLocaleCodes.contains(head) || head.length == 2) {
|
|
restSegments = segments.skip(1);
|
|
}
|
|
}
|
|
final newSegments = [localeCode, ...restSegments];
|
|
final path = '/${newSegments.join('/')}';
|
|
if (uri.queryParameters.isEmpty) {
|
|
return path;
|
|
}
|
|
return Uri(path: path, queryParameters: uri.queryParameters).toString();
|
|
}
|