# Contributing ## Getting Started 1. Fork and clone the repository 2. Run `flutter pub get` to install dependencies 3. Run `dart run build_runner build` to generate code 4. Start developing! ## Development - Follow Dart/Flutter conventions - Run `dart format .` to format your code (note: generated files like `*.g.dart` are excluded from CI checks) - Run `flutter analyze` before submitting to check for issues - Run `flutter test` if tests are available - Test your changes thoroughly ### Code Quality Checks The project includes automated CI checks that run on all pull requests: 1. **Code Formatting**: Ensures code follows Dart formatting standards - Run locally: `dart format .` to format all files - Note: CI only checks non-generated files (excludes `.g.dart`, `.freezed.dart`) - Generated files are reformatted automatically by build tools 2. **Static Analysis**: Checks for code issues and potential bugs - Run locally: `flutter analyze` - Note: CI excludes generated files from analysis (configured in `analysis_options.yaml`) 3. **Tests**: Runs unit and widget tests (when available) - Run locally: `flutter test` All these checks must pass before your changes can be merged. ## Internationalization (i18n) This project uses `slang` for internationalization with JSON files. ### Adding New Strings 1. Add your string to `lib/i18n/strings.i18n.json`: ```json { "section": { "myNewString": "My new text" } } ``` 2. Run `dart run slang` to regenerate translation files 3. Use in your code: ```dart Text(t.section.myNewString) ``` ### Adding New Languages 1. Create new JSON file: `lib/i18n/strings_[locale].i18n.json` 2. Copy structure from `strings.i18n.json` and translate values 3. Run `dart run slang` to regenerate files ### Guidelines - Organize strings logically in nested objects - Use camelCase for keys - Keep strings concise and clear - Always run `dart run slang` after changes