Skip to content
Draft
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
2 changes: 1 addition & 1 deletion pkgs/messages/example/assets/testarb.arb.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[0,"en","dr9Md951",1,null,["helloAndWelcome","Welcome von !",[8,0],[13,1]],["helloAndWelcome2","Welcome von !",[8,0],[13,1]],[6,"newMessages","test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"newMessages2","test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]]]
[0,"en","dr9Md951",null,["Welcome von !",[8,0],[13,1]],["Welcome von !",[8,0],[13,1]],[6,"test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]]]
2 changes: 1 addition & 1 deletion pkgs/messages/example/assets/testarb_de.arb.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[0,"de","hbDN1MhX",1,null,["helloAndWelcome","Willkommen von ",[11,0],[16,1]],["helloAndWelcome2","Willkommen von 2",[11,0],[16,1]],[6,"newMessages","testde ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],["newMessages2","testdse is just a simple message"]]
[0,"de","hbDN1MhX",null,["Willkommen von ",[11,0],[16,1]],["Willkommen von 2",[11,0],[16,1]],[6,"testde ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],["testdse is just a simple message"]]
2 changes: 1 addition & 1 deletion pkgs/messages/example/assets/testarbctx2.arb.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[0,"en","QrwRSsOy",1,null,["aboutMessage","About ",[6,0]],["helloAndWelcome","Welcome von <",[8,0],[13,1]],[6,"newMessages","test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"newMessages2","test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]],["otherMsg","other"]]
[0,"en","QrwRSsOy",null,["About ",[6,0]],["Welcome von <",[8,0],[13,1]],[6,"test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]],["other"]]
2 changes: 1 addition & 1 deletion pkgs/messages/example/assets/testarbctx2_fr.arb.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[0,"fr","390XWry3",1,null,["aboutMessage","Sur ",[4,0]],["helloAndWelcome","Welcome von <",[8,0],[13,1]],[6,"newMessages","test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"newMessages2","test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]],["otherMsg","other"]]
[0,"fr","390XWry3",null,["Sur ",[4,0]],["Welcome von <",[8,0],[13,1]],[6,"test ",[3,0,["test new messages",[5,0]],[0,"No new messages",1,"One new message","w2","Two new Messages"]]],[6,"test ",[4,0,"Two new Messages",{"male":"No new messages","female":"One new message"}]],["other"]]
24 changes: 10 additions & 14 deletions pkgs/messages/example/bin/example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,26 @@
import 'dart:io';

import 'package:example/AboutPage_messages.g.dart';
import 'package:example/HomePage_messages.g.dart';

Future<void> main(List<String> arguments) async {
final messages = AboutPageMessages(
(id) => File(id.split('/').skip(2).join('/')).readAsString(),
);
// final index = AboutPageMessagesEnum.aboutMessage;
final messages = AboutPageMessages(_assetLoader);

await messages.loadLocale('en');
print('AboutMessage en:');
print('\t${messages.aboutMessage('typesafe.en')}');

///To enable this, add `generateFindById: true` to the pubspec section
// print('\t${messages.getById('aboutMessage', ['get-by-id.en'])}');

///To enable this, add `generateFindBy: enumerate` to the pubspec section
// print('\t${messages.getByEnum(index, ['get-by-index.en'])}');

await messages.loadLocale('fr');
print('AboutMessage fr:');
print('\t${messages.aboutMessage('typesafe.fr')}');

///To enable this, add `generateFindById: true` to the pubspec section
// print('\t${messages.getById('aboutMessage', ['get-by-id.fr'])}');
final messages2 = HomePageMessages(_assetLoader);

await messages2.loadLocale('en');

///To enable this, add `generateFindBy: enumerate` to the pubspec section
// print('\t${messages.getByEnum(index, ['get-by-index.fr'])}');
print('AboutMessage en:');
print('\t${messages2.helloAndWelcome('Paul', 'Erdős')}');
}

Future<String> _assetLoader(String id) =>
File(id.split('/').skip(2).join('/')).readAsString();
2 changes: 0 additions & 2 deletions pkgs/messages/example/lib/AboutPage_en_empty.g.dart

This file was deleted.

2 changes: 0 additions & 2 deletions pkgs/messages/example/lib/AboutPage_fr_empty.g.dart

This file was deleted.

16 changes: 0 additions & 16 deletions pkgs/messages/example/lib/AboutPage_messages.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import 'package:intl/intl.dart';
import 'package:messages/messages_json.dart';

import 'AboutPage_en_empty.g.dart' deferred as AboutPage_en_empty;
import 'AboutPage_fr_empty.g.dart' deferred as AboutPage_fr_empty;

class AboutPageMessages {
AboutPageMessages(this._assetLoader);

Expand All @@ -27,13 +24,6 @@ class AboutPageMessages {

MessageList get _currentMessages => _messages[currentLocale]!;

String getById(
String id, [
List<dynamic> args = const [],
]) {
return _currentMessages.generateStringAtId(id, args);
}

static Iterable<String> get knownLocales => _dataFiles.keys;

Future<void> loadLocale(String locale) async {
Expand All @@ -43,12 +33,6 @@ class AboutPageMessages {
if (dataFile == null) {
throw ArgumentError('Locale $locale is not in $knownLocales');
}
if (locale == 'en') {
await AboutPage_en_empty.loadLibrary();
} else if (locale == 'fr') {
await AboutPage_fr_empty.loadLibrary();
}

final data = await _assetLoader(dataFile);
final messageList = MessageListJson.fromString(data, _pluralSelector);
if (messageList.preamble.hash != info?.$2) {
Expand Down
2 changes: 0 additions & 2 deletions pkgs/messages/example/lib/HomePage_de_empty.g.dart

This file was deleted.

2 changes: 0 additions & 2 deletions pkgs/messages/example/lib/HomePage_en_empty.g.dart

This file was deleted.

16 changes: 0 additions & 16 deletions pkgs/messages/example/lib/HomePage_messages.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import 'package:intl/intl.dart';
import 'package:messages/messages_json.dart';

import 'HomePage_de_empty.g.dart' deferred as HomePage_de_empty;
import 'HomePage_en_empty.g.dart' deferred as HomePage_en_empty;

class HomePageMessages {
HomePageMessages(this._assetLoader);

Expand All @@ -27,13 +24,6 @@ class HomePageMessages {

MessageList get _currentMessages => _messages[currentLocale]!;

String getById(
String id, [
List<dynamic> args = const [],
]) {
return _currentMessages.generateStringAtId(id, args);
}

static Iterable<String> get knownLocales => _dataFiles.keys;

Future<void> loadLocale(String locale) async {
Expand All @@ -43,12 +33,6 @@ class HomePageMessages {
if (dataFile == null) {
throw ArgumentError('Locale $locale is not in $knownLocales');
}
if (locale == 'de') {
await HomePage_de_empty.loadLibrary();
} else if (locale == 'en') {
await HomePage_en_empty.loadLibrary();
}

final data = await _assetLoader(dataFile);
final messageList = MessageListJson.fromString(data, _pluralSelector);
if (messageList.preamble.hash != info?.$2) {
Expand Down
61 changes: 24 additions & 37 deletions pkgs/messages/lib/src/deserializer/deserializer_json.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,50 +42,42 @@ class JsonDeserializer extends Deserializer<MessageListJson> {

Message getMessage(dynamic message, [bool isTopLevel = false]) {
if (message is List) {
final typeOrId = message[0];
int start;
String? id;
if (isTopLevel && preamble.hasIds) {
start = 2;
id = message[1] as String;
} else {
start = 1;
}
if (typeOrId == PluralMessage.type) {
return _forPlural(message, start, id);
} else if (typeOrId == SelectMessage.type) {
return _forSelect(message, start, id);
} else if (typeOrId == CombinedMessage.type) {
return _forCombined(message, start, id);
} else if (typeOrId is String) {
return _forString(message, start - 1, typeOrId);
final type = message[0];
if (type == PluralMessage.type) {
return _forPlural(message);
} else if (type == SelectMessage.type) {
return _forSelect(message);
} else if (type == CombinedMessage.type) {
return _forCombined(message);
} else if (type is String) {
return _forString(message);
}
} else if (message is String) {
return StringMessage(message);
}
throw ArgumentError();
}

StringMessage _forString(List<dynamic> message, int start, String? id) {
final value = message[start] as String;
StringMessage _forString(List<dynamic> message) {
final value = message[0] as String;
final argPositions = <({int stringIndex, int argIndex})>[];
for (var i = start + 1; i < message.length; i++) {
for (var i = 1; i < message.length; i++) {
final pair = message[i] as List;
final stringIndex = pair[0];
final argIndex = pair[1];
argPositions.add((stringIndex: stringIndex, argIndex: argIndex));
}
return StringMessage(value, argPositions: argPositions, id: id);
return StringMessage(value, argPositions: argPositions);
}

PluralMessage _forPlural(List<dynamic> message, int start, String? id) {
final argIndex = message[start] as int;
final otherMessage = getMessage(message[start + 1]);
PluralMessage _forPlural(List<dynamic> message) {
final argIndex = message[1] as int;
final otherMessage = getMessage(message[2]);
Message? fewMessage;
Message? manyMessage;
final numberCases = <int, Message>{};
final wordCases = <int, Message>{};
final submessages = message[start + 2] as List;
final submessages = message[3] as List;
for (var i = 0; i < submessages.length - 1; i += 2) {
final msg = getMessage(submessages[i + 1]);
final messageMarker = submessages[i];
Expand All @@ -108,25 +100,20 @@ class JsonDeserializer extends Deserializer<MessageListJson> {
many: manyMessage,
argIndex: argIndex,
other: otherMessage,
id: id,
);
}

SelectMessage _forSelect(List<dynamic> message, int start, String? id) {
final argIndex = message[start] as int;
final otherCase = getMessage(message[start + 1]);
final submessages = message[start + 2] as Map;
SelectMessage _forSelect(List<dynamic> message) {
final argIndex = message[1] as int;
final otherCase = getMessage(message[2]);
final submessages = message[3] as Map;
final cases = submessages.map((caseName, caseMessage) => MapEntry(
caseName as String,
getMessage(caseMessage),
));
return SelectMessage(otherCase, cases, argIndex, id);
return SelectMessage(otherCase, cases, argIndex);
}

CombinedMessage _forCombined(List<dynamic> message, int start, String? id) {
return CombinedMessage(
id,
message.skip(start).map(getMessage).toList(),
);
}
CombinedMessage _forCombined(List<dynamic> message) =>
CombinedMessage(message.skip(1).map(getMessage).toList());
}
17 changes: 7 additions & 10 deletions pkgs/messages/lib/src/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
import 'plural_selector.dart';

sealed class Message {
final String? id;

Message(this.id);
Message();

String generateString(
List allArgs, {
Expand All @@ -20,7 +18,7 @@ sealed class Message {
final class CombinedMessage extends Message {
final List<Message> messages;

CombinedMessage(super.id, this.messages);
CombinedMessage(this.messages);

@override
String generateString(
Expand Down Expand Up @@ -49,8 +47,7 @@ final class StringMessage extends Message {
/// This list is expected to be sorted by `argPositions.stringIndex`
final List<({int stringIndex, int argIndex})> argPositions;

StringMessage(this.value, {this.argPositions = const [], String? id})
: super(id);
StringMessage(this.value, {this.argPositions = const [], String? id});

static const int type = 1;

Expand Down Expand Up @@ -97,7 +94,7 @@ final class PluralMessage extends Message {
required this.other,
required this.argIndex,
String? id,
}) : super(id);
});

static const int type = 3;

Expand Down Expand Up @@ -125,12 +122,12 @@ final class SelectMessage extends Message {
final Message other;
final Map<String, Message> cases;
final int argIndex;

SelectMessage(
this.other,
this.cases,
this.argIndex, [
super.id,
]);
this.argIndex,
);

static const int type = 4;

Expand Down
6 changes: 1 addition & 5 deletions pkgs/messages/lib/src/message_format.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,14 @@ abstract class Preamble {

String get hash;

bool get hasIds;

static int length = 4;
static int length = 3;
}

abstract class MessageList {
Preamble get preamble;
PluralSelector get pluralSelector;

String generateStringAtIndex(int index, List args);

String generateStringAtId(String id, List args);
}

sealed class PluralMarker {
Expand Down
11 changes: 0 additions & 11 deletions pkgs/messages/lib/src/message_list_json.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,10 @@ class JsonPreamble extends Preamble {
required int serializationVersion,
required String locale,
required String hash,
required bool hasIds,
}) : _data = [
serializationVersion,
locale,
hash,
hasIds ? 1 : 0,
];

JsonPreamble.parse(this._data);
Expand All @@ -33,9 +31,6 @@ class JsonPreamble extends Preamble {

@override
String get hash => _data[2] as String;

@override
bool get hasIds => _data[3] == 1;
}

class MessageListJson extends MessageList {
Expand All @@ -60,12 +55,6 @@ class MessageListJson extends MessageList {
factory MessageListJson.fromString(String string, PluralSelector intl) =>
JsonDeserializer(string).deserialize(intl);

@override
String generateStringAtId(String id, List args) => messages
.where((element) => element.id == id)
.first
.generateString(args, locale: preamble.locale, pluralSelector: _selector);

@override
String generateStringAtIndex(int index, List args) =>
messages[getIndex(index)].generateString(args,
Expand Down
2 changes: 0 additions & 2 deletions pkgs/messages/test/messagelist_json_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ void main() {
serializationVersion: serializationVersion,
locale: 'en_US',
hash: 'hash',
hasIds: false,
),
[
StringMessage('Hello World'),
Expand Down Expand Up @@ -64,7 +63,6 @@ void main() {
null,
);

expect(messageList.preamble.hasIds, false);
expect(messageList.preamble.locale, 'en_US');
expect(messageList.generateStringAtIndex(0, []), 'Hello World');
expect(messageList.generateStringAtIndex(1, ['case1']), 'Case case1');
Expand Down
Loading
Loading