Bearbeiten von „Exhibition-Workflow“

Zur Navigation springen Zur Suche springen

Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 45: Zeile 45:
# precondition: the current directory is the base folder of the dev-app.
# precondition: the current directory is the base folder of the dev-app.
# The following call works without meta data. It works without recreation of the tool:
# The following call works without meta data. It works without recreation of the tool:
./Meta update-modules-names
./Meta update-modules-list
# Now we need a new instance of the ./Meta (to realize the meta data changes):
# Now we need a new instance of the ./Meta (to realize the meta data changes):
./ReCreateMetaTool
./ReCreateMetaTool
Zeile 52: Zeile 52:
</syntaxhighlight>
</syntaxhighlight>


= Important Locations =
= Wichtige Orte =
* Application menu page: lib/setting/drawer_xxx.dart: Definition route + Icon
* Anwendungsmenü: lib/setting/drawer_xxx.dart: Definition route + Icon
* Starting route: lib/page/start_page.dart: globalData.navigate(context, '/Users/list');
* Startroute: lib/page/start_page.dart: globalData.navigate(context, '/Users/list');
 
= Typical Adaptions =
* all *_custom.dart:
** buildFrame(): formular elements (widgets)
** build(): "rows = attendedPage.getRows(...)": column list, column adaptions (onColumnOfRecord)
** requestRecords(): parameters of the database query
 
* list_user_custom.dart:
** buildFrame(): table headers
 
= Handling of a Combobox =
* all *_custom.dart:
<pre>
buildFrame(){
...
  comboRolesFromBackend(attendedPage: attendedPage, onDone: () => setState(() => 1));
  final itemsRoles =
        comboRoles(i18n.trDyn(GlobalTranslations.comboboxSelect), attendedPage);
...
FormItem(
  DropdownButtonFormField<int>(
    value: itemsRoles == null || itemsRoles.length == 1 ? 0 : _fieldData.role,
    items: itemsRoles,
    isExpanded: true,
    decoration: InputDecoration(labelText: i18n.tr('Role')),
    onChanged: (value) => _fieldData.role = value ?? 0,
    ),
  weight: 6),
...
}
class _FieldData {
...
  int role;
...
}
</pre>
 
= I18N =
== Coding ==
<pre>
// in each source file using I18N:
final i18n = I18N();
...
  // Usage in any expression:
  // Simple without parameters:
  final msg = i18n.tr('Please wait');
  // Singular/plural case:
  final msg = i18n.ntr('Hi user', 'Hi users', countUsers);
  // Dynamic key (not a string constant):
  comboUsers(i18n.trDyn(GlobalTranslations.comboboxSelect), ...);
  // String with placeholder(s):
  rc = i18n.trArgs('Not a Date: {0}', '!global', [input]);
</pre>
== Workflow ==
=== For the First Time ===
<pre>
cd $BASE_PROJECT
mkdir -p i18n
tools/i18n_text_parser parse lib i18n
vi i18n/project.i18n.yaml
# Adapt the data in the yaml file
# Than run again:
tools/i18n_text_parser parse lib i18n
tools/i18n_text_parser msg-init i18n '!globals' de_DE
</pre>
* In the directory i18n will be created some *.pot files (one for each module)
* Translate them with babel
 
= Android Configuration =
* android/app/src/debug/AndroidManifest.xml + android/app/src/profile/AndroidManifest.xml:
<pre>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
</pre>
* android/app/src/main/AndroidManifest.xml:
<pre>
...
    package="de.hamatoma.exhibition">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
 
  <application>
...
</pre>
* android/app/build.gradle
<pre>
    defaultConfig {
...
      multiDexEnabled true
    }
...
</pre>
 
=== After the First Time ===
<pre>
tools/i18n_text_parser parse lib i18n
</pre>

Bitte kopiere keine Webseiten, die nicht deine eigenen sind, benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!
Du gibst uns hiermit deine Zusage, dass du den Text selbst verfasst hast, dass der Text Allgemeingut (public domain) ist, oder dass der Urheber seine Zustimmung gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der Diskussionsseite darauf hin. Bitte beachte, dass alle Info-Theke-Beiträge automatisch unter der „Gemeinfreiheit“ stehen (siehe Info-Theke:Urheberrechte für Einzelheiten). Falls du nicht möchtest, dass deine Arbeit hier von anderen verändert und verbreitet wird, dann klicke nicht auf „Seite speichern“.

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)