Merge branch 'master' of gitorious.org:f-droid/fdroidclient

This commit is contained in:
Ciaran Gultnieks 2011-01-17 17:28:49 +00:00
commit ae6e9d57ff
19 changed files with 2381 additions and 1496 deletions

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2010-11-15 07:54+0000\n" "POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: 2010-10-31 21:13+0200\n" "PO-Revision-Date: 2010-11-16 09:54+0200\n"
"Last-Translator: Jan-Christoph <JanCBorchardt@gmail.com>\n" "Last-Translator: Jan-Christoph <JanCBorchardt@gmail.com>\n"
"Language-Team: de <LL@li.org>\n" "Language-Team: de <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
@ -16,65 +16,72 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n" "Generated-By: Babel 1.0dev\n"
#, fuzzy msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
msgctxt "version" msgctxt "version"
msgid "Version" msgid "Version"
msgstr "Server-Version:" msgstr "Version"
#, fuzzy, python-format #, python-format
msgctxt "n_versions_available" msgctxt "n_versions_available"
msgid "%d versions available" msgid "%d versions available"
msgstr "Aktualisierungen verfügbar" msgstr "%d verfügbare Versionen"
#, fuzzy, python-format #, python-format
msgctxt "n_version_available" msgctxt "n_version_available"
msgid "%d version available" msgid "%d version available"
msgstr "Aktualisierungen verfügbar" msgstr "%d verfügbare Version"
msgctxt "notify" msgctxt "notify"
msgid "Notify" msgid "Notify"
msgstr "" msgstr "Benachrichtigen"
msgctxt "storage" msgctxt "storage"
msgid "Storage" msgid "Storage"
msgstr "" msgstr "Speicherplatz"
msgctxt "cache_downloaded" msgctxt "cache_downloaded"
msgid "Cache downloaded apps" msgid "Cache downloaded apps"
msgstr "" msgstr "Heruntergeladene Anwendungen zwischenspeichern"
msgctxt "keep_downloaded" msgctxt "keep_downloaded"
msgid "Keep downloaded apk files on SD card" msgid "Keep downloaded apk files on SD card"
msgstr "" msgstr "Heruntergeladene Anwendungsdateien auf der SD-Karte behalten"
#, fuzzy
msgctxt "updates" msgctxt "updates"
msgid "Updates" msgid "Updates"
msgstr "Aktualisierungen" msgstr "Aktualisierungen"
msgctxt "clear_all_cached_data" msgctxt "clear_all_cached_data"
msgid "Clear all cached data" msgid "Clear all cached data"
msgstr "" msgstr "Zwischenspeicher leeren"
msgctxt "reset" msgctxt "reset"
msgid "Reset" msgid "Reset"
msgstr "" msgstr "Zurücksetzen"
msgctxt "maintenance" msgctxt "maintenance"
msgid "Maintenance" msgid "Maintenance"
msgstr "" msgstr "Verwaltung"
msgctxt "notify_updates_available" msgctxt "notify_updates_available"
msgid "Notify when new updates are available" msgid "Notify when new updates are available"
msgstr "" msgstr "Bei Aktualisierungen benachrichtigen"
#, fuzzy
msgctxt "update_apps_list" msgctxt "update_apps_list"
msgid "Update apps list from repositories automatically" msgid "Update app list from repositories automatically"
msgstr "" msgstr "Anwendungsliste automatisch aktualisieren"
msgctxt "automatic_repo_scan" msgctxt "automatic_repo_scan"
msgid "Automatic repo scan" msgid "Automatic repo scan"
msgstr "" msgstr "Automatische Archivkontrolle"
msgctxt "app_name" msgctxt "app_name"
msgid "FDroid" msgid "FDroid"
@ -88,37 +95,38 @@ msgstr "Über FDroid"
msgctxt "about_desc" msgctxt "about_desc"
msgid "" msgid ""
"Originally based on Aptoide.\n" "Originally based on Aptoide.\n"
"Released under the GNU GPL v2 license." "Released under the GNU GPLv2 license."
msgstr "" msgstr ""
"Basierend auf Aptoide.\n" "Basierend auf Aptoide.\n"
"Lizensiert unter GNU GPLv2." "Lizensiert unter GNU GPLv2."
#, fuzzy
msgctxt "about_site" msgctxt "about_site"
msgid "Home:" msgid "Website:"
msgstr "Internetseite:"
#, fuzzy
msgctxt "about_mail"
msgid "Email:"
msgstr "E-Mail:"
#, fuzzy
msgctxt "about_version"
msgid "Version:"
msgstr "Server-Version:"
msgctxt "about_website"
msgid "Web Site"
msgstr "Internetseite" msgstr "Internetseite"
msgctxt "about_mail"
msgid "Email:"
msgstr "Email:"
msgctxt "about_version"
msgid "Version:"
msgstr "Version:"
#, fuzzy
msgctxt "about_website"
msgid "Website"
msgstr "Internetseite"
#, fuzzy
msgctxt "no_repo" msgctxt "no_repo"
msgid "" msgid ""
"You have no repositories configured!\n" "You don't have any repositories configured!\n"
"\n" "\n"
"A repository is a source of applications. To add one, press the MENU " "A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n" "button now and enter the URL.\n"
"\n" "\n"
"A repository URL looks something like this: http://f-droid.org/repo" "A repository address looks something like this: http://f-droid.org/repo"
msgstr "" msgstr ""
"Sie haben keine Archive eingestellt!\n" "Sie haben keine Archive eingestellt!\n"
"\n" "\n"
@ -136,8 +144,8 @@ msgid "Update possible - Ver.:"
msgstr "Aktualisierung verfügbar Version:" msgstr "Aktualisierung verfügbar Version:"
msgctxt "ok" msgctxt "ok"
msgid "Ok" msgid "OK"
msgstr "OK" msgstr ""
msgctxt "yes" msgctxt "yes"
msgid "Yes" msgid "Yes"
@ -159,7 +167,6 @@ msgctxt "cancel"
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#, fuzzy
msgctxt "repo_delete_title" msgctxt "repo_delete_title"
msgid "Choose repository to remove" msgid "Choose repository to remove"
msgstr "Zu entfernendes Archiv auswählen" msgstr "Zu entfernendes Archiv auswählen"
@ -216,8 +223,9 @@ msgctxt "download_server"
msgid "Getting application from" msgid "Getting application from"
msgstr "Anwendung wird heruntergeladen von" msgstr "Anwendung wird heruntergeladen von"
#, fuzzy
msgctxt "repo_add_url" msgctxt "repo_add_url"
msgid "Repository URL" msgid "Repository address"
msgstr "Archiv-Adresse" msgstr "Archiv-Adresse"
msgctxt "isinst" msgctxt "isinst"
@ -236,18 +244,20 @@ msgctxt "update"
msgid "Update!" msgid "Update!"
msgstr "Aktualisieren!" msgstr "Aktualisieren!"
#, fuzzy
msgctxt "update_alrt" msgctxt "update_alrt"
msgid "" msgid ""
"There updates available for some installed applications.\n" "There are updates available for some installed applications.\n"
"Do you wish to see them?" "Do you want to see them?"
msgstr "" msgstr ""
"Für einige installierte Anwendungen sind Aktualisierungen verfügbar.\n" "Für einige installierte Anwendungen sind Aktualisierungen verfügbar.\n"
"Sollen diese angezeigt werden?" "Sollen diese angezeigt werden?"
#, fuzzy
msgctxt "repo_alrt" msgctxt "repo_alrt"
msgid "" msgid ""
"The list of repositories in use has been changed.\n" "The list of used repositories has changed.\n"
"Do you wish to update them?" "Do you want to update them?"
msgstr "" msgstr ""
"Die Liste der genutzten Archive wurde geändert.\n" "Die Liste der genutzten Archive wurde geändert.\n"
"Soll sie aktualisiert werden?" "Soll sie aktualisiert werden?"
@ -272,7 +282,7 @@ msgstr "Archive verwalten"
msgctxt "menu_preferences" msgctxt "menu_preferences"
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "Einstellungen"
msgctxt "menu_about" msgctxt "menu_about"
msgid "About" msgid "About"
@ -294,8 +304,9 @@ msgctxt "menu_uninstall"
msgid "Uninstall" msgid "Uninstall"
msgstr "Entfernen" msgstr "Entfernen"
#, fuzzy
msgctxt "menu_website" msgctxt "menu_website"
msgid "Web Site" msgid "Website"
msgstr "Internetseite" msgstr "Internetseite"
msgctxt "menu_issues" msgctxt "menu_issues"
@ -314,22 +325,65 @@ msgctxt "menu_update"
msgid "Update" msgid "Update"
msgstr "Aktualisieren" msgstr "Aktualisieren"
#, fuzzy, python-format #, python-format
msgctxt "details_installed" msgctxt "details_installed"
msgid "Version %s installed" msgid "Version %s installed"
msgstr "Nicht Installiert" msgstr "Version %s installiert"
#, python-format #, python-format
msgctxt "details_notinstalled" msgctxt "details_notinstalled"
msgid "Not installed (%d available)" msgid "Not installed (%d available)"
msgstr "" msgstr "Nicht installiert (%d verfügbar)"
#, fuzzy
msgctxt "inst" msgctxt "inst"
msgid "Installed" msgid "Installed"
msgstr "Installiert" msgstr "Installiert"
msgctxt "corrupt_download" msgctxt "corrupt_download"
msgid "Downloaded file is corrupt" msgid "Downloaded file is corrupt"
msgstr "Heruntergeladene Datei ist fehlerhaft"
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr "" msgstr ""

View File

@ -2,14 +2,13 @@
# Copyright (C) 2010 ORGANIZATION # Copyright (C) 2010 ORGANIZATION
# This file is distributed under the same license as the PACKAGE project. # This file is distributed under the same license as the PACKAGE project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
#, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2010-11-15 07:54+0000\n" "POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: 2010-11-15 07:54+0000\n" "PO-Revision-Date: 2010-12-15 06:43+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: MagicFab <magicfab@member.fsf.org>\n"
"Language-Team: fr <LL@li.org>\n" "Language-Team: fr <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -17,299 +16,373 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n" "Generated-By: Babel 1.0dev\n"
msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
msgctxt "version" msgctxt "version"
msgid "Version" msgid "Version"
msgstr "" msgstr "Version"
#, python-format #, python-format
msgctxt "n_versions_available" msgctxt "n_versions_available"
msgid "%d versions available" msgid "%d versions available"
msgstr "" msgstr "%d versions disponibles"
#, python-format #, python-format
msgctxt "n_version_available" msgctxt "n_version_available"
msgid "%d version available" msgid "%d version available"
msgstr "" msgstr "%d version disponible"
msgctxt "notify" msgctxt "notify"
msgid "Notify" msgid "Notify"
msgstr "" msgstr "Notifier"
msgctxt "storage" msgctxt "storage"
msgid "Storage" msgid "Storage"
msgstr "" msgstr "Mémoire"
msgctxt "cache_downloaded" msgctxt "cache_downloaded"
msgid "Cache downloaded apps" msgid "Cache downloaded apps"
msgstr "" msgstr "Garder en mémoire cache les applications téléchargées"
msgctxt "keep_downloaded" msgctxt "keep_downloaded"
msgid "Keep downloaded apk files on SD card" msgid "Keep downloaded apk files on SD card"
msgstr "" msgstr "Garder les fichiers apk téléchargés sur la carte SD"
msgctxt "updates" msgctxt "updates"
msgid "Updates" msgid "Updates"
msgstr "" msgstr "Mises à jour"
msgctxt "clear_all_cached_data" msgctxt "clear_all_cached_data"
msgid "Clear all cached data" msgid "Clear all cached data"
msgstr "" msgstr "Vider la mémoire cache"
msgctxt "reset" msgctxt "reset"
msgid "Reset" msgid "Reset"
msgstr "" msgstr "Réinitialisation"
msgctxt "maintenance" msgctxt "maintenance"
msgid "Maintenance" msgid "Maintenance"
msgstr "" msgstr "Maintenance"
msgctxt "notify_updates_available" msgctxt "notify_updates_available"
msgid "Notify when new updates are available" msgid "Notify when new updates are available"
msgstr "" msgstr "Notifier quand de nouvelles mises à jour sont disponibles"
#, fuzzy
msgctxt "update_apps_list" msgctxt "update_apps_list"
msgid "Update apps list from repositories automatically" msgid "Update app list from repositories automatically"
msgstr "" msgstr "Mettre à jour automatiquement la liste d'applications à partir des dépôts "
msgctxt "automatic_repo_scan" msgctxt "automatic_repo_scan"
msgid "Automatic repo scan" msgid "Automatic repo scan"
msgstr "" msgstr "Balayage automatique du dépôt"
msgctxt "app_name" msgctxt "app_name"
msgid "FDroid" msgid "FDroid"
msgstr "" msgstr "FDroid"
msgctxt "about_title" msgctxt "about_title"
msgid "About FDroid" msgid "About FDroid"
msgstr "" msgstr "À propos de FDroid"
#, fuzzy
msgctxt "about_desc" msgctxt "about_desc"
msgid "" msgid ""
"Originally based on Aptoide.\n" "Originally based on Aptoide.\n"
"Released under the GNU GPL v2 license." "Released under the GNU GPLv2 license."
msgstr "" msgstr ""
"Originallement basée sur Aptoide.\n"
"Libéré sous licence GNU GPL v2."
#, fuzzy
msgctxt "about_site" msgctxt "about_site"
msgid "Home:" msgid "Website:"
msgstr "" msgstr "Site Web"
msgctxt "about_mail" msgctxt "about_mail"
msgid "Email:" msgid "Email:"
msgstr "" msgstr "Courriel:"
msgctxt "about_version" msgctxt "about_version"
msgid "Version:" msgid "Version:"
msgstr "" msgstr "Version:"
#, fuzzy
msgctxt "about_website" msgctxt "about_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr "Site Web"
#, fuzzy
msgctxt "no_repo" msgctxt "no_repo"
msgid "" msgid ""
"You have no repositories configured!\n" "You don't have any repositories configured!\n"
"\n" "\n"
"A repository is a source of applications. To add one, press the MENU " "A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n" "button now and enter the URL.\n"
"\n" "\n"
"A repository URL looks something like this: http://f-droid.org/repo" "A repository address looks something like this: http://f-droid.org/repo"
msgstr "" msgstr ""
"Aucun dépôt n'est configuré!\n"
"\n"
"Un dépôt est une source d'applications. Pour en ajouter un, appuyez sur "
"MENU maintenant et entrez l'adresse URL.\n"
"\n"
"L'URL d'un dépôt ressemble à ceci: http://f-droid.org/repo"
msgctxt "not_inst" msgctxt "not_inst"
msgid "Not Installed" msgid "Not Installed"
msgstr "" msgstr "Pas installée"
msgctxt "installed_update" msgctxt "installed_update"
msgid "Update possible - Ver.:" msgid "Update possible - Ver.:"
msgstr "" msgstr "Mise à jour possible - Ver.:"
msgctxt "ok" msgctxt "ok"
msgid "Ok" msgid "OK"
msgstr "" msgstr ""
msgctxt "yes" msgctxt "yes"
msgid "Yes" msgid "Yes"
msgstr "" msgstr "Oui"
msgctxt "no" msgctxt "no"
msgid "No" msgid "No"
msgstr "" msgstr "Non"
msgctxt "repo_add_title" msgctxt "repo_add_title"
msgid "Add new repository" msgid "Add new repository"
msgstr "" msgstr "Ajouter un nouveau dépôt"
msgctxt "repo_add_add" msgctxt "repo_add_add"
msgid "Add" msgid "Add"
msgstr "" msgstr "Ajouter"
msgctxt "cancel" msgctxt "cancel"
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Annuler"
msgctxt "repo_delete_title" msgctxt "repo_delete_title"
msgid "Choose repository to remove" msgid "Choose repository to remove"
msgstr "" msgstr "Choisissez le dépôt à supprimer"
msgctxt "server_connection_error" msgctxt "server_connection_error"
msgid "Could not connect to server!" msgid "Could not connect to server!"
msgstr "" msgstr "Connection au serveur impossible!"
msgctxt "repo_update_title" msgctxt "repo_update_title"
msgid "Update repositories" msgid "Update repositories"
msgstr "" msgstr "Mettre à jour les dépôts"
msgctxt "tab_installed" msgctxt "tab_installed"
msgid "Installed" msgid "Installed"
msgstr "" msgstr "Installée"
msgctxt "tab_noninstalled" msgctxt "tab_noninstalled"
msgid "Available" msgid "Available"
msgstr "" msgstr "Disponible"
msgctxt "tab_updates" msgctxt "tab_updates"
msgid "Updates" msgid "Updates"
msgstr "" msgstr "Mises à jour"
msgctxt "update_available" msgctxt "update_available"
msgid "Updates available" msgid "Updates available"
msgstr "" msgstr "Mises à jour disponibles"
msgctxt "process_wait_title" msgctxt "process_wait_title"
msgid "Please Wait" msgid "Please Wait"
msgstr "" msgstr "Patientez"
msgctxt "process_update_msg" msgctxt "process_update_msg"
msgid "Updating application list..." msgid "Updating application list..."
msgstr "" msgstr "Mise à jour de la liste d'applications..."
msgctxt "connection_error" msgctxt "connection_error"
msgid "Could not connect to the network." msgid "Could not connect to the network."
msgstr "" msgstr "Connection au réseau impossible."
msgctxt "connection_timeout" msgctxt "connection_timeout"
msgid "Timeout" msgid "Timeout"
msgstr "" msgstr "Délai d'attente"
msgctxt "connection_error_msg" msgctxt "connection_error_msg"
msgid "Could not connect to server!" msgid "Could not connect to server!"
msgstr "" msgstr "Connection au serveur impossible!"
msgctxt "download" msgctxt "download"
msgid "Download" msgid "Download"
msgstr "" msgstr "Téléchargement"
msgctxt "download_server" msgctxt "download_server"
msgid "Getting application from" msgid "Getting application from"
msgstr "" msgstr "Réception d'application de"
#, fuzzy
msgctxt "repo_add_url" msgctxt "repo_add_url"
msgid "Repository URL" msgid "Repository address"
msgstr "" msgstr "URL du dépôt"
msgctxt "isinst" msgctxt "isinst"
msgid "Installed:" msgid "Installed:"
msgstr "" msgstr "Installé:"
msgctxt "install" msgctxt "install"
msgid "Install" msgid "Install"
msgstr "" msgstr "Installer"
msgctxt "uninstall" msgctxt "uninstall"
msgid "Uninstall" msgid "Uninstall"
msgstr "" msgstr "Supprimer"
msgctxt "update" msgctxt "update"
msgid "Update!" msgid "Update!"
msgstr "" msgstr "Mise à jour!"
#, fuzzy
msgctxt "update_alrt" msgctxt "update_alrt"
msgid "" msgid ""
"There updates available for some installed applications.\n" "There are updates available for some installed applications.\n"
"Do you wish to see them?" "Do you want to see them?"
msgstr "" msgstr ""
"Des mises à jour sont disponibles pour certaines applications.\n"
"\n"
"Désirez-vous les voir?"
#, fuzzy
msgctxt "repo_alrt" msgctxt "repo_alrt"
msgid "" msgid ""
"The list of repositories in use has been changed.\n" "The list of used repositories has changed.\n"
"Do you wish to update them?" "Do you want to update them?"
msgstr "" msgstr ""
"La liste des dépôts a changé.\n"
"Voulez-vous les mettre à jour?"
msgctxt "error_download_alrt" msgctxt "error_download_alrt"
msgid "Could not connect to server or apk file is corrupt!" msgid "Could not connect to server or apk file is corrupt!"
msgstr "" msgstr "Connections au serveur impossible ou fichier apk corrompu!"
msgctxt "download_alrt" msgctxt "download_alrt"
msgid "Getting application from:\n" msgid "Getting application from:\n"
msgstr "" msgstr "Réception d'application de:\n"
msgctxt "menu_update_repo" msgctxt "menu_update_repo"
msgid "Update" msgid "Update"
msgstr "" msgstr "Mise à jour"
msgctxt "menu_manage" msgctxt "menu_manage"
msgid "Manage Repos" msgid "Manage Repos"
msgstr "" msgstr "Gestion de dépôts"
msgctxt "menu_preferences" msgctxt "menu_preferences"
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "Préférences"
msgctxt "menu_about" msgctxt "menu_about"
msgid "About" msgid "About"
msgstr "" msgstr "À propos de"
msgctxt "menu_add_repo" msgctxt "menu_add_repo"
msgid "New Repository" msgid "New Repository"
msgstr "" msgstr "Nouveau dépôt"
msgctxt "menu_rem_repo" msgctxt "menu_rem_repo"
msgid "Remove Repository" msgid "Remove Repository"
msgstr "" msgstr "Supprimer un dépôt"
msgctxt "menu_install" msgctxt "menu_install"
msgid "Install" msgid "Install"
msgstr "" msgstr "Installer"
msgctxt "menu_uninstall" msgctxt "menu_uninstall"
msgid "Uninstall" msgid "Uninstall"
msgstr "" msgstr "Supprimer"
#, fuzzy
msgctxt "menu_website" msgctxt "menu_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr "Site Web"
msgctxt "menu_issues" msgctxt "menu_issues"
msgid "Issues" msgid "Issues"
msgstr "" msgstr "Problèmes"
msgctxt "menu_source" msgctxt "menu_source"
msgid "Source Code" msgid "Source Code"
msgstr "" msgstr "Code source"
msgctxt "menu_market" msgctxt "menu_market"
msgid "Market" msgid "Market"
msgstr "" msgstr "Marché"
msgctxt "menu_update" msgctxt "menu_update"
msgid "Update" msgid "Update"
msgstr "" msgstr "Mise à jour"
#, python-format #, python-format
msgctxt "details_installed" msgctxt "details_installed"
msgid "Version %s installed" msgid "Version %s installed"
msgstr "" msgstr "Version %s installée"
#, python-format #, python-format
msgctxt "details_notinstalled" msgctxt "details_notinstalled"
msgid "Not installed (%d available)" msgid "Not installed (%d available)"
msgstr "" msgstr "Pas installée (%d disponible)"
msgctxt "inst" msgctxt "inst"
msgid "Installed" msgid "Installed"
msgstr "" msgstr "Installée"
msgctxt "corrupt_download" msgctxt "corrupt_download"
msgid "Downloaded file is corrupt" msgid "Downloaded file is corrupt"
msgstr "Le fichier téléchargé est corrompu"
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr "" msgstr ""

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2010-11-15 07:54+0000\n" "POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: 2010-11-04 15:42+0200\n" "PO-Revision-Date: 2010-11-04 15:42+0200\n"
"Last-Translator: graziano <graziano@sorbaioli.org>\n" "Last-Translator: graziano <graziano@sorbaioli.org>\n"
"Language-Team: it <LL@li.org>\n" "Language-Team: it <LL@li.org>\n"
@ -16,6 +16,14 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n" "Generated-By: Babel 1.0dev\n"
msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
#, fuzzy #, fuzzy
msgctxt "version" msgctxt "version"
msgid "Version" msgid "Version"
@ -69,7 +77,7 @@ msgid "Notify when new updates are available"
msgstr "" msgstr ""
msgctxt "update_apps_list" msgctxt "update_apps_list"
msgid "Update apps list from repositories automatically" msgid "Update app list from repositories automatically"
msgstr "" msgstr ""
msgctxt "automatic_repo_scan" msgctxt "automatic_repo_scan"
@ -88,14 +96,15 @@ msgstr "Informazioni"
msgctxt "about_desc" msgctxt "about_desc"
msgid "" msgid ""
"Originally based on Aptoide.\n" "Originally based on Aptoide.\n"
"Released under the GNU GPL v2 license." "Released under the GNU GPLv2 license."
msgstr "" msgstr ""
"Basato su Aptoide.\n" "Basato su Aptoide.\n"
"Rilasciato sotto licenza GNU GPL v2." "Rilasciato sotto licenza GNU GPL v2."
#, fuzzy
msgctxt "about_site" msgctxt "about_site"
msgid "Home:" msgid "Website:"
msgstr "Home:" msgstr "Sito Web"
#, fuzzy #, fuzzy
msgctxt "about_mail" msgctxt "about_mail"
@ -107,18 +116,20 @@ msgctxt "about_version"
msgid "Version:" msgid "Version:"
msgstr "Versione Server:" msgstr "Versione Server:"
#, fuzzy
msgctxt "about_website" msgctxt "about_website"
msgid "Web Site" msgid "Website"
msgstr "Sito Web" msgstr "Sito Web"
#, fuzzy
msgctxt "no_repo" msgctxt "no_repo"
msgid "" msgid ""
"You have no repositories configured!\n" "You don't have any repositories configured!\n"
"\n" "\n"
"A repository is a source of applications. To add one, press the MENU " "A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n" "button now and enter the URL.\n"
"\n" "\n"
"A repository URL looks something like this: http://f-droid.org/repo" "A repository address looks something like this: http://f-droid.org/repo"
msgstr "" msgstr ""
"Non hai configurato nessun repository!\n" "Non hai configurato nessun repository!\n"
"\n" "\n"
@ -136,8 +147,8 @@ msgid "Update possible - Ver.:"
msgstr "Aggiornamento: - Ver.:" msgstr "Aggiornamento: - Ver.:"
msgctxt "ok" msgctxt "ok"
msgid "Ok" msgid "OK"
msgstr "Ok" msgstr ""
msgctxt "yes" msgctxt "yes"
msgid "Yes" msgid "Yes"
@ -216,8 +227,9 @@ msgctxt "download_server"
msgid "Getting application from" msgid "Getting application from"
msgstr "Scaricamento applicazione da" msgstr "Scaricamento applicazione da"
#, fuzzy
msgctxt "repo_add_url" msgctxt "repo_add_url"
msgid "Repository URL" msgid "Repository address"
msgstr "Repository URL" msgstr "Repository URL"
msgctxt "isinst" msgctxt "isinst"
@ -236,19 +248,21 @@ msgctxt "update"
msgid "Update!" msgid "Update!"
msgstr "Aggiorna!" msgstr "Aggiorna!"
#, fuzzy
msgctxt "update_alrt" msgctxt "update_alrt"
msgid "" msgid ""
"There updates available for some installed applications.\n" "There are updates available for some installed applications.\n"
"Do you wish to see them?" "Do you want to see them?"
msgstr "" msgstr ""
"Aggiornamenti disponibili.\n" "Aggiornamenti disponibili.\n"
"\n" "\n"
"Vuoi visualizzarli?" "Vuoi visualizzarli?"
#, fuzzy
msgctxt "repo_alrt" msgctxt "repo_alrt"
msgid "" msgid ""
"The list of repositories in use has been changed.\n" "The list of used repositories has changed.\n"
"Do you wish to update them?" "Do you want to update them?"
msgstr "" msgstr ""
"L'elenco dei repository in uso e' cambiato.\n" "L'elenco dei repository in uso e' cambiato.\n"
"\n" "\n"
@ -296,8 +310,9 @@ msgctxt "menu_uninstall"
msgid "Uninstall" msgid "Uninstall"
msgstr "Disinstalla" msgstr "Disinstalla"
#, fuzzy
msgctxt "menu_website" msgctxt "menu_website"
msgid "Web Site" msgid "Website"
msgstr "Sito Web" msgstr "Sito Web"
msgctxt "menu_issues" msgctxt "menu_issues"
@ -335,3 +350,47 @@ msgctxt "corrupt_download"
msgid "Downloaded file is corrupt" msgid "Downloaded file is corrupt"
msgstr "" msgstr ""
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2010-11-15 07:54+0000\n" "POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: 2010-11-15 07:54+0000\n" "PO-Revision-Date: 2010-11-15 07:54+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: nl <LL@li.org>\n" "Language-Team: nl <LL@li.org>\n"
@ -17,6 +17,14 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n" "Generated-By: Babel 1.0dev\n"
msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
msgctxt "version" msgctxt "version"
msgid "Version" msgid "Version"
msgstr "" msgstr ""
@ -68,7 +76,7 @@ msgid "Notify when new updates are available"
msgstr "" msgstr ""
msgctxt "update_apps_list" msgctxt "update_apps_list"
msgid "Update apps list from repositories automatically" msgid "Update app list from repositories automatically"
msgstr "" msgstr ""
msgctxt "automatic_repo_scan" msgctxt "automatic_repo_scan"
@ -86,11 +94,11 @@ msgstr ""
msgctxt "about_desc" msgctxt "about_desc"
msgid "" msgid ""
"Originally based on Aptoide.\n" "Originally based on Aptoide.\n"
"Released under the GNU GPL v2 license." "Released under the GNU GPLv2 license."
msgstr "" msgstr ""
msgctxt "about_site" msgctxt "about_site"
msgid "Home:" msgid "Website:"
msgstr "" msgstr ""
msgctxt "about_mail" msgctxt "about_mail"
@ -102,17 +110,17 @@ msgid "Version:"
msgstr "" msgstr ""
msgctxt "about_website" msgctxt "about_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr ""
msgctxt "no_repo" msgctxt "no_repo"
msgid "" msgid ""
"You have no repositories configured!\n" "You don't have any repositories configured!\n"
"\n" "\n"
"A repository is a source of applications. To add one, press the MENU " "A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n" "button now and enter the URL.\n"
"\n" "\n"
"A repository URL looks something like this: http://f-droid.org/repo" "A repository address looks something like this: http://f-droid.org/repo"
msgstr "" msgstr ""
msgctxt "not_inst" msgctxt "not_inst"
@ -124,7 +132,7 @@ msgid "Update possible - Ver.:"
msgstr "" msgstr ""
msgctxt "ok" msgctxt "ok"
msgid "Ok" msgid "OK"
msgstr "" msgstr ""
msgctxt "yes" msgctxt "yes"
@ -204,7 +212,7 @@ msgid "Getting application from"
msgstr "" msgstr ""
msgctxt "repo_add_url" msgctxt "repo_add_url"
msgid "Repository URL" msgid "Repository address"
msgstr "" msgstr ""
msgctxt "isinst" msgctxt "isinst"
@ -225,14 +233,14 @@ msgstr ""
msgctxt "update_alrt" msgctxt "update_alrt"
msgid "" msgid ""
"There updates available for some installed applications.\n" "There are updates available for some installed applications.\n"
"Do you wish to see them?" "Do you want to see them?"
msgstr "" msgstr ""
msgctxt "repo_alrt" msgctxt "repo_alrt"
msgid "" msgid ""
"The list of repositories in use has been changed.\n" "The list of used repositories has changed.\n"
"Do you wish to update them?" "Do you want to update them?"
msgstr "" msgstr ""
msgctxt "error_download_alrt" msgctxt "error_download_alrt"
@ -276,7 +284,7 @@ msgid "Uninstall"
msgstr "" msgstr ""
msgctxt "menu_website" msgctxt "menu_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr ""
msgctxt "menu_issues" msgctxt "menu_issues"
@ -313,3 +321,47 @@ msgctxt "corrupt_download"
msgid "Downloaded file is corrupt" msgid "Downloaded file is corrupt"
msgstr "" msgstr ""
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr ""

387
locale/sv.po Normal file
View File

@ -0,0 +1,387 @@
# Swedish translations for PACKAGE.
# Copyright (C) 2010 ORGANIZATION
# This file is distributed under the same license as the PACKAGE project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: 2011-01-14 07:33+0200\n"
"Last-Translator: Henrik <tunedal@gmail.com>\n"
"Language-Team: sv <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n"
msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
msgctxt "version"
msgid "Version"
msgstr "Version"
#, python-format
msgctxt "n_versions_available"
msgid "%d versions available"
msgstr "%d versioner tillgängliga"
#, python-format
msgctxt "n_version_available"
msgid "%d version available"
msgstr "%d version tillgänglig"
msgctxt "notify"
msgid "Notify"
msgstr "Meddela"
msgctxt "storage"
msgid "Storage"
msgstr "Lagring"
msgctxt "cache_downloaded"
msgid "Cache downloaded apps"
msgstr "Cacha nerladdade program"
msgctxt "keep_downloaded"
msgid "Keep downloaded apk files on SD card"
msgstr "Behåll nerladdade apk-filer på SD-kortet"
msgctxt "updates"
msgid "Updates"
msgstr "Uppdateringar"
msgctxt "clear_all_cached_data"
msgid "Clear all cached data"
msgstr "Rensa all cachad data"
msgctxt "reset"
msgid "Reset"
msgstr "Återställ"
msgctxt "maintenance"
msgid "Maintenance"
msgstr "Underhåll"
msgctxt "notify_updates_available"
msgid "Notify when new updates are available"
msgstr "Meddela mig när nya uppdateringar finns"
#, fuzzy
msgctxt "update_apps_list"
msgid "Update app list from repositories automatically"
msgstr "Uppdatera programlistan från förråd automatiskt"
msgctxt "automatic_repo_scan"
msgid "Automatic repo scan"
msgstr "Automatisk förrådsskanning"
msgctxt "app_name"
msgid "FDroid"
msgstr "FDroid"
msgctxt "about_title"
msgid "About FDroid"
msgstr "Om FDroid"
#, fuzzy
msgctxt "about_desc"
msgid ""
"Originally based on Aptoide.\n"
"Released under the GNU GPLv2 license."
msgstr ""
"Ursprungligen baserat på Aptoide.\n"
"Släppt under GNU GPLv2-licensen."
#, fuzzy
msgctxt "about_site"
msgid "Website:"
msgstr "Webbsida"
msgctxt "about_mail"
msgid "Email:"
msgstr "E-post:"
msgctxt "about_version"
msgid "Version:"
msgstr "Version:"
#, fuzzy
msgctxt "about_website"
msgid "Website"
msgstr "Webbsida"
#, fuzzy
msgctxt "no_repo"
msgid ""
"You don't have any repositories configured!\n"
"\n"
"A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n"
"\n"
"A repository address looks something like this: http://f-droid.org/repo"
msgstr ""
"Du har inga förråd konfigurerade!\n"
"\n"
"Ett förråd är en källa för program. Tryck på Meny-knappen och ange URL:en"
" för att lägga till ett nu.\n"
"\n"
"En förråds-URL ser ut ungefär så här: http://f-droid.org/repo"
msgctxt "not_inst"
msgid "Not Installed"
msgstr "Inte installerad"
msgctxt "installed_update"
msgid "Update possible - Ver.:"
msgstr "Uppdatering möjlig - Ver.:"
msgctxt "ok"
msgid "OK"
msgstr ""
msgctxt "yes"
msgid "Yes"
msgstr "Ja"
msgctxt "no"
msgid "No"
msgstr "Nej"
msgctxt "repo_add_title"
msgid "Add new repository"
msgstr "Lägg till nytt förråd"
msgctxt "repo_add_add"
msgid "Add"
msgstr "Lägg till"
msgctxt "cancel"
msgid "Cancel"
msgstr "Avbryt"
msgctxt "repo_delete_title"
msgid "Choose repository to remove"
msgstr "Välj förråd att ta bort"
msgctxt "server_connection_error"
msgid "Could not connect to server!"
msgstr "Kunde inte ansluta till servern!"
msgctxt "repo_update_title"
msgid "Update repositories"
msgstr "Uppdatera förråd"
msgctxt "tab_installed"
msgid "Installed"
msgstr "Installerade"
msgctxt "tab_noninstalled"
msgid "Available"
msgstr "Tillgängliga"
msgctxt "tab_updates"
msgid "Updates"
msgstr "Uppdateringar"
msgctxt "update_available"
msgid "Updates available"
msgstr "Uppdateringar tillgängliga"
msgctxt "process_wait_title"
msgid "Please Wait"
msgstr "Var vänlig vänta"
msgctxt "process_update_msg"
msgid "Updating application list..."
msgstr "Uppdaterar programlistan..."
msgctxt "connection_error"
msgid "Could not connect to the network."
msgstr "Kunde inte ansluta till nätverket."
msgctxt "connection_timeout"
msgid "Timeout"
msgstr "Timeout"
msgctxt "connection_error_msg"
msgid "Could not connect to server!"
msgstr "Kunde inte ansluta till servern!"
msgctxt "download"
msgid "Download"
msgstr "Ladda ner"
msgctxt "download_server"
msgid "Getting application from"
msgstr "Hämtar program från"
#, fuzzy
msgctxt "repo_add_url"
msgid "Repository address"
msgstr "Förråds-URL"
msgctxt "isinst"
msgid "Installed:"
msgstr "Installerad:"
msgctxt "install"
msgid "Install"
msgstr "Installera"
msgctxt "uninstall"
msgid "Uninstall"
msgstr "Avinstallera"
msgctxt "update"
msgid "Update!"
msgstr ""
#, fuzzy
msgctxt "update_alrt"
msgid ""
"There are updates available for some installed applications.\n"
"Do you want to see them?"
msgstr ""
"Det finns uppdateringar för vissa av de installerade programmen.\n"
"Vill du se dem?"
#, fuzzy
msgctxt "repo_alrt"
msgid ""
"The list of used repositories has changed.\n"
"Do you want to update them?"
msgstr ""
"Listan över förråd har ändrats.\n"
"Vill du uppdatera dem?"
msgctxt "error_download_alrt"
msgid "Could not connect to server or apk file is corrupt!"
msgstr "Kunde inte ansluta till servern eller så är apk-filen är skadad!"
msgctxt "download_alrt"
msgid "Getting application from:\n"
msgstr "Hämtar program från:\n"
msgctxt "menu_update_repo"
msgid "Update"
msgstr "Uppdatera"
msgctxt "menu_manage"
msgid "Manage Repos"
msgstr "Hantera förråd"
msgctxt "menu_preferences"
msgid "Preferences"
msgstr "Inställningar"
msgctxt "menu_about"
msgid "About"
msgstr "Om"
msgctxt "menu_add_repo"
msgid "New Repository"
msgstr "Nytt förråd"
msgctxt "menu_rem_repo"
msgid "Remove Repository"
msgstr "Ta bort förråd"
msgctxt "menu_install"
msgid "Install"
msgstr "Installera"
msgctxt "menu_uninstall"
msgid "Uninstall"
msgstr "Avinstallera"
#, fuzzy
msgctxt "menu_website"
msgid "Website"
msgstr "Webbsida"
msgctxt "menu_issues"
msgid "Issues"
msgstr ""
msgctxt "menu_source"
msgid "Source Code"
msgstr "Källkod"
msgctxt "menu_market"
msgid "Market"
msgstr "Market"
msgctxt "menu_update"
msgid "Update"
msgstr "Uppdatera"
#, python-format
msgctxt "details_installed"
msgid "Version %s installed"
msgstr "Version %s är installerad"
#, python-format
msgctxt "details_notinstalled"
msgid "Not installed (%d available)"
msgstr "Inte installerat (%d tillgängliga)"
msgctxt "inst"
msgid "Installed"
msgstr "Installerad"
msgctxt "corrupt_download"
msgid "Downloaded file is corrupt"
msgstr "Den nerladdade filen är skadad"
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr ""

View File

@ -1,14 +1,14 @@
# Translations template for PROJECT. # Translations template for PROJECT.
# Copyright (C) 2010 ORGANIZATION # Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. # FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2010-11-15 07:54+0000\n" "POT-Creation-Date: 2011-01-16 16:16+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,6 +17,14 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.0dev\n" "Generated-By: Babel 1.0dev\n"
msgctxt "SignatureMismatch"
msgid ""
"The new version is signed with a different key to the old one. To install"
" the new version, the old one must be uninstalled first. Please do this "
"and try again. (Note that uninstalling will erase any internal data "
"stored by the application)"
msgstr ""
msgctxt "version" msgctxt "version"
msgid "Version" msgid "Version"
msgstr "" msgstr ""
@ -68,7 +76,7 @@ msgid "Notify when new updates are available"
msgstr "" msgstr ""
msgctxt "update_apps_list" msgctxt "update_apps_list"
msgid "Update apps list from repositories automatically" msgid "Update app list from repositories automatically"
msgstr "" msgstr ""
msgctxt "automatic_repo_scan" msgctxt "automatic_repo_scan"
@ -86,11 +94,11 @@ msgstr ""
msgctxt "about_desc" msgctxt "about_desc"
msgid "" msgid ""
"Originally based on Aptoide.\n" "Originally based on Aptoide.\n"
"Released under the GNU GPL v2 license." "Released under the GNU GPLv2 license."
msgstr "" msgstr ""
msgctxt "about_site" msgctxt "about_site"
msgid "Home:" msgid "Website:"
msgstr "" msgstr ""
msgctxt "about_mail" msgctxt "about_mail"
@ -102,17 +110,17 @@ msgid "Version:"
msgstr "" msgstr ""
msgctxt "about_website" msgctxt "about_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr ""
msgctxt "no_repo" msgctxt "no_repo"
msgid "" msgid ""
"You have no repositories configured!\n" "You don't have any repositories configured!\n"
"\n" "\n"
"A repository is a source of applications. To add one, press the MENU " "A repository is a source of applications. To add one, press the MENU "
"button now and enter the URL.\n" "button now and enter the URL.\n"
"\n" "\n"
"A repository URL looks something like this: http://f-droid.org/repo" "A repository address looks something like this: http://f-droid.org/repo"
msgstr "" msgstr ""
msgctxt "not_inst" msgctxt "not_inst"
@ -124,7 +132,7 @@ msgid "Update possible - Ver.:"
msgstr "" msgstr ""
msgctxt "ok" msgctxt "ok"
msgid "Ok" msgid "OK"
msgstr "" msgstr ""
msgctxt "yes" msgctxt "yes"
@ -204,7 +212,7 @@ msgid "Getting application from"
msgstr "" msgstr ""
msgctxt "repo_add_url" msgctxt "repo_add_url"
msgid "Repository URL" msgid "Repository address"
msgstr "" msgstr ""
msgctxt "isinst" msgctxt "isinst"
@ -225,14 +233,14 @@ msgstr ""
msgctxt "update_alrt" msgctxt "update_alrt"
msgid "" msgid ""
"There updates available for some installed applications.\n" "There are updates available for some installed applications.\n"
"Do you wish to see them?" "Do you want to see them?"
msgstr "" msgstr ""
msgctxt "repo_alrt" msgctxt "repo_alrt"
msgid "" msgid ""
"The list of repositories in use has been changed.\n" "The list of used repositories has changed.\n"
"Do you wish to update them?" "Do you want to update them?"
msgstr "" msgstr ""
msgctxt "error_download_alrt" msgctxt "error_download_alrt"
@ -276,7 +284,7 @@ msgid "Uninstall"
msgstr "" msgstr ""
msgctxt "menu_website" msgctxt "menu_website"
msgid "Web Site" msgid "Website"
msgstr "" msgstr ""
msgctxt "menu_issues" msgctxt "menu_issues"
@ -313,3 +321,47 @@ msgctxt "corrupt_download"
msgid "Downloaded file is corrupt" msgid "Downloaded file is corrupt"
msgstr "" msgstr ""
msgctxt "antifeatures"
msgid "Anti-Features"
msgstr ""
msgctxt "antiads"
msgid "Advertising"
msgstr ""
msgctxt "antiadslong"
msgid "Show apps that contain advertising"
msgstr ""
msgctxt "antitrack"
msgid "Tracking"
msgstr ""
msgctxt "antitracklong"
msgid "Show apps that track and report your activity"
msgstr ""
msgctxt "antinonfreead"
msgid "Add-ons"
msgstr ""
msgctxt "antinonfreeadlong"
msgid "Show apps that promote non-free add-ons"
msgstr ""
msgctxt "antinonfreenet"
msgid "Network Services"
msgstr ""
msgctxt "antinonfreenetlong"
msgid "Show apps that promote non-free network services"
msgstr ""
msgctxt "expert"
msgid "Expert"
msgstr ""
msgctxt "expert_mode"
msgid "Enabled expert mode"
msgstr ""

View File

@ -28,6 +28,10 @@
android:textSize="12sp" android:layout_height="wrap_content" android:textSize="12sp" android:layout_height="wrap_content"
android:layout_width="fill_parent" /> android:layout_width="fill_parent" />
<TextView android:id="@+id/signature" android:layout_below="@id/status"
android:layout_alignParentLeft="true" android:textSize="12sp"
android:layout_height="wrap_content" android:layout_width="fill_parent" />
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>

View File

@ -1,17 +1,29 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<string name="version">Version</string>
<string name="n_versions_available">%d verfügbare Versionen</string>
<string name="n_version_available">%d verfügbare Version</string>
<string name="notify">Benachrichtigen</string>
<string name="storage">Speicherplatz</string>
<string name="cache_downloaded">Heruntergeladene Anwendungen zwischenspeichern</string>
<string name="keep_downloaded">Heruntergeladene Anwendungsdateien auf der SD-Karte behalten</string>
<string name="updates">Aktualisierungen</string>
<string name="clear_all_cached_data">Zwischenspeicher leeren</string>
<string name="reset">Zurücksetzen</string>
<string name="maintenance">Verwaltung</string>
<string name="notify_updates_available">Bei Aktualisierungen benachrichtigen</string>
<string name="update_apps_list">Anwendungsliste automatisch aktualisieren</string>
<string name="automatic_repo_scan">Automatische Archivkontrolle</string>
<string name="app_name">FDroid</string> <string name="app_name">FDroid</string>
<string name="about_title">Über FDroid</string> <string name="about_title">Über FDroid</string>
<string name="about_desc">Basierend auf Aptoide.\nLizensiert unter GNU GPLv2.</string> <string name="about_desc">Basierend auf Aptoide.\nLizensiert unter GNU GPLv2.</string>
<string name="about_site">Internetseite:</string> <string name="about_site">Internetseite:</string>
<string name="about_mail">E-Mail:</string> <string name="about_mail">Email:</string>
<string name="about_version">Version:</string>
<string name="about_website">Internetseite</string> <string name="about_website">Internetseite</string>
<string name="no_found">Keine Anwendung gefunden!</string>
<string name="no_repo">Sie haben keine Archive eingestellt!\n\nEin Archiv ist eine Sammlung von Anwendungen. Drücken Sie den Menü-Knopf und fügen Sie die Adresse eines Archivs hinzu.\n\nEine Archiv-Adresse sieht ungefähr so aus: http://f-droid.org/repo</string> <string name="no_repo">Sie haben keine Archive eingestellt!\n\nEin Archiv ist eine Sammlung von Anwendungen. Drücken Sie den Menü-Knopf und fügen Sie die Adresse eines Archivs hinzu.\n\nEine Archiv-Adresse sieht ungefähr so aus: http://f-droid.org/repo</string>
<string name="not_inst">Nicht Installiert</string> <string name="not_inst">Nicht Installiert</string>
<string name="installed">Installiert Version:</string>
<string name="installed_update">Aktualisierung verfügbar Version:</string> <string name="installed_update">Aktualisierung verfügbar Version:</string>
<string name="error">Fehler</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="yes">Ja</string> <string name="yes">Ja</string>
<string name="no">Nein</string> <string name="no">Nein</string>
@ -19,7 +31,6 @@
<string name="repo_add_add">Hinzufügen</string> <string name="repo_add_add">Hinzufügen</string>
<string name="cancel">Abbrechen</string> <string name="cancel">Abbrechen</string>
<string name="repo_delete_title">Zu entfernendes Archiv auswählen</string> <string name="repo_delete_title">Zu entfernendes Archiv auswählen</string>
<string name="url_website">http://f-droid.org</string>
<string name="server_connection_error">Die Serververbindung konnte nicht hergestellt werden!</string> <string name="server_connection_error">Die Serververbindung konnte nicht hergestellt werden!</string>
<string name="repo_update_title">Archive aktualisieren</string> <string name="repo_update_title">Archive aktualisieren</string>
<string name="tab_installed">Installiert</string> <string name="tab_installed">Installiert</string>
@ -33,21 +44,8 @@
<string name="connection_error_msg">Die Serververbindung konnte nicht hergestellt werden!</string> <string name="connection_error_msg">Die Serververbindung konnte nicht hergestellt werden!</string>
<string name="download">Herunterladen</string> <string name="download">Herunterladen</string>
<string name="download_server">Anwendung wird heruntergeladen von</string> <string name="download_server">Anwendung wird heruntergeladen von</string>
<string name="apk_version_new">Verfügbare Version</string>
<string name="settings_sort_title">Anwendungsliste sortieren:</string>
<string name="settings_sort_abc">Alphabetisch</string>
<string name="settings_sort_installed">Installiert / nicht installiert</string>
<string name="settings_sort_recent">Neueste zuerst</string>
<string name="settings_sort_rating">Bewertung</string>
<string name="settings_filter_title">Anwendungen anzeigen:</string>
<string name="settings_filter_category">Nach Kategorie</string>
<string name="settings_filter_all">Alle Anwendungen</string>
<string name="settings_save">Speichern</string>
<string name="repo_add_url">Archiv-Adresse</string> <string name="repo_add_url">Archiv-Adresse</string>
<string name="up_server">Server:</string>
<string name="lstver">Server-Version:</string>
<string name="isinst">Installiert:</string> <string name="isinst">Installiert:</string>
<string name="instver">Installierte Version:</string>
<string name="install">Installieren</string> <string name="install">Installieren</string>
<string name="uninstall">Entfernen</string> <string name="uninstall">Entfernen</string>
<string name="update">Aktualisieren!</string> <string name="update">Aktualisieren!</string>
@ -57,6 +55,7 @@
<string name="download_alrt">Anwendung wird geladen von:\n</string> <string name="download_alrt">Anwendung wird geladen von:\n</string>
<string name="menu_update_repo">Aktualisieren</string> <string name="menu_update_repo">Aktualisieren</string>
<string name="menu_manage">Archive verwalten</string> <string name="menu_manage">Archive verwalten</string>
<string name="menu_preferences">Einstellungen</string>
<string name="menu_about">Über</string> <string name="menu_about">Über</string>
<string name="menu_add_repo">Archiv hinzufügen</string> <string name="menu_add_repo">Archiv hinzufügen</string>
<string name="menu_rem_repo">Archiv entfernen</string> <string name="menu_rem_repo">Archiv entfernen</string>
@ -67,4 +66,8 @@
<string name="menu_source">Quelltext</string> <string name="menu_source">Quelltext</string>
<string name="menu_market">Markt</string> <string name="menu_market">Markt</string>
<string name="menu_update">Aktualisieren</string> <string name="menu_update">Aktualisieren</string>
<string name="details_installed">Version %s installiert</string>
<string name="details_notinstalled">Nicht installiert (%d verfügbar)</string>
<string name="inst">Installiert</string>
<string name="corrupt_download">Heruntergeladene Datei ist fehlerhaft</string>
</resources> </resources>

View File

@ -1,2 +1,73 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources/> <resources>
<string name="version">Version</string>
<string name="n_versions_available">%d versions disponibles</string>
<string name="n_version_available">%d version disponible</string>
<string name="notify">Notifier</string>
<string name="storage">Mémoire</string>
<string name="cache_downloaded">Garder en mémoire cache les applications téléchargées</string>
<string name="keep_downloaded">Garder les fichiers apk téléchargés sur la carte SD</string>
<string name="updates">Mises à jour</string>
<string name="clear_all_cached_data">Vider la mémoire cache</string>
<string name="reset">Réinitialisation</string>
<string name="maintenance">Maintenance</string>
<string name="notify_updates_available">Notifier quand de nouvelles mises à jour sont disponibles</string>
<string name="update_apps_list">"Mettre à jour automatiquement la liste d\'applications à partir des dépôts "</string>
<string name="automatic_repo_scan">Balayage automatique du dépôt</string>
<string name="app_name">FDroid</string>
<string name="about_title">À propos de FDroid</string>
<string name="about_desc">Originallement basée sur Aptoide.\nLibéré sous licence GNU GPL v2.</string>
<string name="about_site">Accueil:</string>
<string name="about_mail">Courriel:</string>
<string name="about_version">Version:</string>
<string name="about_website">Site Web</string>
<string name="no_repo">Aucun dépôt n\'est configuré!\n\nUn dépôt est une source d\'applications. Pour en ajouter un, appuyez sur MENU maintenant et entrez l\'adresse URL.\n\nL\'URL d\'un dépôt ressemble à ceci: http://f-droid.org/repo</string>
<string name="not_inst">Pas installée</string>
<string name="installed_update">Mise à jour possible - Ver.:</string>
<string name="ok">Ok</string>
<string name="yes">Oui</string>
<string name="no">Non</string>
<string name="repo_add_title">Ajouter un nouveau dépôt</string>
<string name="repo_add_add">Ajouter</string>
<string name="cancel">Annuler</string>
<string name="repo_delete_title">Choisissez le dépôt à supprimer</string>
<string name="server_connection_error">Connection au serveur impossible!</string>
<string name="repo_update_title">Mettre à jour les dépôts</string>
<string name="tab_installed">Installée</string>
<string name="tab_noninstalled">Disponible</string>
<string name="tab_updates">Mises à jour</string>
<string name="update_available">Mises à jour disponibles</string>
<string name="process_wait_title">Patientez</string>
<string name="process_update_msg">Mise à jour de la liste d\'applications...</string>
<string name="connection_error">Connection au réseau impossible.</string>
<string name="connection_timeout">Délai d\'attente</string>
<string name="connection_error_msg">Connection au serveur impossible!</string>
<string name="download">Téléchargement</string>
<string name="download_server">Réception d\'application de</string>
<string name="repo_add_url">URL du dépôt</string>
<string name="isinst">Installé:</string>
<string name="install">Installer</string>
<string name="uninstall">Supprimer</string>
<string name="update">Mise à jour!</string>
<string name="update_alrt">Des mises à jour sont disponibles pour certaines applications.\n\nDésirez-vous les voir?</string>
<string name="repo_alrt">La liste des dépôts a changé.\nVoulez-vous les mettre à jour?</string>
<string name="error_download_alrt">Connections au serveur impossible ou fichier apk corrompu!</string>
<string name="download_alrt">Réception d\'application de:\n</string>
<string name="menu_update_repo">Mise à jour</string>
<string name="menu_manage">Gestion de dépôts</string>
<string name="menu_preferences">Préférences</string>
<string name="menu_about">À propos de</string>
<string name="menu_add_repo">Nouveau dépôt</string>
<string name="menu_rem_repo">Supprimer un dépôt</string>
<string name="menu_install">Installer</string>
<string name="menu_uninstall">Supprimer</string>
<string name="menu_website">Site Web</string>
<string name="menu_issues">Problèmes</string>
<string name="menu_source">Code source</string>
<string name="menu_market">Marché</string>
<string name="menu_update">Mise à jour</string>
<string name="details_installed">Version %s installée</string>
<string name="details_notinstalled">Pas installée (%d disponible)</string>
<string name="inst">Installée</string>
<string name="corrupt_download">Le fichier téléchargé est corrompu</string>
</resources>

View File

@ -1,17 +1,19 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<string name="version">Versione Server:</string>
<string name="n_versions_available">Aggiornamenti disponibili</string>
<string name="n_version_available">Aggiornamenti disponibili</string>
<string name="updates">Aggiornamenti</string>
<string name="app_name">FDroid</string> <string name="app_name">FDroid</string>
<string name="about_title">Informazioni</string> <string name="about_title">Informazioni</string>
<string name="about_desc">Basato su Aptoide.\nRilasciato sotto licenza GNU GPL v2.</string> <string name="about_desc">Basato su Aptoide.\nRilasciato sotto licenza GNU GPL v2.</string>
<string name="about_site">Home:</string> <string name="about_site">Home:</string>
<string name="about_mail">e-Mail:</string> <string name="about_mail">e-Mail:</string>
<string name="about_version">Versione Server:</string>
<string name="about_website">Sito Web</string> <string name="about_website">Sito Web</string>
<string name="no_found">Nessuna applicazione trovata!</string>
<string name="no_repo">Non hai configurato nessun repository!\n\nUn repository contiene un insieme di applicazioni. Per aggiungerne uno, premi MENU e inserisci un indirizzo URL.\n\nUn indirizzo URL di esempio e\': http://f-droid.org/repo</string> <string name="no_repo">Non hai configurato nessun repository!\n\nUn repository contiene un insieme di applicazioni. Per aggiungerne uno, premi MENU e inserisci un indirizzo URL.\n\nUn indirizzo URL di esempio e\': http://f-droid.org/repo</string>
<string name="not_inst">Non installato</string> <string name="not_inst">Non installato</string>
<string name="installed">Installato - Ver.:</string>
<string name="installed_update">Aggiornamento: - Ver.:</string> <string name="installed_update">Aggiornamento: - Ver.:</string>
<string name="error">Errore</string>
<string name="ok">Ok</string> <string name="ok">Ok</string>
<string name="yes"></string> <string name="yes"></string>
<string name="no">No</string> <string name="no">No</string>
@ -19,7 +21,6 @@
<string name="repo_add_add">Aggiungi</string> <string name="repo_add_add">Aggiungi</string>
<string name="cancel">Annulla</string> <string name="cancel">Annulla</string>
<string name="repo_delete_title">Rimuovi Repository</string> <string name="repo_delete_title">Rimuovi Repository</string>
<string name="url_website">http://f-droid.org</string>
<string name="server_connection_error">Impossibile connettersi al server!</string> <string name="server_connection_error">Impossibile connettersi al server!</string>
<string name="repo_update_title">Aggiorna Repositories</string> <string name="repo_update_title">Aggiorna Repositories</string>
<string name="tab_installed">Installato</string> <string name="tab_installed">Installato</string>
@ -33,21 +34,8 @@
<string name="connection_error_msg">Impossibile connettersi al server!</string> <string name="connection_error_msg">Impossibile connettersi al server!</string>
<string name="download">Download</string> <string name="download">Download</string>
<string name="download_server">Scaricamento applicazione da</string> <string name="download_server">Scaricamento applicazione da</string>
<string name="apk_version_new">disponibile v</string>
<string name="settings_sort_title">Elenca applicazioni per:</string>
<string name="settings_sort_abc">ordine alfabetico</string>
<string name="settings_sort_installed">Installato / Non installato</string>
<string name="settings_sort_recent">Piu\' recente</string>
<string name="settings_sort_rating">Voto</string>
<string name="settings_filter_title">Mostra applicazioni:</string>
<string name="settings_filter_category">Categoria</string>
<string name="settings_filter_all">Tutte</string>
<string name="settings_save">Salva</string>
<string name="repo_add_url">Repository URL</string> <string name="repo_add_url">Repository URL</string>
<string name="up_server">Servers:</string>
<string name="lstver">Versione Server:</string>
<string name="isinst">Installato:</string> <string name="isinst">Installato:</string>
<string name="instver">Versione installata:</string>
<string name="install">Installa</string> <string name="install">Installa</string>
<string name="uninstall">Disinstalla</string> <string name="uninstall">Disinstalla</string>
<string name="update">Aggiorna!</string> <string name="update">Aggiorna!</string>
@ -67,4 +55,6 @@
<string name="menu_source">Codice Sorgente</string> <string name="menu_source">Codice Sorgente</string>
<string name="menu_market">Market</string> <string name="menu_market">Market</string>
<string name="menu_update">Aggiornamento</string> <string name="menu_update">Aggiornamento</string>
<string name="details_installed">Non installato</string>
<string name="inst">Installato</string>
</resources> </resources>

71
res/values-sv/strings.xml Normal file
View File

@ -0,0 +1,71 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="version">Version</string>
<string name="n_versions_available">%d versioner tillgängliga</string>
<string name="n_version_available">%d version tillgänglig</string>
<string name="notify">Meddela</string>
<string name="storage">Lagring</string>
<string name="cache_downloaded">Cacha nerladdade program</string>
<string name="keep_downloaded">Behåll nerladdade apk-filer på SD-kortet</string>
<string name="updates">Uppdateringar</string>
<string name="clear_all_cached_data">Rensa all cachad data</string>
<string name="reset">Återställ</string>
<string name="maintenance">Underhåll</string>
<string name="notify_updates_available">Meddela mig när nya uppdateringar finns</string>
<string name="update_apps_list">Uppdatera programlistan från förråd automatiskt</string>
<string name="automatic_repo_scan">Automatisk förrådsskanning</string>
<string name="app_name">FDroid</string>
<string name="about_title">Om FDroid</string>
<string name="about_desc">Ursprungligen baserat på Aptoide.\nSläppt under GNU GPLv2-licensen.</string>
<string name="about_site">Hem:</string>
<string name="about_mail">E-post:</string>
<string name="about_version">Version:</string>
<string name="about_website">Webbsida</string>
<string name="no_repo">Du har inga förråd konfigurerade!\n\nEtt förråd är en källa för program. Tryck på Meny-knappen och ange URL:en för att lägga till ett nu.\n\nEn förråds-URL ser ut ungefär så här: http://f-droid.org/repo</string>
<string name="not_inst">Inte installerad</string>
<string name="installed_update">Uppdatering möjlig - Ver.:</string>
<string name="ok">OK</string>
<string name="yes">Ja</string>
<string name="no">Nej</string>
<string name="repo_add_title">Lägg till nytt förråd</string>
<string name="repo_add_add">Lägg till</string>
<string name="cancel">Avbryt</string>
<string name="repo_delete_title">Välj förråd att ta bort</string>
<string name="server_connection_error">Kunde inte ansluta till servern!</string>
<string name="repo_update_title">Uppdatera förråd</string>
<string name="tab_installed">Installerade</string>
<string name="tab_noninstalled">Tillgängliga</string>
<string name="tab_updates">Uppdateringar</string>
<string name="update_available">Uppdateringar tillgängliga</string>
<string name="process_wait_title">Var vänlig vänta</string>
<string name="process_update_msg">Uppdaterar programlistan...</string>
<string name="connection_error">Kunde inte ansluta till nätverket.</string>
<string name="connection_timeout">Timeout</string>
<string name="connection_error_msg">Kunde inte ansluta till servern!</string>
<string name="download">Ladda ner</string>
<string name="download_server">Hämtar program från</string>
<string name="repo_add_url">Förråds-URL</string>
<string name="isinst">Installerad:</string>
<string name="install">Installera</string>
<string name="uninstall">Avinstallera</string>
<string name="update_alrt">Det finns uppdateringar för vissa av de installerade programmen.\nVill du se dem?</string>
<string name="repo_alrt">Listan över förråd har ändrats.\nVill du uppdatera dem?</string>
<string name="error_download_alrt">Kunde inte ansluta till servern eller så är apk-filen är skadad!</string>
<string name="download_alrt">Hämtar program från:\n</string>
<string name="menu_update_repo">Uppdatera</string>
<string name="menu_manage">Hantera förråd</string>
<string name="menu_preferences">Inställningar</string>
<string name="menu_about">Om</string>
<string name="menu_add_repo">Nytt förråd</string>
<string name="menu_rem_repo">Ta bort förråd</string>
<string name="menu_install">Installera</string>
<string name="menu_uninstall">Avinstallera</string>
<string name="menu_website">Webbsida</string>
<string name="menu_source">Källkod</string>
<string name="menu_market">Market</string>
<string name="menu_update">Uppdatera</string>
<string name="details_installed">Version %s är installerad</string>
<string name="details_notinstalled">Inte installerat (%d tillgängliga)</string>
<string name="inst">Installerad</string>
<string name="corrupt_download">Den nerladdade filen är skadad</string>
</resources>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="SignatureMismatch">The new version is signed with a different key to the old one. To install the new version, the old one must be uninstalled first. Please do this and try again. (Note that uninstalling will erase any internal data stored by the application)</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="n_versions_available">%d versions available</string> <string name="n_versions_available">%d versions available</string>
<string name="n_version_available">%d version available</string> <string name="n_version_available">%d version available</string>
@ -115,4 +116,7 @@
<string name="antinonfreenet">Network Services</string> <string name="antinonfreenet">Network Services</string>
<string name="antinonfreenetlong">Show apps that promote non-free network services</string> <string name="antinonfreenetlong">Show apps that promote non-free network services</string>
<string name="expert">Expert</string>
<string name="expert_mode">Enabled expert mode</string>
</resources> </resources>

View File

@ -7,9 +7,9 @@
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/updates"> <PreferenceCategory android:title="@string/updates">
<ListPreference android:title="@string/automatic_repo_scan" <ListPreference android:title="@string/automatic_repo_scan"
android:summary="@string/update_apps_list" android:summary="@string/update_apps_list" android:key="updateInterval"
android:key="updateInterval" android:defaultValue="0" android:defaultValue="0" android:entries="@array/updateIntervalNames"
android:entries="@array/updateIntervalNames" android:entryValues="@array/updateIntervalValues" /> android:entryValues="@array/updateIntervalValues" />
<CheckBoxPreference android:title="@string/notify" <CheckBoxPreference android:title="@string/notify"
android:defaultValue="false" android:summary="@string/notify_updates_available" android:defaultValue="false" android:summary="@string/notify_updates_available"
android:key="updateNotify" /> android:key="updateNotify" />
@ -29,9 +29,10 @@
android:key="antiNonFreeNet" /> android:key="antiNonFreeNet" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/maintenance"> <PreferenceCategory android:title="@string/maintenance">
<Preference <Preference android:title="@string/reset" android:summary="@string/clear_all_cached_data"
android:title="@string/reset" android:key="reset" />
android:summary="@string/clear_all_cached_data" <CheckBoxPreference android:title="@string/expert"
android:key="reset" /> android:defaultValue="false" android:summary="@string/expert_mode"
android:key="expert" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@ -22,7 +22,10 @@ import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.math.BigInteger;
import java.net.URL; import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -43,6 +46,7 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.Signature;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -162,8 +166,13 @@ public class AppDetails extends ListActivity {
} }
private boolean pref_cacheDownloaded; private boolean pref_cacheDownloaded;
private boolean pref_expert;
private boolean viewResetRequired; private boolean viewResetRequired;
// The signature of the installed version.
private Signature mInstalledSignature;
private String mInstalledSigID;
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
@ -174,6 +183,7 @@ public class AppDetails extends ListActivity {
SharedPreferences prefs = PreferenceManager SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext()); .getDefaultSharedPreferences(getBaseContext());
pref_cacheDownloaded = prefs.getBoolean("cacheDownloaded", true); pref_cacheDownloaded = prefs.getBoolean("cacheDownloaded", true);
pref_expert = prefs.getBoolean("expert", false);
viewResetRequired = true; viewResetRequired = true;
} }
@ -204,6 +214,32 @@ public class AppDetails extends ListActivity {
DB.Apk curver = app.getCurrentVersion(); DB.Apk curver = app.getCurrentVersion();
app_currentvercode = curver == null ? 0 : curver.vercode; app_currentvercode = curver == null ? 0 : curver.vercode;
// Get the signature of the installed package...
mInstalledSignature = null;
if (curver != null) {
PackageManager pm = getBaseContext().getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(appid,
PackageManager.GET_SIGNATURES);
mInstalledSignature = pi.signatures[0];
MessageDigest md;
md = MessageDigest.getInstance("MD5");
byte[] md5sum = new byte[32];
md.update(mInstalledSignature.toCharsString().getBytes());
md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String md5hash = bigInt.toString(16);
while (md5hash.length() < 32)
md5hash = "0" + md5hash;
mInstalledSigID = md5hash;
} catch (NameNotFoundException e) {
Log.d("FDroid", "Failed to get installed signature");
} catch (NoSuchAlgorithmException e) {
Log.d("FDroid", "Failed to calculate signature MD5 sum");
mInstalledSignature = null;
}
}
// Set the icon... // Set the icon...
ImageView iv = (ImageView) findViewById(R.id.icon); ImageView iv = (ImageView) findViewById(R.id.icon);
String icon_path = DB.getIconsPath() + app.icon; String icon_path = DB.getIconsPath() + app.icon;
@ -229,6 +265,10 @@ public class AppDetails extends ListActivity {
app.installedVersion)); app.installedVersion));
tv = (TextView) findViewById(R.id.description); tv = (TextView) findViewById(R.id.description);
tv.setText(app.description); tv.setText(app.description);
if (pref_expert && mInstalledSignature != null) {
tv = (TextView) findViewById(R.id.signature);
tv.setText("Signed: " + mInstalledSigID);
}
// Set up the list... // Set up the list...
ApkListAdapter la = new ApkListAdapter(this); ApkListAdapter la = new ApkListAdapter(this);
@ -372,9 +412,23 @@ public class AppDetails extends ListActivity {
// Install the version of this app denoted by 'curapk'. // Install the version of this app denoted by 'curapk'.
private void install() { private void install() {
if (mInstalledSigID != null && !curapk.sig.equals(mInstalledSigID)) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.SignatureMismatch).setPositiveButton(
"Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
return;
}
pd = new ProgressDialog(this); pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage(getString(R.string.download_server)); pd.setMessage(getString(R.string.download_server));
pd.show();
new Thread() { new Thread() {
public void run() { public void run() {
@ -488,8 +542,6 @@ public class AppDetails extends ListActivity {
} }
}.start(); }.start();
pd.show();
} }
// Handler used to update the progress dialog while downloading. The // Handler used to update the progress dialog while downloading. The

File diff suppressed because it is too large Load Diff

View File

@ -60,423 +60,423 @@ import android.widget.TabHost.TabSpec;
public class FDroid extends TabActivity implements OnItemClickListener { public class FDroid extends TabActivity implements OnItemClickListener {
private class AppListAdapter extends BaseAdapter { private class AppListAdapter extends BaseAdapter {
private List<DB.App> items = new ArrayList<DB.App>(); private List<DB.App> items = new ArrayList<DB.App>();
public AppListAdapter(Context context) { public AppListAdapter(Context context) {
} }
public void addItem(DB.App app) { public void addItem(DB.App app) {
items.add(app); items.add(app);
} }
public void clear() { public void clear() {
items.clear(); items.clear();
} }
@Override @Override
public int getCount() { public int getCount() {
return items.size(); return items.size();
} }
@Override @Override
public Object getItem(int position) { public Object getItem(int position) {
return items.get(position); return items.get(position);
} }
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
return position; return position;
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView; View v = convertView;
if (v == null) { if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.applistitem, null); v = vi.inflate(R.layout.applistitem, null);
} }
DB.App app = items.get(position); DB.App app = items.get(position);
TextView name = (TextView) v.findViewById(R.id.name); TextView name = (TextView) v.findViewById(R.id.name);
name.setText(app.name); name.setText(app.name);
String vs; String vs;
int numav = app.apks.size(); int numav = app.apks.size();
if (numav == 1) if (numav == 1)
vs = getString(R.string.n_version_available); vs = getString(R.string.n_version_available);
else else
vs = getString(R.string.n_versions_available); vs = getString(R.string.n_versions_available);
TextView status = (TextView) v.findViewById(R.id.status); TextView status = (TextView) v.findViewById(R.id.status);
status.setText(String.format(vs, numav)); status.setText(String.format(vs, numav));
TextView license = (TextView) v.findViewById(R.id.license); TextView license = (TextView) v.findViewById(R.id.license);
license.setText(app.license); license.setText(app.license);
TextView summary = (TextView) v.findViewById(R.id.summary); TextView summary = (TextView) v.findViewById(R.id.summary);
summary.setText(app.summary); summary.setText(app.summary);
ImageView icon = (ImageView) v.findViewById(R.id.icon); ImageView icon = (ImageView) v.findViewById(R.id.icon);
String iconpath = new String(DB.getIconsPath() + app.icon); String iconpath = new String(DB.getIconsPath() + app.icon);
File icn = new File(iconpath); File icn = new File(iconpath);
if (icn.exists() && icn.length() > 0) { if (icn.exists() && icn.length() > 0) {
new Uri.Builder().build(); new Uri.Builder().build();
icon.setImageURI(Uri.parse(iconpath)); icon.setImageURI(Uri.parse(iconpath));
} else { } else {
icon.setImageResource(android.R.drawable.sym_def_app_icon); icon.setImageResource(android.R.drawable.sym_def_app_icon);
} }
return v; return v;
} }
} }
private String LOCAL_PATH = "/sdcard/.fdroid"; private String LOCAL_PATH = "/sdcard/.fdroid";
private static final int REQUEST_APPDETAILS = 0; private static final int REQUEST_APPDETAILS = 0;
private static final int REQUEST_MANAGEREPOS = 1; private static final int REQUEST_MANAGEREPOS = 1;
private static final int REQUEST_PREFS = 2; private static final int REQUEST_PREFS = 2;
private static final int UPDATE_REPO = Menu.FIRST; private static final int UPDATE_REPO = Menu.FIRST;
private static final int MANAGE_REPO = Menu.FIRST + 1; private static final int MANAGE_REPO = Menu.FIRST + 1;
private static final int PREFERENCES = Menu.FIRST + 2; private static final int PREFERENCES = Menu.FIRST + 2;
private static final int ABOUT = Menu.FIRST + 3; private static final int ABOUT = Menu.FIRST + 3;
private DB db = null; private DB db = null;
// Apps that are available to be installed // Apps that are available to be installed
private AppListAdapter apps_av = new AppListAdapter(this); private AppListAdapter apps_av = new AppListAdapter(this);
// Apps that are installed // Apps that are installed
private AppListAdapter apps_in = new AppListAdapter(this); private AppListAdapter apps_in = new AppListAdapter(this);
// Apps that can be upgraded // Apps that can be upgraded
private AppListAdapter apps_up = new AppListAdapter(this); private AppListAdapter apps_up = new AppListAdapter(this);
private ProgressDialog pd; private ProgressDialog pd;
private static final String TAB_IN = "INST"; private static final String TAB_IN = "INST";
private static final String TAB_UN = "UNIN"; private static final String TAB_UN = "UNIN";
private static final String TAB_UP = "UPDT"; private static final String TAB_UP = "UPDT";
private TabHost tabHost; private TabHost tabHost;
private TabSpec ts; private TabSpec ts;
private TabSpec ts1; private TabSpec ts1;
private TabSpec tsUp; private TabSpec tsUp;
private boolean triedEmptyUpdate; private boolean triedEmptyUpdate;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.fdroid); setContentView(R.layout.fdroid);
File local_path = new File(LOCAL_PATH); File local_path = new File(LOCAL_PATH);
if (!local_path.exists()) if (!local_path.exists())
local_path.mkdir(); local_path.mkdir();
File icon_path = new File(DB.getIconsPath()); File icon_path = new File(DB.getIconsPath());
if (!icon_path.exists()) if (!icon_path.exists())
icon_path.mkdir(); icon_path.mkdir();
tabHost = getTabHost(); tabHost = getTabHost();
createTabs(); createTabs();
Intent i = getIntent(); Intent i = getIntent();
if (i.hasExtra("uri")) { if (i.hasExtra("uri")) {
Intent call = new Intent(this, ManageRepo.class); Intent call = new Intent(this, ManageRepo.class);
call.putExtra("uri", i.getStringExtra("uri")); call.putExtra("uri", i.getStringExtra("uri"));
startActivityForResult(call, REQUEST_MANAGEREPOS); startActivityForResult(call, REQUEST_MANAGEREPOS);
} }
} }
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
((FDroidApp) getApplication()).inActivity++; ((FDroidApp) getApplication()).inActivity++;
db = new DB(this); db = new DB(this);
triedEmptyUpdate = false; triedEmptyUpdate = false;
populateLists(true); populateLists(true);
} }
@Override @Override
protected void onStop() { protected void onStop() {
db.close(); db.close();
((FDroidApp) getApplication()).inActivity--; ((FDroidApp) getApplication()).inActivity--;
super.onStop(); super.onStop();
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu); super.onCreateOptionsMenu(menu);
menu.add(Menu.NONE, UPDATE_REPO, 1, R.string.menu_update_repo).setIcon( menu.add(Menu.NONE, UPDATE_REPO, 1, R.string.menu_update_repo).setIcon(
android.R.drawable.ic_menu_rotate); android.R.drawable.ic_menu_rotate);
menu.add(Menu.NONE, MANAGE_REPO, 2, R.string.menu_manage).setIcon( menu.add(Menu.NONE, MANAGE_REPO, 2, R.string.menu_manage).setIcon(
android.R.drawable.ic_menu_agenda); android.R.drawable.ic_menu_agenda);
menu.add(Menu.NONE, PREFERENCES, 3, R.string.menu_preferences).setIcon( menu.add(Menu.NONE, PREFERENCES, 3, R.string.menu_preferences).setIcon(
android.R.drawable.ic_menu_preferences); android.R.drawable.ic_menu_preferences);
menu.add(Menu.NONE, ABOUT, 4, R.string.menu_about).setIcon( menu.add(Menu.NONE, ABOUT, 4, R.string.menu_about).setIcon(
android.R.drawable.ic_menu_help); android.R.drawable.ic_menu_help);
return true; return true;
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case UPDATE_REPO: case UPDATE_REPO:
updateRepos(); updateRepos();
return true; return true;
case MANAGE_REPO: case MANAGE_REPO:
Intent i = new Intent(this, ManageRepo.class); Intent i = new Intent(this, ManageRepo.class);
startActivityForResult(i, REQUEST_MANAGEREPOS); startActivityForResult(i, REQUEST_MANAGEREPOS);
return true; return true;
case PREFERENCES: case PREFERENCES:
Intent prefs = new Intent(getBaseContext(), Preferences.class); Intent prefs = new Intent(getBaseContext(), Preferences.class);
startActivityForResult(prefs, REQUEST_PREFS); startActivityForResult(prefs, REQUEST_PREFS);
return true; return true;
case ABOUT: case ABOUT:
LayoutInflater li = LayoutInflater.from(this); LayoutInflater li = LayoutInflater.from(this);
View view = li.inflate(R.layout.about, null); View view = li.inflate(R.layout.about, null);
// Fill in the version... // Fill in the version...
TextView tv = (TextView) view.findViewById(R.id.version); TextView tv = (TextView) view.findViewById(R.id.version);
PackageManager pm = getPackageManager(); PackageManager pm = getPackageManager();
PackageInfo pi; PackageInfo pi;
try { try {
pi = pm.getPackageInfo( pi = pm.getPackageInfo(
getApplicationContext().getPackageName(), 0); getApplicationContext().getPackageName(), 0);
tv.setText(pi.versionName); tv.setText(pi.versionName);
} catch (Exception e) { } catch (Exception e) {
} }
Builder p = new AlertDialog.Builder(this).setView(view); Builder p = new AlertDialog.Builder(this).setView(view);
final AlertDialog alrt = p.create(); final AlertDialog alrt = p.create();
alrt.setIcon(R.drawable.icon); alrt.setIcon(R.drawable.icon);
alrt.setTitle(getString(R.string.about_title)); alrt.setTitle(getString(R.string.about_title));
alrt.setButton(AlertDialog.BUTTON_NEUTRAL, alrt.setButton(AlertDialog.BUTTON_NEUTRAL,
getString(R.string.about_website), getString(R.string.about_website),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int whichButton) { int whichButton) {
Uri uri = Uri.parse("http://f-droid.org"); Uri uri = Uri.parse("http://f-droid.org");
startActivity(new Intent(Intent.ACTION_VIEW, uri)); startActivity(new Intent(Intent.ACTION_VIEW, uri));
} }
}); });
alrt.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.ok), alrt.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.ok),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int whichButton) { int whichButton) {
} }
}); });
alrt.show(); alrt.show();
return true; return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) { switch (requestCode) {
case REQUEST_APPDETAILS: case REQUEST_APPDETAILS:
break; break;
case REQUEST_MANAGEREPOS: case REQUEST_MANAGEREPOS:
if (data.hasExtra("update")) { if (data.hasExtra("update")) {
AlertDialog.Builder ask_alrt = new AlertDialog.Builder(this); AlertDialog.Builder ask_alrt = new AlertDialog.Builder(this);
ask_alrt.setTitle(getString(R.string.repo_update_title)); ask_alrt.setTitle(getString(R.string.repo_update_title));
ask_alrt.setIcon(android.R.drawable.ic_menu_rotate); ask_alrt.setIcon(android.R.drawable.ic_menu_rotate);
ask_alrt.setMessage(getString(R.string.repo_alrt)); ask_alrt.setMessage(getString(R.string.repo_alrt));
ask_alrt.setPositiveButton(getString(R.string.yes), ask_alrt.setPositiveButton(getString(R.string.yes),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int whichButton) { int whichButton) {
updateRepos(); updateRepos();
} }
}); });
ask_alrt.setNegativeButton(getString(R.string.no), ask_alrt.setNegativeButton(getString(R.string.no),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int whichButton) { int whichButton) {
return; return;
} }
}); });
AlertDialog alert = ask_alrt.create(); AlertDialog alert = ask_alrt.create();
alert.show(); alert.show();
} }
break; break;
case REQUEST_PREFS: case REQUEST_PREFS:
// The automatic update settings may have changed, so reschedule (or // The automatic update settings may have changed, so reschedule (or
// unschedule) the // unschedule) the
// service accordingly. It's cheap, so no need to check if the // service accordingly. It's cheap, so no need to check if the
// particular setting has // particular setting has
// actually been changed. // actually been changed.
UpdateService.schedule(getBaseContext()); UpdateService.schedule(getBaseContext());
break; break;
} }
} }
private void createTabs() { private void createTabs() {
tabHost.clearAllTabs(); tabHost.clearAllTabs();
// TabContentFactory that can generate the appropriate list for each // TabContentFactory that can generate the appropriate list for each
// tab... // tab...
TabHost.TabContentFactory tf = new TabHost.TabContentFactory() { TabHost.TabContentFactory tf = new TabHost.TabContentFactory() {
@Override @Override
public View createTabContent(String tag) { public View createTabContent(String tag) {
AppListAdapter ad; AppListAdapter ad;
if (tag.equals(TAB_IN)) if (tag.equals(TAB_IN))
ad = apps_in; ad = apps_in;
else if (tag.equals(TAB_UP)) else if (tag.equals(TAB_UP))
ad = apps_up; ad = apps_up;
else else
ad = apps_av; ad = apps_av;
ListView lst = new ListView(FDroid.this); ListView lst = new ListView(FDroid.this);
lst.setOnItemClickListener(FDroid.this); lst.setOnItemClickListener(FDroid.this);
lst.setAdapter(ad); lst.setAdapter(ad);
return lst; return lst;
} }
}; };
// Create the tab of installed apps... // Create the tab of installed apps...
ts = tabHost.newTabSpec(TAB_IN); ts = tabHost.newTabSpec(TAB_IN);
ts.setIndicator(getString(R.string.tab_installed), getResources() ts.setIndicator(getString(R.string.tab_installed), getResources()
.getDrawable(drawable.star_off)); .getDrawable(drawable.star_off));
ts.setContent(tf); ts.setContent(tf);
// Create the tab of apps with updates... // Create the tab of apps with updates...
tsUp = tabHost.newTabSpec(TAB_UP); tsUp = tabHost.newTabSpec(TAB_UP);
tsUp.setIndicator(getString(R.string.tab_updates), getResources() tsUp.setIndicator(getString(R.string.tab_updates), getResources()
.getDrawable(drawable.star_on)); .getDrawable(drawable.star_on));
tsUp.setContent(tf); tsUp.setContent(tf);
// Create the tab of available apps... // Create the tab of available apps...
ts1 = tabHost.newTabSpec(TAB_UN); ts1 = tabHost.newTabSpec(TAB_UN);
ts1.setIndicator(getString(R.string.tab_noninstalled), getResources() ts1.setIndicator(getString(R.string.tab_noninstalled), getResources()
.getDrawable(drawable.ic_input_add)); .getDrawable(drawable.ic_input_add));
ts1.setContent(tf); ts1.setContent(tf);
tabHost.addTab(ts1); tabHost.addTab(ts1);
tabHost.addTab(ts); tabHost.addTab(ts);
tabHost.addTab(tsUp); tabHost.addTab(tsUp);
} }
// Populate the lists. // Populate the lists.
// 'update' - true to update the installed status of the applications // 'update' - true to update the installed status of the applications
// by asking the system. // by asking the system.
private void populateLists(boolean update) { private void populateLists(boolean update) {
apps_in.clear(); apps_in.clear();
apps_av.clear(); apps_av.clear();
apps_up.clear(); apps_up.clear();
Vector<DB.App> apps = db.getApps(null, null, update); Vector<DB.App> apps = db.getApps(null, null, update);
if (apps.isEmpty()) { if (apps.isEmpty()) {
// Don't attempt this more than once - we may have invalid // Don't attempt this more than once - we may have invalid
// repositories. // repositories.
if (triedEmptyUpdate) if (triedEmptyUpdate)
return; return;
// If there are no apps, update from the repos - it must be a // If there are no apps, update from the repos - it must be a
// new installation. // new installation.
Log.d("FDroid", "Empty app list forces repo update"); Log.d("FDroid", "Empty app list forces repo update");
updateRepos(); updateRepos();
triedEmptyUpdate = true; triedEmptyUpdate = true;
return; return;
} }
Log.d("FDroid", "Updating lists - " + apps.size() + " apps in total"); Log.d("FDroid", "Updating lists - " + apps.size() + " apps in total");
for (DB.App app : apps) { for (DB.App app : apps) {
if (app.installedVersion == null) { if (app.installedVersion == null) {
apps_av.addItem(app); apps_av.addItem(app);
} else { } else {
apps_in.addItem(app); apps_in.addItem(app);
if (app.hasUpdates) if (app.hasUpdates)
apps_up.addItem(app); apps_up.addItem(app);
} }
} }
// Update the count on the 'Updates' tab to show the number available. // Update the count on the 'Updates' tab to show the number available.
// This is quite unpleasant, but seems to be the only way to do it. // This is quite unpleasant, but seems to be the only way to do it.
TextView uptext = (TextView) tabHost.getTabWidget().getChildAt(2) TextView uptext = (TextView) tabHost.getTabWidget().getChildAt(2)
.findViewById(android.R.id.title); .findViewById(android.R.id.title);
uptext.setText(getString(R.string.tab_updates) + " (" uptext.setText(getString(R.string.tab_updates) + " ("
+ Integer.toString(apps_up.getCount()) + ")"); + Integer.toString(apps_up.getCount()) + ")");
// Tell the lists that the data behind the adapter has changed, so // Tell the lists that the data behind the adapter has changed, so
// they can refresh... // they can refresh...
apps_av.notifyDataSetChanged(); apps_av.notifyDataSetChanged();
apps_in.notifyDataSetChanged(); apps_in.notifyDataSetChanged();
apps_up.notifyDataSetChanged(); apps_up.notifyDataSetChanged();
} }
public boolean updateRepos() { public boolean updateRepos() {
pd = ProgressDialog.show(this, getString(R.string.process_wait_title), pd = ProgressDialog.show(this, getString(R.string.process_wait_title),
getString(R.string.process_update_msg), true); getString(R.string.process_update_msg), true);
pd.setIcon(android.R.drawable.ic_dialog_info); pd.setIcon(android.R.drawable.ic_dialog_info);
// Check for connection first! // Check for connection first!
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (netstate.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED if (netstate.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED
|| netstate.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED) { || netstate.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED) {
new Thread() { new Thread() {
public void run() { public void run() {
RepoXMLHandler.doUpdates(FDroid.this, db); RepoXMLHandler.doUpdates(FDroid.this, db);
update_handler.sendEmptyMessage(0); update_handler.sendEmptyMessage(0);
} }
}.start(); }.start();
return true; return true;
} else { } else {
pd.dismiss(); pd.dismiss();
Toast.makeText(FDroid.this, getString(R.string.connection_error), Toast.makeText(FDroid.this, getString(R.string.connection_error),
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
return false; return false;
} }
} }
/* /*
* Handlers for thread functions that need to access GUI * Handlers for thread functions that need to access GUI
*/ */
private Handler update_handler = new Handler() { private Handler update_handler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
populateLists(true); populateLists(true);
if (pd.isShowing()) if (pd.isShowing())
pd.dismiss(); pd.dismiss();
} }
}; };
// Handler for a click on one of the items in an application list. Pops // Handler for a click on one of the items in an application list. Pops
// up a dialog that shows the details of the application and all its // up a dialog that shows the details of the application and all its
// available versions, with buttons to allow installation etc. // available versions, with buttons to allow installation etc.
public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2,
long arg3) { long arg3) {
final DB.App app; final DB.App app;
String curtab = tabHost.getCurrentTabTag(); String curtab = tabHost.getCurrentTabTag();
if (curtab.equalsIgnoreCase(TAB_IN)) { if (curtab.equalsIgnoreCase(TAB_IN)) {
app = (DB.App) apps_in.getItem(arg2); app = (DB.App) apps_in.getItem(arg2);
} else if (curtab.equalsIgnoreCase(TAB_UP)) { } else if (curtab.equalsIgnoreCase(TAB_UP)) {
app = (DB.App) apps_up.getItem(arg2); app = (DB.App) apps_up.getItem(arg2);
} else { } else {
app = (DB.App) apps_av.getItem(arg2); app = (DB.App) apps_av.getItem(arg2);
} }
Intent intent = new Intent(this, AppDetails.class); Intent intent = new Intent(this, AppDetails.class);
intent.putExtra("appid", app.id); intent.putExtra("appid", app.id);
startActivityForResult(intent, REQUEST_APPDETAILS); startActivityForResult(intent, REQUEST_APPDETAILS);
} }
} }

View File

@ -26,6 +26,6 @@ public class FDroidApp extends Application {
// don't want a database update to run. Incremented when entering // don't want a database update to run. Incremented when entering
// one, and decremented when leaving, so if it's 0 it ought to be // one, and decremented when leaving, so if it's 0 it ought to be
// ok! // ok!
public int inActivity=0; public int inActivity = 0;
} }

View File

@ -42,203 +42,205 @@ import android.util.Log;
public class RepoXMLHandler extends DefaultHandler { public class RepoXMLHandler extends DefaultHandler {
String mserver; String mserver;
private DB db; private DB db;
private DB.App curapp = null; private DB.App curapp = null;
private DB.Apk curapk = null; private DB.Apk curapk = null;
private String curchars = null; private String curchars = null;
public RepoXMLHandler(String srv, DB db) { public RepoXMLHandler(String srv, DB db) {
mserver = srv; mserver = srv;
this.db = db; this.db = db;
} }
@Override @Override
public void characters(char[] ch, int start, int length) public void characters(char[] ch, int start, int length)
throws SAXException { throws SAXException {
super.characters(ch, start, length); super.characters(ch, start, length);
String str = new String(ch).substring(start, start + length); String str = new String(ch).substring(start, start + length);
if (curchars == null) if (curchars == null)
curchars = str; curchars = str;
else else
curchars += str; curchars += str;
} }
@Override @Override
public void endElement(String uri, String localName, String qName) public void endElement(String uri, String localName, String qName)
throws SAXException { throws SAXException {
super.endElement(uri, localName, qName); super.endElement(uri, localName, qName);
String curel = localName; String curel = localName;
String str = curchars; String str = curchars;
if (curel == "application" && curapp != null) { if (curel == "application" && curapp != null) {
Log.d("FDroid", "Repo: Updating application " + curapp.id); Log.d("FDroid", "Repo: Updating application " + curapp.id);
db.updateApplication(curapp); db.updateApplication(curapp);
getIcon(curapp); getIcon(curapp);
curapp = null; curapp = null;
} else if (curel == "package" && curapk != null && curapp != null) { } else if (curel == "package" && curapk != null && curapp != null) {
Log.d("FDroid", "Repo: Package added (" + curapk.version + ")"); Log.d("FDroid", "Repo: Package added (" + curapk.version + ")");
curapp.apks.add(curapk); curapp.apks.add(curapk);
curapk = null; curapk = null;
} else if (curapk != null && str != null) { } else if (curapk != null && str != null) {
if (curel == "version") { if (curel == "version") {
curapk.version = str; curapk.version = str;
} else if (curel == "versioncode") { } else if (curel == "versioncode") {
try { try {
curapk.vercode = Integer.parseInt(str); curapk.vercode = Integer.parseInt(str);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
curapk.vercode = 0; curapk.vercode = 0;
} }
} else if (curel == "size") { } else if (curel == "size") {
try { try {
curapk.size = Integer.parseInt(str); curapk.size = Integer.parseInt(str);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
curapk.size = 0; curapk.size = 0;
} }
} else if (curel == "hash") { } else if (curel == "hash") {
curapk.hash = str; curapk.hash = str;
} else if (curel == "apkname") { } else if (curel == "sig") {
curapk.apkName = str; curapk.sig = str;
} else if (curel == "apksource") { } else if (curel == "apkname") {
curapk.apkSource = str; curapk.apkName = str;
} } else if (curel == "apksource") {
} else if (curapp != null && str != null) { curapk.apkSource = str;
if (curel == "id") { }
Log.d("FDroid", "App id is " + str); } else if (curapp != null && str != null) {
curapp.id = str; if (curel == "id") {
} else if (curel == "name") { Log.d("FDroid", "App id is " + str);
curapp.name = str; curapp.id = str;
} else if (curel == "icon") { } else if (curel == "name") {
curapp.icon = str; curapp.name = str;
} else if (curel == "description") { } else if (curel == "icon") {
curapp.description = str; curapp.icon = str;
} else if (curel == "summary") { } else if (curel == "description") {
curapp.summary = str; curapp.description = str;
} else if (curel == "license") { } else if (curel == "summary") {
curapp.license = str; curapp.summary = str;
} else if (curel == "source") { } else if (curel == "license") {
curapp.sourceURL = str; curapp.license = str;
} else if (curel == "web") { } else if (curel == "source") {
curapp.webURL = str; curapp.sourceURL = str;
} else if (curel == "tracker") { } else if (curel == "web") {
curapp.trackerURL = str; curapp.webURL = str;
} else if (curel == "marketversion") { } else if (curel == "tracker") {
curapp.marketVersion = str; curapp.trackerURL = str;
} else if (curel == "marketvercode") { } else if (curel == "marketversion") {
try { curapp.marketVersion = str;
curapp.marketVercode = Integer.parseInt(str); } else if (curel == "marketvercode") {
} catch (NumberFormatException ex) { try {
curapp.marketVercode = 0; curapp.marketVercode = Integer.parseInt(str);
} } catch (NumberFormatException ex) {
} else if (curel == "antifeatures") { curapp.marketVercode = 0;
curapp.antiFeatures = str; }
} } else if (curel == "antifeatures") {
} curapp.antiFeatures = str;
}
}
} }
@Override @Override
public void startElement(String uri, String localName, String qName, public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException { Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes); super.startElement(uri, localName, qName, attributes);
if (localName == "application" && curapp == null) { if (localName == "application" && curapp == null) {
Log.d("FDroid", "Repo: Found application at " + mserver); Log.d("FDroid", "Repo: Found application at " + mserver);
curapp = new DB.App(); curapp = new DB.App();
} else if (localName == "package" && curapp != null && curapk == null) { } else if (localName == "package" && curapp != null && curapk == null) {
Log.d("FDroid", "Repo: Found package for " + curapp.id); Log.d("FDroid", "Repo: Found package for " + curapp.id);
curapk = new DB.Apk(); curapk = new DB.Apk();
curapk.id = curapp.id; curapk.id = curapp.id;
curapk.server = mserver; curapk.server = mserver;
} }
curchars = null; curchars = null;
} }
private void getIcon(DB.App app) { private void getIcon(DB.App app) {
try { try {
String destpath = DB.getIconsPath() + app.icon; String destpath = DB.getIconsPath() + app.icon;
File f = new File(destpath); File f = new File(destpath);
if (f.exists()) if (f.exists())
return; return;
BufferedInputStream getit = new BufferedInputStream(new URL(mserver BufferedInputStream getit = new BufferedInputStream(new URL(mserver
+ "/icons/" + app.icon).openStream()); + "/icons/" + app.icon).openStream());
FileOutputStream saveit = new FileOutputStream(destpath); FileOutputStream saveit = new FileOutputStream(destpath);
BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024); BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024);
byte data[] = new byte[1024]; byte data[] = new byte[1024];
int readed = getit.read(data, 0, 1024); int readed = getit.read(data, 0, 1024);
while (readed != -1) { while (readed != -1) {
bout.write(data, 0, readed); bout.write(data, 0, readed);
readed = getit.read(data, 0, 1024); readed = getit.read(data, 0, 1024);
} }
bout.close(); bout.close();
getit.close(); getit.close();
saveit.close(); saveit.close();
} catch (Exception e) { } catch (Exception e) {
} }
} }
public static void doUpdates(Context ctx, DB db) { public static void doUpdates(Context ctx, DB db) {
db.beginUpdate(); db.beginUpdate();
Vector<DB.Repo> repos = db.getRepos(); Vector<DB.Repo> repos = db.getRepos();
for (DB.Repo repo : repos) { for (DB.Repo repo : repos) {
if (repo.inuse) { if (repo.inuse) {
try { try {
FileOutputStream f = ctx.openFileOutput("tempindex.xml", FileOutputStream f = ctx.openFileOutput("tempindex.xml",
Context.MODE_PRIVATE); Context.MODE_PRIVATE);
// Download the index file from the repo... // Download the index file from the repo...
BufferedInputStream getit = new BufferedInputStream( BufferedInputStream getit = new BufferedInputStream(
new URL(repo.address + "/index.xml").openStream()); new URL(repo.address + "/index.xml").openStream());
BufferedOutputStream bout = new BufferedOutputStream(f, BufferedOutputStream bout = new BufferedOutputStream(f,
1024); 1024);
byte data[] = new byte[1024]; byte data[] = new byte[1024];
int readed = getit.read(data, 0, 1024); int readed = getit.read(data, 0, 1024);
while (readed != -1) { while (readed != -1) {
bout.write(data, 0, readed); bout.write(data, 0, readed);
readed = getit.read(data, 0, 1024); readed = getit.read(data, 0, 1024);
} }
bout.close(); bout.close();
getit.close(); getit.close();
f.close(); f.close();
// Process the index... // Process the index...
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser(); SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader(); XMLReader xr = sp.getXMLReader();
RepoXMLHandler handler = new RepoXMLHandler(repo.address, RepoXMLHandler handler = new RepoXMLHandler(repo.address,
db); db);
xr.setContentHandler(handler); xr.setContentHandler(handler);
InputStreamReader isr = new FileReader(new File(ctx InputStreamReader isr = new FileReader(new File(ctx
.getFilesDir() .getFilesDir()
+ "/tempindex.xml")); + "/tempindex.xml"));
InputSource is = new InputSource(isr); InputSource is = new InputSource(isr);
xr.parse(is); xr.parse(is);
} catch (Exception e) { } catch (Exception e) {
Log.d("FDroid", "Exception updating from " + repo.address Log.d("FDroid", "Exception updating from " + repo.address
+ " - " + e.getMessage()); + " - " + e.getMessage());
} finally { } finally {
ctx.deleteFile("tempindex.xml"); ctx.deleteFile("tempindex.xml");
} }
} }
} }
db.endUpdate(); db.endUpdate();
} }
} }

View File

@ -35,129 +35,129 @@ import android.util.Log;
public class UpdateService extends Service { public class UpdateService extends Service {
// Schedule (or cancel schedule for) this service, according to the // Schedule (or cancel schedule for) this service, according to the
// current preferences. Should be called a) at boot, or b) if the preference // current preferences. Should be called a) at boot, or b) if the preference
// is changed. // is changed.
// TODO: What if we get upgraded? // TODO: What if we get upgraded?
public static void schedule(Context ctx) { public static void schedule(Context ctx) {
SharedPreferences prefs = PreferenceManager SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(ctx); .getDefaultSharedPreferences(ctx);
String sint = prefs.getString("updateInterval", "0"); String sint = prefs.getString("updateInterval", "0");
int interval = Integer.parseInt(sint); int interval = Integer.parseInt(sint);
Intent intent = new Intent(ctx, UpdateService.class); Intent intent = new Intent(ctx, UpdateService.class);
PendingIntent pending = PendingIntent.getService(ctx, 0, intent, 0); PendingIntent pending = PendingIntent.getService(ctx, 0, intent, 0);
AlarmManager alarm = (AlarmManager) ctx AlarmManager alarm = (AlarmManager) ctx
.getSystemService(Context.ALARM_SERVICE); .getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pending); alarm.cancel(pending);
if (interval > 0) { if (interval > 0) {
alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 5000, SystemClock.elapsedRealtime() + 5000,
AlarmManager.INTERVAL_HOUR, pending); AlarmManager.INTERVAL_HOUR, pending);
} }
} }
// For API levels <5 // For API levels <5
@Override @Override
public void onStart(Intent intent, int startId) { public void onStart(Intent intent, int startId) {
handleCommand(); handleCommand();
} }
// For API levels >=5 // For API levels >=5
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
handleCommand(); handleCommand();
return START_REDELIVER_INTENT; return START_REDELIVER_INTENT;
} }
private void handleCommand() { private void handleCommand() {
new Thread() { new Thread() {
public void run() { public void run() {
// If we're in one of our list activities, we don't want // If we're in one of our list activities, we don't want
// to run an update because the database will be out of // to run an update because the database will be out of
// sync with the display. // sync with the display.
if (((FDroidApp) getApplication()).inActivity != 0) if (((FDroidApp) getApplication()).inActivity != 0)
return; return;
// See if it's time to actually do anything yet... // See if it's time to actually do anything yet...
SharedPreferences prefs = PreferenceManager SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext()); .getDefaultSharedPreferences(getBaseContext());
long lastUpdate = prefs.getLong("lastUpdateCheck", 0); long lastUpdate = prefs.getLong("lastUpdateCheck", 0);
String sint = prefs.getString("updateInterval", "0"); String sint = prefs.getString("updateInterval", "0");
int interval = Integer.parseInt(sint); int interval = Integer.parseInt(sint);
if (interval == 0) if (interval == 0)
return; return;
if (lastUpdate + (interval * 60 * 60) > System if (lastUpdate + (interval * 60 * 60) > System
.currentTimeMillis()) .currentTimeMillis())
return; return;
// Make sure we have a connection... // Make sure we have a connection...
ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager netstate = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (netstate.getNetworkInfo(1).getState() != NetworkInfo.State.CONNECTED if (netstate.getNetworkInfo(1).getState() != NetworkInfo.State.CONNECTED
&& netstate.getNetworkInfo(0).getState() != NetworkInfo.State.CONNECTED) && netstate.getNetworkInfo(0).getState() != NetworkInfo.State.CONNECTED)
return; return;
// Do the update... // Do the update...
DB db = null; DB db = null;
try { try {
db = new DB(getBaseContext()); db = new DB(getBaseContext());
boolean notify = prefs.getBoolean("updateNotify", false); boolean notify = prefs.getBoolean("updateNotify", false);
// Get the number of updates available before we // Get the number of updates available before we
// start, so we can notify if there are new ones. // start, so we can notify if there are new ones.
// (But avoid doing it if the user doesn't want // (But avoid doing it if the user doesn't want
// notifications, since it may be time consuming) // notifications, since it may be time consuming)
int prevUpdates = 0; int prevUpdates = 0;
if (notify) if (notify)
prevUpdates = db.getNumUpdates(); prevUpdates = db.getNumUpdates();
RepoXMLHandler.doUpdates(getBaseContext(), db); RepoXMLHandler.doUpdates(getBaseContext(), db);
if (notify) { if (notify) {
if (db.getNumUpdates() > prevUpdates) { if (db.getNumUpdates() > prevUpdates) {
// And the user wants to know. // And the user wants to know.
NotificationManager n = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager n = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification( Notification notification = new Notification(
R.drawable.icon, R.drawable.icon,
"FDroid Updates Available", System "FDroid Updates Available", System
.currentTimeMillis()); .currentTimeMillis());
Context context = getApplicationContext(); Context context = getApplicationContext();
CharSequence contentTitle = "FDroid"; CharSequence contentTitle = "FDroid";
CharSequence contentText = "Updates are available."; CharSequence contentText = "Updates are available.";
Intent notificationIntent = new Intent( Intent notificationIntent = new Intent(
UpdateService.this, FDroid.class); UpdateService.this, FDroid.class);
PendingIntent contentIntent = PendingIntent PendingIntent contentIntent = PendingIntent
.getActivity(UpdateService.this, 0, .getActivity(UpdateService.this, 0,
notificationIntent, 0); notificationIntent, 0);
notification.setLatestEventInfo(context, notification.setLatestEventInfo(context,
contentTitle, contentText, contentIntent); contentTitle, contentText, contentIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.flags |= Notification.FLAG_AUTO_CANCEL;
n.notify(1, notification); n.notify(1, notification);
} }
} }
} catch (Exception e) { } catch (Exception e) {
Log.d("FDroid", "Exception during handleCommand() - " Log.d("FDroid", "Exception during handleCommand() - "
+ e.getMessage()); + e.getMessage());
} finally { } finally {
if (db != null) if (db != null)
db.close(); db.close();
stopSelf(); stopSelf();
} }
} }
}.start(); }.start();
} }
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
return null; return null;
} }
} }