Hi!
I reviewed the Indonesian translations and made a number of updates to improve clarity, consistency, and overall readability. Most changes are wording adjustments to make the text sound more natural to native Indonesian speakers.
This is my first contribution to the project. Please let me know if you'd like any changes or if there are localization guidelines I should follow.
New "Backup & restore" screen: export the workspace to a zip, or import one back. The archive is just launcher.db plus the shared preferences file, so a Lawnchair .lawnchairbackup imports unchanged -- both are Launcher3 forks and share the favorites schema (v32). Deep shortcuts, widgets and work-profile items all survive; nothing needs root. Three things worth knowing for anyone touching this: - We do not call RestoreDbTask.setPending(). Its sanitizeDB deletes every row whose profileId is not in the restored-profile mapping, and that mapping is only populated by a real Android Backup restore via ancestral serial numbers. On a same-device import it is empty, so sanitizing would silently drop all work-profile items. The profile ids are already correct here. - The preferences XML is parsed, not copied. A foreign backup carries its own DeviceGridState -- Lawnchair records migration_src_db_file as launcher_6_5_4.db -- and ModelDbController.createDbIfNotExists() opens whatever that names. Only five known-safe keys are carried over, pref_appNameMap among them (identical key and format in Lawnchair). - The import cannot be applied while the launcher is running: the model holds launcher.db open and its WAL would be flushed back over the file. stageImport unpacks to a staging dir, commitPendingImport arms it, and applyPendingImport swaps it in from LauncherApplication.onCreate before anything opens the database. Staging and committing are separate so that dying between the file picker and the confirmation dialog leaves an inert directory rather than an import the user never agreed to. Grid reflow is suppressed by writing migration_src_db_file: DeviceGridState .isCompatible compares nothing but the db file. Grid size is a separate pref that drives the IDP, set from the backup's pref_workspaceColumns/Rows. EMPTY_DATABASE_CREATED is cleared so loadDefaultFavoritesIfNecessary does not lay the stock workspace over the import.