Skip to content

Commit 174982b

Browse files
committed
api: Add translations for exceptions related to api requests
Also hook up some other test suites that require localization contexts for tests to pass given this change.
1 parent b894413 commit 174982b

File tree

6 files changed

+37
-4
lines changed

6 files changed

+37
-4
lines changed

assets/l10n/app_en.arb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@
4646
"num": {"type": "int", "example": "4"}
4747
}
4848
},
49+
"errorNetworkRequestFailed": "Network request failed",
50+
"@errorNetworkRequestFailed": {
51+
"description": "Error message when a network request fails."
52+
},
53+
"errorMalformedResponse": "Server gave malformed response; HTTP status {httpStatus}",
54+
"@errorMalformedResponse": {
55+
"description": "Error message when an API call fails because we could not parse it.",
56+
"placeholders": {
57+
"httpStatus": {"type": "int", "example": "200"}
58+
}
59+
},
60+
"errorRequestFailed": "Network request failed: HTTP status {httpStatus}",
61+
"@errorRequestFailed": {
62+
"description": "Error message when an API call fails.",
63+
"placeholders": {
64+
"httpStatus": {"type": "int", "example": "500"}
65+
}
66+
},
4967
"userRoleOwner": "Owner",
5068
"@userRoleOwner": {
5169
"description": "Label for UserRole.owner"

lib/api/core.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44
import 'package:http/http.dart' as http;
55

66
import '../log.dart';
7+
import '../model/localizations.dart';
78
import 'exception.dart';
89

910
/// A value for an API request parameter, to use directly without JSON encoding.
@@ -90,7 +91,8 @@ class ApiConnection {
9091
} else if (e is TlsException) {
9192
message = e.message;
9293
} else {
93-
message = 'Network request failed';
94+
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
95+
message = zulipLocalizations.errorNetworkRequestFailed;
9496
}
9597
throw NetworkException(routeName: routeName, cause: e, message: message);
9698
}

lib/api/exception.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
import '../model/localizations.dart';
3+
24
/// Some kind of error from a Zulip API network request.
35
sealed class ApiRequestException implements Exception {
46
/// The name of the Zulip API route for the request.
@@ -92,7 +94,8 @@ class Server5xxException extends ServerException {
9294
required super.httpStatus,
9395
required super.data,
9496
}) : assert(500 <= httpStatus && httpStatus <= 599),
95-
super(message: 'Network request failed: HTTP status $httpStatus'); // TODO(i18n)
97+
super(message: GlobalLocalizations.zulipLocalizations
98+
.errorRequestFailed(httpStatus));
9699
}
97100

98101
/// An error where the server's response doesn't match the Zulip API.
@@ -113,5 +116,6 @@ class MalformedServerResponseException extends ServerException {
113116
required super.routeName,
114117
required super.httpStatus,
115118
required super.data,
116-
}) : super(message: 'Server gave malformed response; HTTP status $httpStatus'); // TODO(i18n)
119+
}) : super(message: GlobalLocalizations.zulipLocalizations
120+
.errorMalformedResponse(httpStatus));
117121
}

test/api/core_test.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:io';
33

44
import 'package:checks/checks.dart';
55
import 'package:checks/context.dart';
6+
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart';
67
import 'package:http/http.dart' as http;
78
import 'package:test/scaffolding.dart';
89
import 'package:zulip/api/core.dart';
@@ -153,9 +154,11 @@ void main() {
153154
..which(condition));
154155
}
155156

157+
final zulipLocalizations = lookupZulipLocalizations(ZulipLocalizations.supportedLocales.first);
156158
checkRequest(http.ClientException('Oops'), it()..message.equals('Oops'));
157159
checkRequest(const TlsException('Oops'), it()..message.equals('Oops'));
158-
checkRequest((foo: 'bar'), it()..message.equals('Network request failed'));
160+
checkRequest((foo: 'bar'), it()
161+
..message.equals(zulipLocalizations.errorNetworkRequestFailed));
159162
});
160163

161164
test('API 4xx errors, well formed', () async {

test/widgets/autocomplete_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:checks/checks.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart';
34
import 'package:flutter_test/flutter_test.dart';
45
import 'package:zulip/api/model/model.dart';
56
import 'package:zulip/api/route/messages.dart';
@@ -40,6 +41,8 @@ Future<Finder> setupToComposeInput(WidgetTester tester, {
4041

4142
await tester.pumpWidget(
4243
MaterialApp(
44+
localizationsDelegates: ZulipLocalizations.localizationsDelegates,
45+
supportedLocales: ZulipLocalizations.supportedLocales,
4346
home: GlobalStoreWidget(
4447
child: PerAccountStoreWidget(
4548
accountId: eg.selfAccount.id,

test/widgets/content_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:io';
33
import 'package:checks/checks.dart';
44
import 'package:flutter/foundation.dart';
55
import 'package:flutter/material.dart';
6+
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart';
67
import 'package:flutter_test/flutter_test.dart';
78
import 'package:url_launcher/url_launcher.dart';
89
import 'package:zulip/api/core.dart';
@@ -68,6 +69,8 @@ void main() {
6869
addTearDown(testBinding.reset);
6970

7071
await tester.pumpWidget(GlobalStoreWidget(child: MaterialApp(
72+
localizationsDelegates: ZulipLocalizations.localizationsDelegates,
73+
supportedLocales: ZulipLocalizations.supportedLocales,
7174
home: PerAccountStoreWidget(accountId: eg.selfAccount.id,
7275
child: BlockContentList(
7376
nodes: parseContent(html).nodes)))));

0 commit comments

Comments
 (0)