Skip to content

TesteurManiak/flutter_manga_reader

Repository files navigation

Flutter Manga Reader icon

Flutter Manga Reader

melos

A cross-platform manga reader built with Flutter.

This app is a Flutter clone of Tachiyomi mainly to provide an iOS version of the app.

This project is still a work in progress.

Screenshots

WIP

Views Light Dark Pure Dark
Library
Explorer
Details
Reader
History

Supported sources

WIP

Source Supported
Asura Scans 🔴
DragonTea 🔴
EarlyManga 🔴
MangaBat
MangaDex
Mangahere 🔴
Mangairo
Mangakakalot
Manganato
Webtoons.com 🔴

Features

WIP

  • Import manga & chapters from a Tachiyomi/Mihon backup
  • Global update of chapters
  • Webtoon and paginated manga reading
  • Download manga chapters for offline reading
  • Reading history
  • Language support for English and French
  • Light and dark themes
  • Pure Dark theme

Run the app

This project contains 3 flavors:

  • dev
  • staging
  • prod

To run the desired flavor either use the launch configuration in VSCode/Android Studio or use the following commands:

# Development
$ flutter run --flavor dev --target lib/main_dev.dart

# Staging
$ flutter run --flavor staging --target lib/main_staging.dart

# Production
$ flutter run --flavor prod --target lib/main_prod.dart

Working with Translations

This project relies on flutter_localizations and follows the official internationalization guide for Flutter.

Adding Strings

  1. To add a new localizable string, open the app_fr.arb file at lib/l10n/arb/app_fr.arb.
{
    "@@locale": "fr",
    "counterAppBarTitle": "Compteur"
}
  1. Then add a new key/value and description
{
    "@@locale": "fr",
    "counterAppBarTitle": "Compteur",
    "helloWorld": "Bonjour le monde"
}
  1. Generate the strings
$ flutter gen-l10n
  1. Use the new string
import 'package:flutter_manga_reader/core/core.dart';

@override
Widget build(BuildContext context) {
  final strings = context.strings;
  return Text(strings.helloWorld);
}

Adding Supported Locales

Update the CFBundleLocalizations array in the Info.plist at ios/Runner/Info.plist to include the new locale.

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>fr</string>
</array>

Adding Translations

  1. For each supported locale, add a new ARB file in lib/l10n/arb.
├── l10n
│   ├── arb
│   │   ├── app_en.arb
│   │   └── app_fr.arb
  1. Add the translated strings to each .arb file:

app_en.arb

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter"
}

app_fr.arb

{
    "@@locale": "fr",
    "counterAppBarTitle": "Compteur"
}

Code generation

This project uses multiple code generation tools:

  • flutter_gen_runner: To generate type-safe access to assets
  • freezed: To reduce the boilerplate when writing override of toString, ==, hashCode and copyWith methods
  • go_router_builder: To generate type-safe routes
  • json_serializable: To generate type-safe JSON serialization/deserialization
  • theme_tailor: To reduce the boilerplate when writing ThemeExtensionss

All of these tools will generate code when running the following command:

$ dart run build_runner build

Generating Icons

This project uses flutter_launcher_icons to generate the app icons. To modify the icons follow these steps:

  1. Replace the icon.png file at assets/launcher_icons/icon.png with your own icon. And edit the options in pubspec.yaml how you see fit.

  2. Run the following command:

$ dart run flutter_launcher_icons

Generating Splash Screens

This project uses flutter_native_splash to generate the splash screens. To modify the splash screens follow these steps:

  1. Replace the splash.png file at assets/splash/splash.png with your own splash screen. And edit the options in pubspec.yaml how you see fit.

  2. Run the following command:

$ dart run flutter_native_splash:create

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Credits

  • Tachiyomi: For providing the inspiration for this project
  • MangaDex: For providing the API used in this project

Disclaimer

The developer of this application does not have any affiliation with the content providers available.