Skip to content

Commit ce35ec2

Browse files
authored
chore: enforce consistency of translations in CI (#268)
1 parent 3e9c9bb commit ce35ec2

10 files changed

Lines changed: 2070 additions & 2596 deletions

File tree

.github/workflows/default_workflow.yml

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ jobs:
3131
flutter-version: '3.27.1'
3232
channel: 'stable'
3333
cache: true
34+
35+
- name: Setup Just
36+
uses: taiki-e/install-action@just
3437

3538
- name: Cache Flutter packages
3639
uses: actions/cache@v4
@@ -40,22 +43,10 @@ jobs:
4043
restore-keys: |
4144
${{ runner.os }}-pub-cache-
4245
43-
- name: Install Pub Dependencies
44-
run: flutter pub get
45-
46-
- name: Build with secrets
47-
run: flutter pub run build_runner build --delete-conflicting-outputs
46+
- name: Run CI
47+
run: just ci
4848
env:
4949
FDC_API_KEY: ${{ secrets.FDC_API_KEY }}
5050
SENTRY_DNS: ${{ secrets.SENTRY_DNS }}
5151
SUPABASE_PROJECT_ANON_KEY: ${{ secrets.SUPABASE_PROJECT_ANON_KEY }}
5252
SUPABASE_PROJECT_URL: ${{ secrets.SUPABASE_PROJECT_URL }}
53-
54-
- name: Run Formatter
55-
run: dart format --set-exit-if-changed ./lib ./test
56-
57-
- name: Analyze Code
58-
run: flutter analyze
59-
60-
- name: Run Tests
61-
run: flutter test

analysis_options.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
# packages, and plugins designed to encourage good coding practices.
1010
include: package:flutter_lints/flutter.yaml
1111

12+
analyzer:
13+
# generated files throw `unnecessary_string_escapes` lint so we ignore warnings.
14+
# TODO: inject `ignore_for_file` as described below.
15+
exclude:
16+
- lib/generated/intl/*.dart
17+
1218
linter:
1319
# The lint rules applied to this project can be customized in the
1420
# section below to disable rules from the `package:flutter_lints/flutter.yaml`

justfile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
intl_output_dir := "./lib/generated/intl/"
2+
3+
# Install dependencies
4+
install:
5+
flutter pub get
6+
7+
# Build OpenNutriTracker
8+
build:
9+
flutter pub run build_runner build --delete-conflicting-outputs
10+
11+
# Format dart code
12+
format *OPTIONS:
13+
dart format {{OPTIONS}} ./lib ./test
14+
15+
# Regenerate intl files
16+
run_intl: && format
17+
dart run intl_translation:generate_from_arb --output-dir {{intl_output_dir}} lib/**/*.dart ./lib/l10n/*.arb
18+
19+
# Check if intl files are correctly generated
20+
check_intl: run_intl
21+
git diff --exit-code {{intl_output_dir}}
22+
23+
# Run tests
24+
test:
25+
flutter test
26+
27+
# Run CI checks
28+
ci: install (format "--set-exit-if-changed") check_intl build && test
29+
flutter analyze
Lines changed: 2 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,5 @@
11
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
22
// This is a library that looks up messages for specific locales by
33
// delegating to the appropriate library.
4-
5-
// Ignore issues from commonly used lints in this file.
6-
// ignore_for_file:implementation_imports, file_names, unnecessary_new
7-
// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering
8-
// ignore_for_file:argument_type_not_assignable, invalid_assignment
9-
// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases
10-
// ignore_for_file:comment_references
11-
12-
import 'dart:async';
13-
14-
import 'package:flutter/foundation.dart';
15-
import 'package:intl/intl.dart';
16-
import 'package:intl/message_lookup_by_library.dart';
17-
import 'package:intl/src/intl_helpers.dart';
18-
19-
import 'messages_de.dart' as messages_de;
20-
import 'messages_en.dart' as messages_en;
21-
import 'messages_tr.dart' as messages_tr;
22-
23-
typedef Future<dynamic> LibraryLoader();
24-
Map<String, LibraryLoader> _deferredLibraries = {
25-
'de': () => new SynchronousFuture(null),
26-
'en': () => new SynchronousFuture(null),
27-
'tr': () => new SynchronousFuture(null),
28-
};
29-
30-
MessageLookupByLibrary? _findExact(String localeName) {
31-
switch (localeName) {
32-
case 'de':
33-
return messages_de.messages;
34-
case 'en':
35-
return messages_en.messages;
36-
case 'tr':
37-
return messages_tr.messages;
38-
default:
39-
return null;
40-
}
41-
}
42-
43-
/// User programs should call this before using [localeName] for messages.
44-
Future<bool> initializeMessages(String localeName) {
45-
var availableLocale = Intl.verifiedLocale(
46-
localeName,
47-
(locale) => _deferredLibraries[locale] != null,
48-
onFailure: (_) => null,
49-
);
50-
if (availableLocale == null) {
51-
return new SynchronousFuture(false);
52-
}
53-
var lib = _deferredLibraries[availableLocale];
54-
lib == null ? new SynchronousFuture(false) : lib();
55-
initializeInternalMessageLookup(() => new CompositeMessageLookup());
56-
messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
57-
return new SynchronousFuture(true);
58-
}
59-
60-
bool _messagesExistFor(String locale) {
61-
try {
62-
return _findExact(locale) != null;
63-
} catch (e) {
64-
return false;
65-
}
66-
}
67-
68-
MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) {
69-
var actualLocale = Intl.verifiedLocale(
70-
locale,
71-
_messagesExistFor,
72-
onFailure: (_) => null,
73-
);
74-
if (actualLocale == null) return null;
75-
return _findExact(actualLocale);
76-
}
4+
// @dart=2.12
5+
export 'messages_all_locales.dart' show initializeMessages;
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2+
// This is a library that looks up messages for specific locales by
3+
// delegating to the appropriate library.
4+
// @dart=2.12
5+
// Ignore issues from commonly used lints in this file.
6+
// ignore_for_file:implementation_imports, file_names
7+
// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering
8+
// ignore_for_file:argument_type_not_assignable, invalid_assignment
9+
// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases
10+
// ignore_for_file:comment_references
11+
12+
import 'package:intl/intl.dart';
13+
import 'package:intl/message_lookup_by_library.dart';
14+
import 'package:intl/src/intl_helpers.dart';
15+
16+
import 'messages_de.dart' deferred as messages_de;
17+
import 'messages_en.dart' deferred as messages_en;
18+
import 'messages_tr.dart' deferred as messages_tr;
19+
20+
typedef Future<dynamic> LibraryLoader();
21+
Map<String, LibraryLoader> _deferredLibraries = {
22+
'de': messages_de.loadLibrary,
23+
'en': messages_en.loadLibrary,
24+
'tr': messages_tr.loadLibrary,
25+
};
26+
27+
MessageLookupByLibrary? _findExact(String localeName) {
28+
switch (localeName) {
29+
case 'de':
30+
return messages_de.messages;
31+
case 'en':
32+
return messages_en.messages;
33+
case 'tr':
34+
return messages_tr.messages;
35+
default:
36+
return null;
37+
}
38+
}
39+
40+
/// User programs should call this before using [localeName] for messages.
41+
Future<bool> initializeMessages(String? localeName) async {
42+
var availableLocale = Intl.verifiedLocale(
43+
localeName, (locale) => _deferredLibraries[locale] != null,
44+
onFailure: (_) => null);
45+
if (availableLocale == null) {
46+
return Future.value(false);
47+
}
48+
var lib = _deferredLibraries[availableLocale];
49+
await (lib == null ? Future.value(false) : lib());
50+
initializeInternalMessageLookup(() => CompositeMessageLookup());
51+
messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
52+
return Future.value(true);
53+
}
54+
55+
bool _messagesExistFor(String locale) {
56+
try {
57+
return _findExact(locale) != null;
58+
} catch (e) {
59+
return false;
60+
}
61+
}
62+
63+
MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) {
64+
var actualLocale =
65+
Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null);
66+
if (actualLocale == null) return null;
67+
return _findExact(actualLocale);
68+
}

0 commit comments

Comments
 (0)