forked from baron/baron-sso
fix(i18n): update userfront english copy
This commit is contained in:
106
userfront/test/english_locale_placeholder_test.dart
Normal file
106
userfront/test/english_locale_placeholder_test.dart
Normal file
@@ -0,0 +1,106 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:toml/toml.dart';
|
||||
|
||||
const Set<String> _placeholderValues = {
|
||||
'Action',
|
||||
'Action Label',
|
||||
'Approve Error',
|
||||
'Approve Success',
|
||||
'Body',
|
||||
'Code Hint',
|
||||
'Code Label',
|
||||
'Confirm',
|
||||
'Confirm Button',
|
||||
'Description',
|
||||
'Error',
|
||||
'Heading',
|
||||
'Input Label',
|
||||
'Invalid',
|
||||
'Label',
|
||||
'Load Failed',
|
||||
'Page Title',
|
||||
'Request Code',
|
||||
'Result Failure',
|
||||
'Sent',
|
||||
'Subtitle',
|
||||
'Title',
|
||||
'Update Success',
|
||||
};
|
||||
|
||||
String? _readTomlValue(Map<String, dynamic> root, String key) {
|
||||
dynamic cursor = root;
|
||||
for (final part in key.split('.')) {
|
||||
if (cursor is! Map<String, dynamic>) {
|
||||
return null;
|
||||
}
|
||||
cursor = cursor[part];
|
||||
}
|
||||
return cursor is String ? cursor : null;
|
||||
}
|
||||
|
||||
void main() {
|
||||
test('critical english copy does not expose placeholder values', () {
|
||||
final file = File('assets/translations/en.toml');
|
||||
final document = TomlDocument.parse(file.readAsStringSync());
|
||||
final translations = document.toMap();
|
||||
|
||||
const criticalKeys = <String>[
|
||||
'ui.userfront.forgot.heading',
|
||||
'ui.userfront.forgot.input_label',
|
||||
'ui.userfront.forgot.title',
|
||||
'msg.userfront.forgot.description',
|
||||
'msg.userfront.forgot.sent',
|
||||
'ui.userfront.login.link.action_label',
|
||||
'ui.userfront.login.link.page_title',
|
||||
'ui.userfront.login.link.title',
|
||||
'ui.userfront.login.unregistered.action',
|
||||
'ui.userfront.login.unregistered.title',
|
||||
'ui.userfront.login.verification.action_label',
|
||||
'ui.userfront.login.verification.page_title',
|
||||
'ui.userfront.login.verification.title',
|
||||
'msg.userfront.login.qr.load_failed',
|
||||
'msg.userfront.login.short_code.invalid',
|
||||
'msg.userfront.login.unregistered.body',
|
||||
'ui.userfront.login_success.title',
|
||||
'msg.userfront.login_success.subtitle',
|
||||
'msg.userfront.profile.load_failed',
|
||||
'msg.userfront.profile.update_success',
|
||||
'ui.userfront.profile.password.title',
|
||||
'ui.userfront.profile.phone.code_hint',
|
||||
'msg.userfront.reset.invalid_body',
|
||||
'msg.userfront.reset.invalid_title',
|
||||
'ui.userfront.reset.subtitle',
|
||||
'ui.userfront.reset.title',
|
||||
'ui.userfront.signup.title',
|
||||
'msg.userfront.signup.agreement.title',
|
||||
'msg.userfront.signup.auth.title',
|
||||
'ui.userfront.signup.auth.email.label',
|
||||
'ui.userfront.signup.auth.email.title',
|
||||
'msg.userfront.signup.password.title',
|
||||
'msg.userfront.signup.profile.title',
|
||||
'msg.userfront.signup.success.body',
|
||||
'msg.userfront.signup.success.title',
|
||||
'ui.userfront.signup.success.action',
|
||||
];
|
||||
|
||||
final failures = <String>[];
|
||||
for (final key in criticalKeys) {
|
||||
final value = _readTomlValue(translations, key);
|
||||
if (value == null || value.trim().isEmpty) {
|
||||
failures.add('$key is missing');
|
||||
continue;
|
||||
}
|
||||
if (_placeholderValues.contains(value.trim())) {
|
||||
failures.add('$key uses placeholder "$value"');
|
||||
}
|
||||
}
|
||||
|
||||
expect(
|
||||
failures,
|
||||
isEmpty,
|
||||
reason: failures.isEmpty ? null : failures.join('\n'),
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user