Merge branch 'feat/localization' of github.com:GetStream/stream-chat-flutter into feat/localization

This commit is contained in:
xsahil03x
2021-07-21 21:11:19 +05:30
9 changed files with 764 additions and 24 deletions
@@ -70,7 +70,12 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) => MaterialApp(
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
supportedLocales: const [Locale('en'), Locale('hi')],
supportedLocales: const [
Locale('en'),
Locale('hi'),
Locale('fr'),
Locale('it'),
],
localizationsDelegates: GlobalStreamChatLocalizations.delegates,
builder: (context, widget) => StreamChat(
client: client,
@@ -67,9 +67,9 @@ abstract class Translations {
String get instantCommandsLabel;
String get fileTooLargeAfterCompressionError;
String fileTooLargeAfterCompressionError(double limitInMB);
String get fileTooLargeError;
String fileTooLargeError(double limitInMB);
String emojiMatchingQueryText(String query);
@@ -314,14 +314,14 @@ class DefaultTranslations implements Translations {
String get instantCommandsLabel => 'Instant Commands';
@override
String get fileTooLargeAfterCompressionError =>
String fileTooLargeAfterCompressionError(double limitInMB) =>
'The file is too large to upload. '
'The file size limit is 20MB. '
'The file size limit is $limitInMB MB. '
'We tried compressing it, but it was not enough.';
@override
String get fileTooLargeError =>
'The file is too large to upload. The file size limit is 20MB.';
String fileTooLargeError(double limitInMB) =>
'The file is too large to upload. The file size limit is $limitInMB MB.';
@override
String emojiMatchingQueryText(String query) => 'Emoji matching "$query"';
@@ -1144,7 +1144,9 @@ class MessageInputState extends State<MessageInput> {
if (mediaInfo.filesize! > widget.maxAttachmentSize) {
_showErrorAlert(
context.translations.fileTooLargeAfterCompressionError,
context.translations.fileTooLargeAfterCompressionError(
widget.maxAttachmentSize / (1024 * 1024),
),
);
return;
}
@@ -1155,7 +1157,9 @@ class MessageInputState extends State<MessageInput> {
path: mediaInfo.path,
);
} else {
_showErrorAlert(context.translations.fileTooLargeError);
_showErrorAlert(context.translations.fileTooLargeError(
widget.maxAttachmentSize / (1024 * 1024),
));
return;
}
}
@@ -1922,7 +1926,9 @@ class MessageInputState extends State<MessageInput> {
if (mediaInfo.filesize! > widget.maxAttachmentSize) {
_showErrorAlert(
context.translations.fileTooLargeAfterCompressionError,
context.translations.fileTooLargeAfterCompressionError(
widget.maxAttachmentSize / (1024 * 1024),
),
);
return;
}
@@ -1933,7 +1939,9 @@ class MessageInputState extends State<MessageInput> {
path: mediaInfo.path,
);
} else {
_showErrorAlert(context.translations.fileTooLargeError);
_showErrorAlert(context.translations.fileTooLargeError(
widget.maxAttachmentSize / (1024 * 1024),
));
return;
}
}
@@ -6,7 +6,8 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'
show StreamChatLocalizations, User;
part 'stream_chat_localizations_en.dart';
part 'stream_chat_localizations_fr.dart';
part 'stream_chat_localizations_it.dart';
part 'stream_chat_localizations_hi.dart';
/// The set of supported languages, as language code strings.
@@ -17,7 +18,12 @@ part 'stream_chat_localizations_hi.dart';
/// See also:
///
/// * [getStreamChatTranslation], whose documentation describes these values.
const kStreamChatSupportedLanguages = {'en', 'hi'};
const kStreamChatSupportedLanguages = {
'en',
'hi',
'fr',
'it',
};
/// Creates a [GlobalStreamChatLocalizations] instance for the given `locale`.
///
@@ -43,6 +49,10 @@ GlobalStreamChatLocalizations? getStreamChatTranslation(Locale locale) {
return const StreamChatLocalizationsEn();
case 'hi':
return const StreamChatLocalizationsHi();
case 'fr':
return const StreamChatLocalizationsFr();
case 'it':
return const StreamChatLocalizationsIt();
}
}
@@ -115,14 +115,14 @@ class StreamChatLocalizationsEn extends GlobalStreamChatLocalizations {
String get instantCommandsLabel => 'Instant Commands';
@override
String get fileTooLargeAfterCompressionError =>
String fileTooLargeAfterCompressionError(double limitInMB) =>
'The file is too large to upload. '
'The file size limit is 20MB. '
'The file size limit is $limitInMB MB. '
'We tried compressing it, but it was not enough.';
@override
String get fileTooLargeError =>
'The file is too large to upload. The file size limit is 20MB.';
String fileTooLargeError(double limitInMB) =>
'The file is too large to upload. The file size limit is $limitInMB MB.';
@override
String emojiMatchingQueryText(String query) => 'Emoji matching "$query"';
@@ -0,0 +1,360 @@
part of 'stream_chat_localizations.dart';
/// The translations for English (`fr`).
class StreamChatLocalizationsFr extends GlobalStreamChatLocalizations {
/// Create an instance of the translation bundle for French.
const StreamChatLocalizationsFr({String localeName = 'fr'})
: super(localeName: localeName);
@override
String get launchUrlError => "Impossible de lancer l'url";
@override
String get loadingUsersError => 'Erreur de chargement des utilisateurs';
@override
String get noUsersLabel => "Il n'y a pas d'utilisateurs actuellement";
@override
String get retryLabel => 'Réessayer';
@override
String get userLastOnlineText => 'Dernière fois en ligne';
@override
String get userOnlineText => 'En ligne';
@override
String userTypingText(Iterable<User> users) {
if (users.isEmpty) return '';
final first = users.first;
if (users.length == 1) {
return "${first.name} est en train d'écrire";
}
return "${first.name} and ${users.length - 1} sont entrain d'écrire";
}
@override
String get threadReplyLabel => 'Réponse au fil de discussion';
@override
String get onlyVisibleToYouText => 'Seulement visible par vous';
@override
String threadReplyCountText(int count) =>
"$count Réponses au fil de discussion";
@override
String attachmentsUploadProgressText({
required int remaining,
required int total,
}) =>
'Uploading $remaining/$total ...';
@override
String pinnedByUserText({
required User pinnedBy,
required User currentUser,
}) {
final pinnedByCurrentUser = currentUser.id == pinnedBy.id;
if (pinnedByCurrentUser) return 'Épinglé par vous';
return 'Épinglé par ${pinnedBy.name}';
}
@override
String get emptyMessagesText => "Il n'y a pas de messages actuellement";
@override
String get genericErrorText => 'Il y a eu un problème';
@override
String get loadingMessagesError => 'Erreur de chargement des messages';
@override
String resultCountText(int count) => '$count résultats';
@override
String get messageDeletedText => 'Ce message a été supprimé.';
@override
String get messageDeletedLabel => 'Message supprimé';
@override
String get messageReactionsText => 'Réactions aux messages';
@override
String get emptyChatMessagesText => 'Pas encore de chats ici...';
@override
String threadSeparatorText(int replyCount) {
if (replyCount == 1) return '1 Réponse';
return '$replyCount Replies';
}
@override
String get connectedLabel => 'Connecté';
@override
String get disconnectedLabel => 'Déconnecté';
@override
String get reconnectingLabel => 'Reconnexion...';
@override
String get alsoSendAsDirectMessageLabel =>
'Envoyer aussi comme message direct';
@override
String get addACommentOrSendLabel => 'Ajouter un commentaire ou envoyer';
@override
String get searchGifLabel => 'Recherche de GIFs';
@override
String get writeAMessageLabel => 'Écrire un message';
@override
String get instantCommandsLabel => 'Commandes instantanées';
@override
String fileTooLargeAfterCompressionError(double limitInMB) =>
'Le fichier est trop volumineux pour être téléchargé. '
'La taille maximale des fichiers est de $limitInMB Mo. '
"Nous avons essayé de le compresser, mais ce n'était pas suffisant.";
@override
String fileTooLargeError(double limitInMB) =>
'Le fichier est trop volumineux pour être téléchargé. La taille limite du fichier est de $limitInMB Mo.';
@override
String emojiMatchingQueryText(String query) =>
'Emoji qui correspond à "$query"';
@override
String get addAFileLabel => 'Ajouter un fichier';
@override
String get photoFromCameraLabel => "Photo de l'appareil photo";
@override
String get uploadAFileLabel => 'Transférer un fichier';
@override
String get uploadAPhotoLabel => 'Transférer une photo';
@override
String get uploadAVideoLabel => 'Transférer une vidéo';
@override
String get videoFromCameraLabel => 'Vidéo depuis la camera';
@override
String get okLabel => 'OK';
@override
String get somethingWentWrongLabel => 'Quelque chose a mal tourné';
@override
String get addMoreFilesLabel => "Ajouter d'autres fichiers";
@override
String get enablePhotoAndVideoAccessMessage =>
"Veuillez autoriser l'accès à vos photos"
'\net vidéos afin de pouvoir les partager avec vos amis.';
@override
String get allowGalleryAccessMessage => "Autoriser l'accès à votre galerie";
@override
String get flagMessageLabel => 'Signaler un message';
@override
String get flagMessageQuestion =>
'Voulez-vous envoyer une copie de ce message à un'
'\nmodérateur pour une enquête plus approfondie ?';
@override
String get flagLabel => 'SIGNALER';
@override
String get cancelLabel => 'ANNULER';
@override
String get flagMessageSuccessfulLabel => 'Message signalé';
@override
String get flagMessageSuccessfulText =>
'Ce message a été signalé à un modérateur.';
@override
String get deleteLabel => 'SUPPRIMER';
@override
String get deleteMessageLabel => 'Supprimer le message';
@override
String get deleteMessageQuestion =>
'Êtes-vous sûr de vouloir supprimer définitivement ce\nmessage ?';
@override
String get operationCouldNotBeCompletedText =>
"L'opération n'a pas pu être terminée.";
@override
String get replyLabel => 'Répondre';
@override
String togglePinUnpinText({required bool pinned}) {
if (pinned) return 'Détacher de la conversation';
return 'Attacher à la conversation';
}
@override
String toggleDeleteRetryDeleteMessageText({required bool isDeleteFailed}) {
if (isDeleteFailed) return 'Retenter de supprimer le message';
return 'Supprimer le message';
}
@override
String get copyMessageLabel => 'Copier le message';
@override
String get editMessageLabel => 'Modifier le message';
@override
String toggleResendOrResendEditedMessage({required bool isUpdateFailed}) {
if (isUpdateFailed) return 'Renvoyer le message modifié';
return 'Renvoyer';
}
@override
String get photosLabel => 'Photos';
String _getDay(DateTime dateTime) {
final now = Jiffy(DateTime.now());
final date = Jiffy(dateTime);
if (date.isSame(now, Units.DAY)) {
return "aujourd'hui";
} else if (now.diff(date, Units.HOUR) < 24) {
return 'hier';
} else {
return 'le ${date.MMMd}';
}
}
@override
String sentAtText({required DateTime date, required DateTime time}) =>
'Envoyé ${_getDay(date)} à ${Jiffy(time.toLocal()).format('HH:mm')}';
@override
String get todayLabel => "Aujourd'hui";
@override
String get yesterdayLabel => 'Hier';
@override
String get channelIsMutedText => 'Le canal est coupé';
@override
String get noTitleText => 'Aucun titre';
@override
String get letsStartChattingLabel => 'Commençons à discuter !';
@override
String get sendingFirstMessageLabel =>
"Que diriez-vous d'envoyer votre premier message à un ami ?";
@override
String get startAChatLabel => 'Commencer une discussion';
@override
String get loadingChannelsError => 'Erreur lors du chargement des canaux';
@override
String get deleteConversationLabel => 'Supprimer la conversation';
@override
String get deleteConversationQuestion =>
'Vous êtes sûr de vouloir supprimer cette conversation ?';
@override
String get streamChatLabel => 'Stream Chat';
@override
String get searchingForNetworkLabel => 'Recherche de réseau';
@override
String get offlineLabel => 'Hors ligne...';
@override
String get tryAgainLabel => 'Essayer à nouveau';
@override
String membersCountText(int count) {
if (count == 1) return '1 Membre';
return '$count Membres';
}
@override
String watchersCountText(int count) {
if (count == 1) return '1 En ligne';
return '$count En ligne';
}
@override
String get viewInfoLabel => 'Voir les informations';
@override
String get leaveGroupLabel => 'Quitter le Group';
@override
String get leaveLabel => 'QUITTER';
@override
String get leaveConversationLabel => 'Quitter la conversation';
@override
String get leaveConversationQuestion =>
'Etes-vous sûr de vouloir quitter cette conversation ?';
@override
String get showInChatLabel => 'Montrer dans le Chat';
@override
String get saveImageLabel => "Sauvegarder l'image";
@override
String get saveVideoLabel => 'Sauvegarder la vidéo';
@override
String get uploadErrorLabel => 'ERREUR DE TRANSFERT';
@override
String get giphyLabel => 'Giphy';
@override
String get shuffleLabel => 'Mélanger';
@override
String get sendLabel => 'Envoyer';
@override
String get withText => 'avec';
@override
String get inText => 'dans';
@override
String get youText => 'Vous';
@override
String get ofText => 'de';
@override
String get fileText => 'Fichier';
@override
String get replyToMessageLabel => 'Répondre au Message';
}
@@ -1,6 +1,6 @@
part of 'stream_chat_localizations.dart';
/// The translations for English (`hi`).
/// The translations for Hindi (`hi`).
class StreamChatLocalizationsHi extends GlobalStreamChatLocalizations {
/// Create an instance of the translation bundle for Hindi.
const StreamChatLocalizationsHi({String localeName = 'hi'})
@@ -115,14 +115,14 @@ class StreamChatLocalizationsHi extends GlobalStreamChatLocalizations {
String get instantCommandsLabel => 'तत्काल आदेश';
@override
String get fileTooLargeAfterCompressionError =>
String fileTooLargeAfterCompressionError(double limitInMB) =>
'फ़ाइल अपलोड करने के लिए बहुत बड़ी है। '
'फ़ाइल आकार सीमा 20MB है। '
'फ़ाइल आकार सीमा $limitInMB MB है। '
'हमने इसे कंप्रेस करने की कोशिश की, लेकिन यह काफी नहीं था।';
@override
String get fileTooLargeError =>
'फ़ाइल अपलोड करने के लिए बहुत बड़ी है। फ़ाइल आकार सीमा 20MB है।';
String fileTooLargeError(double limitInMB) =>
'फ़ाइल अपलोड करने के लिए बहुत बड़ी है। फ़ाइल आकार सीमा $limitInMB MB है।';
@override
String emojiMatchingQueryText(String query) => '"$query" से मिलते हुए इमोजी';
@@ -0,0 +1,358 @@
part of 'stream_chat_localizations.dart';
/// The translations for English (`hi`).
class StreamChatLocalizationsIt extends GlobalStreamChatLocalizations {
/// Create an instance of the translation bundle for Hindi.
const StreamChatLocalizationsIt({String localeName = 'it'})
: super(localeName: localeName);
@override
String get launchUrlError => 'Impossibile aprire l\'url';
@override
String get loadingUsersError => 'Errore durante il carimento degli utenti';
@override
String get noUsersLabel => 'Non c\'é nessun utente al momento';
@override
String get retryLabel => 'Riprova';
@override
String get userLastOnlineText => 'Ultimo accesso';
@override
String get userOnlineText => 'Online';
@override
String userTypingText(Iterable<User> users) {
if (users.isEmpty) return '';
final first = users.first;
if (users.length == 1) {
return '${first.name} sta scrivendo';
}
return '${first.name} e altri ${users.length - 1} stanno scrivendo';
}
@override
String get threadReplyLabel => 'Rispondi nel thread';
@override
String get onlyVisibleToYouText => 'Visible solo a te';
@override
String threadReplyCountText(int count) => '$count risposte al thread';
@override
String attachmentsUploadProgressText({
required int remaining,
required int total,
}) =>
'Caricamento $remaining/$total ...';
@override
String pinnedByUserText({
required User pinnedBy,
required User currentUser,
}) {
final pinnedByCurrentUser = currentUser.id == pinnedBy.id;
if (pinnedByCurrentUser) return 'Messo in evidenza da te';
return 'Messo in evidenza da ${pinnedBy.name}';
}
@override
String get emptyMessagesText => 'Non c\'é nessun messaggio al momento';
@override
String get genericErrorText => 'Qualcosa è andato storto';
@override
String get loadingMessagesError =>
'Errore durante il caricamento dei messaggi';
@override
String resultCountText(int count) => '$count risultati';
@override
String get messageDeletedText => 'Questo messaggio è stato eliminato';
@override
String get messageDeletedLabel => 'Messaggio cancellato';
@override
String get messageReactionsText => 'Reazioni al messaggio';
@override
String get emptyChatMessagesText => 'Nessuna conversazione al momento...';
@override
String threadSeparatorText(int replyCount) {
if (replyCount == 1) return '1 risposta';
return '$replyCount risposte';
}
@override
String get connectedLabel => 'Connesso';
@override
String get disconnectedLabel => 'Disconnesso';
@override
String get reconnectingLabel => 'Riconnessione in corso...';
@override
String get alsoSendAsDirectMessageLabel =>
'Manda anche come messaggio diretto';
@override
String get addACommentOrSendLabel => 'Aggiungi un commento o invia';
@override
String get searchGifLabel => 'Cerca una GIF';
@override
String get writeAMessageLabel => 'Scrivi un messaggio';
@override
String get instantCommandsLabel => 'Commandi istantanei';
@override
String fileTooLargeAfterCompressionError(double limitInMB) =>
'Il file è troppo grande per essere caricato. '
'Il file eccede il limite di $limitInMB MB. '
'Abbiamo provato a comprimerlo, ma non è stato abbastanza.';
@override
String fileTooLargeError(double limitInMB) => '''
Il file è troppo grande per essere caricato. Il limite è di $limitInMB MB.''';
@override
String emojiMatchingQueryText(String query) => 'Emoji per "$query"';
@override
String get addAFileLabel => 'Aggiungi un file';
@override
String get photoFromCameraLabel => 'Immagine dalla fotocamera';
@override
String get uploadAFileLabel => 'Carica un file';
@override
String get uploadAPhotoLabel => 'Carica una foto';
@override
String get uploadAVideoLabel => 'Carica un video';
@override
String get videoFromCameraLabel => 'Video dalla fotocamera';
@override
String get okLabel => 'Ok';
@override
String get somethingWentWrongLabel => 'Qualcosa è andato storto';
@override
String get addMoreFilesLabel => 'Aggiungi altri file';
@override
String get enablePhotoAndVideoAccessMessage =>
'Per favore attiva l\'accesso alle foto'
'\ne ai video cosí potrai condividerli con i tuoi amici.';
@override
String get allowGalleryAccessMessage => 'Permetti l\'accesso alla galleria';
@override
String get flagMessageLabel => 'Segnala messaggio';
@override
String get flagMessageQuestion => 'Vuoi mandare una copia di questo messaggio'
'\nad un moderatore?';
@override
String get flagLabel => 'SEGNALA';
@override
String get cancelLabel => 'ANNULLA';
@override
String get flagMessageSuccessfulLabel => 'Messaggio segnalato';
@override
String get flagMessageSuccessfulText =>
'Questo messaggio è stato segnalato ad un moderatore.';
@override
String get deleteLabel => 'CANCELLA';
@override
String get deleteMessageLabel => 'Cancella messaggio';
@override
String get deleteMessageQuestion =>
'Sei sicuro di voler definitivamente cancellare questo\nmessaggio?';
@override
String get operationCouldNotBeCompletedText =>
'Non è stato possibile completare questa operazione.';
@override
String get replyLabel => 'Rispondi';
@override
String togglePinUnpinText({required bool pinned}) {
if (pinned) return 'Rimuovi dagli elementi in evidenza';
return 'Metti in evidenza';
}
@override
String toggleDeleteRetryDeleteMessageText({required bool isDeleteFailed}) {
if (isDeleteFailed) return 'Riprova a cancellare il messaggio';
return 'Cancella il messaggio';
}
@override
String get copyMessageLabel => 'Copia messaggio';
@override
String get editMessageLabel => 'Modifica messaggio';
@override
String toggleResendOrResendEditedMessage({required bool isUpdateFailed}) {
if (isUpdateFailed) return 'Riprova modifica messaggio';
return 'Riprova';
}
@override
String get photosLabel => 'Foto';
String _getDay(DateTime dateTime) {
final now = Jiffy(DateTime.now());
final date = Jiffy(dateTime);
if (date.isSame(now, Units.DAY)) {
return 'oggi';
} else if (now.diff(date, Units.HOUR) < 24) {
return 'ieri';
} else {
return 'il ${date.MMMd}';
}
}
@override
String sentAtText({required DateTime date, required DateTime time}) => '''
Inviato il ${_getDay(date)} alle ${Jiffy(time.toLocal()).format('HH:mm')}''';
@override
String get todayLabel => 'Oggi';
@override
String get yesterdayLabel => 'Ieri';
@override
String get channelIsMutedText => 'Il canale è mutato';
@override
String get noTitleText => 'Nessun titolo';
@override
String get letsStartChattingLabel => 'Inizia una conversazione!';
@override
String get sendingFirstMessageLabel =>
'Che ne dici di mandare il tuo primo messaggio ad un amico?';
@override
String get startAChatLabel => 'Inizia una conversazione';
@override
String get loadingChannelsError => 'Errore durante il caricamento dei canali';
@override
String get deleteConversationLabel => 'Elemina conversazione';
@override
String get deleteConversationQuestion =>
'Sei sicuro di voler eliminare questa conversazione?';
@override
String get streamChatLabel => 'Stream Chat';
@override
String get searchingForNetworkLabel => 'Cercando una connessione';
@override
String get offlineLabel => 'Offline...';
@override
String get tryAgainLabel => 'Riprova';
@override
String membersCountText(int count) {
if (count == 1) return '1 membro';
return '$count membri';
}
@override
String watchersCountText(int count) {
if (count == 1) return '1 Online';
return '$count Online';
}
@override
String get viewInfoLabel => 'Vedi info';
@override
String get leaveGroupLabel => 'Esci dal gruppo';
@override
String get leaveLabel => 'ESCI';
@override
String get leaveConversationLabel => 'Esci dalla conversazione';
@override
String get leaveConversationQuestion =>
'Sei sicuro di voler lasciare questa conversazione?';
@override
String get showInChatLabel => 'Mostra nella chat';
@override
String get saveImageLabel => 'Salva immagine';
@override
String get saveVideoLabel => 'Salva video';
@override
String get uploadErrorLabel => 'ERRORE DURANTE IL CARICAMENTO';
@override
String get giphyLabel => 'Giphy';
@override
String get shuffleLabel => 'Shuffle';
@override
String get sendLabel => 'Invia';
@override
String get withText => 'con';
@override
String get inText => 'in';
@override
String get youText => 'te';
@override
String get ofText => 'di';
@override
String get fileText => 'file';
@override
String get replyToMessageLabel => 'Rispondi al messaggio';
}
@@ -12,8 +12,7 @@ dependencies:
sdk: flutter
flutter_localizations:
sdk: flutter
stream_chat_flutter:
path: ../stream_chat_flutter
stream_chat_flutter: ^2.0.0
dev_dependencies:
flutter_test: