uget-2.2.2/0000775000175000017500000000000013470305213007462 500000000000000uget-2.2.2/po/0000775000175000017500000000000013470305212010077 500000000000000uget-2.2.2/po/tr.po0000664000175000017500000013254613470304402011017 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Emin Tufan , 2016-2017 # yakup , 2013 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-10-29 17:15+0000\n" "Last-Translator: Emin Tufan \n" "Language-Team: Turkish (http://www.transifex.com/uget/uget/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Parola Yönetici Artalanı: uget\n\n%s adresine SSH ile bağlanmaya çalışılıyorken, bilinen ve güvenilen ana makineler dosyasına karşılık hostkey doğrulamasında sorun oluştu çünkü hostkey bulunamadı.\n\n%s'in hostkey'ini bilinen ana makineler dosyasına ekleyerek, bu ve gelecek bağlantılar için, bu bağlantının güvenli olarak görülmesini ister misiniz?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Tüm Kategoriler" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Bağlanıyor..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Gönderiliyor..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Yeniden dene" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "İndirme tamamlandı" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Bitti" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Devam Edebilir" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Devam Edemez" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Çıktı dosyası yeniden adlandırılamadı." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "ana makineye bağlanamadı." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Dizin oluşturulamadı." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Dosya oluşturulamadı (geçersiz dosya ismi veya dosya zaten mevcut)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Dosya açılamadı." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "İş parçacığı oluşturulamıyor." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Geçersiz kaynak (farklı dosya boyutu)" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Yetersiz kaynak (disk dolu veya bellek yetersiz)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Çıktı dosyası yok." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Çıktı ayarları yok." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Çok fazla yeniden deneme." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Desteklenmeyen şablon (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Desteklenmeyen dosya." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "gönderme dosyası bulunamadı." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "çerez dosyası bulunamadı." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Bu video silinmiş." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Video bilgisi alınırken hata oluştu." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Video web sayfası alınırken hata oluştu." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "YouTube adresinde video_id bulunamadı." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: bilinmeyen hata meydana geldi." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: zaman aşımı meydana geldi." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: kaynak bulunamadı." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 'kaynak bulunamadı' hatasının numarasını gördü. --max-file-not-found seçeneğine bak" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: hız çok yavaş." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: ağ sorunu meydana geldi." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: tamamlanmamış indirmeler." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Kaynak yetersiz" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: parça genişliği .aria2 denetim dosyasındakinden farklı." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 aynı dosyayı indiriyor." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 aynı hash bilgisine sahip torrenti indiriyor." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: dosya zaten mevcut. --allow-overwrite seçeneğine bakın." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: mevcut dosya açılamıyor." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: yeni dosya oluşturulamıyor ya da var olan dosya kırpılamıyor." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: dosya G/Ç hatası meydana geldi." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: isim çözümleme başarısız." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: Metalink belgesi ayrıştırılamadı." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP komutu başarısız." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP yanıt başlığı kötü ya da beklenmedik." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Çok fazla yönlendirme." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP yetkilendirmesi başarısız." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: bencode'lenmiş dosya ayrıştırılamıyor (çoğunlukla .torrent dosyası)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torrent dosyası bozuk ya da eksik bilgi içeriyor." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet adresi kötü." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: kötü/tanınmayan seçenek ya da beklenmeyen seçenek değeri verildi." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: uzak sunucu isteği işleyemiyor." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: JSON-RPC isteği ayrıştırılamıyor." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Yanıt yok. aria2 kapalı mı?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid kaldırıldı." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Ortam bağlantısı alınamadı." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Ortam eşleşmedi." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "İndirme Yöneticisi" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Yiğit Ateş\nEmin Tufan Çetin " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet Kurucusu:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet Tasarı Yöneticisi:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "görevler" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Panodan Yeni" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Yeni İndirme" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Pano" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Komut satırı" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Hata Oluştu" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "İndirilirken hata oluştu." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "İndirme Başlatılıyor" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "İndirme kuyruğu başlatılıyor." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "İndirme Tamamlandı" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Kuyruktaki tüm indirmeler tamamlandı." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Durum" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Bölüm" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Yeni indirme oluştur" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Yeni İn_dirme..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Yeni _Bölüm..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Yeni _çoklu pano..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Yeni _URL Dizin yığını..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Yeni Torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Yeni Metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Tüm ayarları kaydet" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Seçili indirmeyi çalıştırılabilir olarak belirle" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Seçili indirmeyi duraklat" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Seçili indirmenin özellikleri" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Seçili indirmeyi yukarı taşı" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Seçili indirmeyi aşağı taşı" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Seçili indirmeyi en üste taşı" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Seçili indirmeyi en alta taşı" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Yeni Bölüm" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopyala -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Bölüm Özellikleri" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "İndirme Özellikleri" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Yeni Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Yeni Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Torrent dosyası aç" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent dosyası (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Metalink dosyası aç" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Kategori dosyası kaydetme başarısız." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Kategori dosyası yüklemesi başarısız." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Kategori dosyası kaydet" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Kategori dosyası aç" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON dosyası (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Bağlantı " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Resim " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Metin Dosyası" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "HTML dosyasından URL aktar" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML dosyası (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Metin dosyasından URL aktar" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Düz metin dosyası" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "URL'leri metin dosyasına aktar" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL Dizin Yığını" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Panoda URL bulunamadı." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Tüm URL'ler mevcut." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Panodan çoklu" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Yeni" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Hata" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "İleti" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d öge seçildi" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "uGet'çiler Dikkat:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "uGet'in gelecekteki geliştirmeleri için Donation Drive kullanıyoruz, lütfen tıklayın" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "BURADA" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "Lütfen uGet için bu hızlı Kullanıcı Anketini doldurun." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "anketi doldurmak için buraya tıklayın" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Bölüm _adı:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Etkin _indirmeler:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Bitenlerin Kapasitesi:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Geri Dönüşüm Kapasitesi:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI Eşleşme koşulları" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Eşleşen _Ana Makineler:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Eşleşen _Şemalar:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Eşleşen _Türler:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Gerçekten çıkılsın mı?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Çıkmak istediğinize emin misiniz?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Dosyalar kesin olarak silinsin mi?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Dosyaları silmek istediğinizden emin misiniz?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Bölüm kesin olarak silinsin mi?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Bölümü silmek istediğinize emin misiniz?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Bana yeniden sorma" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Yansılar:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Dosya:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Dizin Seç" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Dizin:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Yönlendiren:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Azami Bağlantı:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "Çalıştı_rılabilir" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "Dur_aklat" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Oturum aç" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Kullanıcı:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Parola:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Çerez dosyası:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Çerez Dosyası Seç" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Gönderme dosyası:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Gönderme Dosyası Seç" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Kullanıcı Etmeni:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Yeniden deneme _sınırı:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "deneme" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Yeniden _deneme gecikmesi:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "saniye" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Azami yükleme hızı:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Azami indirme hızı:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Zaman damgasını al" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Dosya" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Çoklu İndirme" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Çoklu _pano..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL Dizin yığını..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Metin dosyasını içe ak_tar (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML dosyasını içe aktar (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "M_etin dosyasına dışarı aktar (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "Kateg_ori Aç..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "Kategoriyi farklı _kaydet..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Tüm _ayarları kaydet" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Çevrim Dışı Kip" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "Düz_enle" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Pano _İzleyici" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Pano usulca çalışıyor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Komut satırı usulca çalışıyor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Var olan URI'yi atla" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Son indirme ayarlarını uygula" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Tamamlanış _Kendiliğinden Eylemleri" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Devre dışı bırak" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Uyut" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Beklet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Kapat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Yeniden başlat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Özel" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Ayarı anımsa" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Yardım" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Ayarlar..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Görünüm" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Araç çubuğu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Durum çubuğu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Özet" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Özet _Ögeleri" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Ad" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Dizin" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_İleti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "İndirme _Sütunları" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Tamamlanma" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Boyut" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Yüzde '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "G_eçen" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "Ka_lan" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Hız" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Yükleme Hızı" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Yüklendi" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Oran" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Yeniden dene" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Eklendi" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Tamamlandı" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Bölüm" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Yeni Bölüm..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Bölümü Sil" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_İndirme" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "Gir_diyi Sil" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Girdiyi ve _Dosyayı Sil" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Depolama _konumunu aç" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Zorla Başlat" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Taşı" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Öncelik" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Yüksek" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Olağan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Düşük" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Çevrim İçi Yardım Alın" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Belgeleme" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Destek Forumu" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Geri Bildirim Gönder" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Bir Hata Bildir" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Güncellemeler için denetle" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Ayarlar" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "'%s' dosyası için varsayılan uygulama başlatılamıyor." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Bu dizin mevcut değil." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI mevcut" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Bu URI zaten var, devam etmek istediğine emin misin?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Genel" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Gelişmiş" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Bölüm ayarları" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Yeni indirme 1 için varsayılan" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Varsayılan 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "adlandırılmamış" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Duraklatıldı" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Yükleniyor" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Tamamlandı" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Geri dönüştürüldü" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Kuyrukta" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Etkin" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Tüm Durumlar" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Ad" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Tamamlanma" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Boyut" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Geçen süre" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Kalan" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Miktar" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Vekil sunucu:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Kullanma" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Varsayılan" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Ana Makine:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Soket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Soket değerleri:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Nesne:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Pzt" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Sal" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Çar" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Per" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Cum" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Cmt" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Paz" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Zamanlayıcıyı _Etkinleştir" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Kapat" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- tüm görevi durdur" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Olağan" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- görevi olağan biçimde yürüt" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Tümü" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Boş" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Süzgece göre imle" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URL'leri ana makine VE dosya uzantısına göre imle" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Bu, tüm imli URL'leri sıfırlayacak." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Ana Makine" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Dosya Uzantısı" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Temel üst metin referansı" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "_Tümünü İmle" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "İmi _Kaldır" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "Süzgece göre _imle..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "örn." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "Kaynak:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Alıcı:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "basamak:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "K_aynak:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "büyük-küçük harfe hassas" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL girişinde özel karakter(*) yok." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Geçersiz URL." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "'Kaynak' veya 'Alıcı' girişi boş." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Ön izleme" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Kullanıcı Arayüzü" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Bant genişliği" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Zamanlayıcı" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Eklenti" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Ortam web sitesi" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Diğerleri" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "Pano izleyiciyi _etkinleştir" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Sessiz kip" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Öntanımlı kategori dizini" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Eşleşen kategori yoksa N. kategoriye ekleniyor." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "Ortam websitesinin URL'sini _izle" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Belirtilen dosya türleri için panoyu izle:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Türleri '|' karakteri ile ayır." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Burada düzenli ifadeleri kullanabilirsiniz." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Onay" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Kapatırken onay kutusu göster" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Dosyalar silinirken onayla" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Sistem Tepsisi" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Küçük simgeyi her zaman göster" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Tepsiye küçültülmüş olarak başlat" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Pencere kapatıldığında sistem tepsisine küçült" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Ubuntu App Indicator'u kullan" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Başlangıçta çevrim dışı kipi etkinleştir" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "İndirme başlıyor bildirimi" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "İndirme bittikten sonra ses çıkar" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Geniş simge göster" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Bu tüm eklentileri etkileyecek." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Genel hız sınırı" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Azami yükleme hızı" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Azami indirme hızı" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Tamamlanış Kendiliğinden Eylemleri" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Özel komut:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Hata oluşursa özel komut:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "Kendiliğinden k_aydet" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Aralık:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "dakika" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Komut Satırı Ayarları" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Varsayılan olarak \"--quiet\" kullan" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Eklenti eşleşme düzeni:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 eklenti seçenekleri" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC yetkilendirme gizli belirteci" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Yalnızca aria2 için genel hız sınırı" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "Başlangıçta aria2'yi ça_lıştır" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "Çıkışta aria2'yi _kapat" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "aria2'yi yerel aygıtta çalıştır" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Yol" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Değerler" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Değiştirdikten sonra uGet'i yeniden başlatmalısınız." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Ortam eşleşme kipi:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Eşleşme koşulları" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Nitelik:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Tür:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Dosya" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Dizin" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Öge" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Değer" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Tümünü Kopy_ala" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Pencereyi göster" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Çevrim Dışı Kip" uget-2.2.2/po/LINGUAS0000664000175000017500000000025213470304401011042 00000000000000# Set of available languages. ar be bg bn_BD ca cs da de es fa fr he hr hu id it ja ka_GE kk ku lt or_IN pl pt_BR ro ru sk_SK sr sr@latin sv tr uk uz@Latn vi zh_CN zh_TW uget-2.2.2/po/es.po0000664000175000017500000013432313470304402010774 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Alejo_K , 2015 # Alejo_K , 2016 # Juan Roberto García Sánchez , 2017 # Vico Koby , 2013 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: Juan Roberto García Sánchez \n" "Language-Team: Spanish (http://www.transifex.com/uget/uget/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Demonio del Gestor de Contraseñas: uget\n\nAl intentar una conexión SSH a %s ocurrió un problema verificando está clave del host contra el archivo host conocido y de confianza porque la clave no fue encontrada.\n\n¿Le gustaría tratar esta conexión como confiable para esta y futuras conexiones agregando la clave del host %s's al archivo de hosts conocidos?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Todas las categorías" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Conectando..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmitiendo..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Reintentos" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Descarga completa" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Finalizados" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Reanudable" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "No reanudable" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "El archivo de salida no puede ser renombrado." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "No se podría conectar al host." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "La carpeta no puede ser creada." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "El archivo no puede ser creado (nombre incorrecto o ya existe)" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "El archivo no puede ser abierto." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Imposible crear hilo." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Fuente incorrecta (tamaño de archivo diferente)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Recursos insuficientes (disco lleno o ejecución fuera de memoria)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Falta el archivo de salida." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Falta la configuración de salida." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Demasiados reintentos." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Esquema no soportado (protocolo)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Archivo no soportado." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "archivo post no encontrado." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "archivo cookie no encontrado." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Este video fue eliminado." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Se ha producido un error al obtener info del video." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Se ha producido un error al obtener vídeo de la página web." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "No se encontró video_id en la URL de YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: se ha producido un error desconocido." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: tiempo de espera agotado." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: no se encontró el recurso." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 vio el número específico del error 'no se encontró el recurso'. Ver opción --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: velocidad era demasiado lento." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: ocurrió un error de conexión." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: descargas sin terminar." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Recursos insuficientes" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: la longitud de la pieza era diferente en el archivo de control de .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 descargó el mismo archivo." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 estaba descargando la misma información hash del torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: archivo ya existe. Ver opción --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: no se pudo abrir archivo existente." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: no se pudo crear un nuevo archivo o truncar archivo existente." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: ocurrió un error de E/S." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: fallo resolución de nombre." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: no se pudo analizar Metalink del documento." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: fallo del comando FTP." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: Encabezado de respuesta HTTP malo o inesperado." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Demasiadas redirecciones." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP error de autorización." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: no se pudo analizar el archivo bencoded (normalmente archivo .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: archivo torrent está dañado o falta información." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI está dañado." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: opción mala/desconocida fue dada o inesperado argumento de opción fue dado." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr " aria2: servidor remoto no pudo manejar la petición." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: no pudo analizar petición JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "No hay respuesta. ¿Está aria2 apagado?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid fue eliminado." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Fallo al obtener el enlace." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "No hay medios emparejados." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Gestor de descargas" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Victor Emmanuel, vicokoby@gmail.com" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Fundador de uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Director de proyecto uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "tareas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nuevo desde el portapapeles" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nueva descarga" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Portapapeles" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Línea de comandos" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Se ha producido un error" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Se ha producido un error al descargar." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Iniciando descarga" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Iniciando cola de descargas." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Descarga completa" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Todas las descargas en cola se han completado." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Estado" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Categoría" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Crea una nueva descarga" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nueva _descarga..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nueva _categoría..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Descargas nuevas en _masa desde el portapapeles..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nueva secuencia de _URL's en masa..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nuevo Torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nuevo metaenlace..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Guardar todos los ajustes" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Ejecutar las descargas seleccionadas" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pausar las descargas seleccionadas" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Establecer las propiedades de las descargas seleccionadas" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Mover las descargas seleccionadas hacia arriba" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Mover las descargas seleccionadas hacia abajo" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Mover las descargas seleccionadas al principio" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Mover las descargas seleccionadas al final" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nueva categoría" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Copiar -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Propiedades de la categoría" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Propiedades de la descarga" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nuevo Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nuevo metaenlace" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Abrir archivo Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Archivo Torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Abrir archivo de metaenlace" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Fallo al guardar archivo de categoría." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Fallo al cargar archivo de categoría." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Guardar archivo de Categoría" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Abrir archivo de Categoría" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Archivo JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Enlace " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Imagen " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Archivo de texto" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importar URLs de archivo HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Archivo HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importar URLs de archivo de texto" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Archivo de texto plano." #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exportar URLs a un archivo de texto" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Secuencia de URL's en masa" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "No se encontraron URLs en el portapapeles." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Existían todas las URL." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "En masa del portapapeles..." #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nuevo" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Error" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Mensaje" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d elementos seleccionados" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Atención uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Estamos ejecutando una unidad de donación para el desarrollo futuro de uGet, por favor haga clic" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "AQUÍ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "por favor llene esta encuesta rápida de usuario para uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "haga clic aquí para tomar la encuesta" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nombre de la categoría:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "_Descargas activas:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Capacidad de finalizados:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Capacidad de reciclados:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Condiciones de emparejamiento URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Hosts_Emparejados:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Sistemas_Emparejados:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Tipos_de_emparejamientos:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "¿Salir realmente?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "¿Está seguro que quiere salir?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "¿Realmente eliminar archivos?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "¿Está seguro que quiere eliminar los archivos?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "¿Realmente eliminar la categoría?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "¿Está seguro que quiere eliminar la categoría?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "No volver a preguntar" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Espejos:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Archivo:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Seleccionar carpeta" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Carpeta:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Referencia:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Máximo de conexiones:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Ejecutar" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ausar" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Ingresar" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Usuario:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Contraseña:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Archivo Cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Seleccionar archivo cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Archivo posteado:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Selecccionar archivo posteado" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Agente de Usuario:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Límite de reintentos:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "veces" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Retardo reintentos:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "segundos" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Velocidad máxima de subida:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Velocidad máxima de descarga:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Recuperar estampa de tiempo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Archivo" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Lote de descargas" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "En masa desde el _portapapeles..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Secuencia de _URL's en masa..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Archivo de importación de _texto (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Archivo de importación _HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportar a archivo de texto(.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Abrir categoría..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Guardar categoría como..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Guardar _todos los ajustes" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Modo sin conexión" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Editar" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitoreo del portapapeles" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Portapapeles trabaja silenciosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Línea de comandos trabaja silenciosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Saltar URI existente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Aplicar configuración de descargas recientes" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Al finalizar _Acciones-Automáticas" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Deshabilitar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Suspender" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Apagar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Reiniciar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Personalizado" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Recordar ajustes" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "Ay_uda" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Configuración..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Ver" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Barra de herramientas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barra de estado" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Resumen" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Sumario de Í_tems" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nombre" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Carpeta" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Mensaje" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Columnas de descarga" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Completado" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Tamaño" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Porcentaje '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Transcurrido" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Restante" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Velocidad" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Aumentar velocidad" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Subido" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Tasa" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Reintentos" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Añadido en" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Completado en" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Categoría" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nueva categoría..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Eliminar categoría" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Descarga" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Eliminar Entrada" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Eliminar Entrada y _Archivo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Abrir carpeta _Contenedora" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Forzar inicio" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Mover a" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioridad" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Alta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Baja" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Obtener ayuda en línea" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Documentación" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Foro de soporte" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Enviar información retroactiva" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Reportar un error" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr " Atajos de teclado" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Comprobar actualizaciones" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Configuración" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "No se puede ejecutar la aplicación asociada al archivo '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Esta carpeta no existe." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI ya existía" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Está URI ya existía, ¿esta seguro que desea continuar?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "General" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avanzado" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Configuración de la categoría" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Por defecto para nueva descarga 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Por defecto 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "sin nombre" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pausado" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Subiendo" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Completado" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Reciclados" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Cola" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Activo" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Todo el estado" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nombre" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Completado" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Tamaño" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Transcurrido" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Restante" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Cantidad" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "No usar" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Predeterminado" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Puerto:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Args. sockets:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elemento:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Lunes" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Martes" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Miércoles" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Jueves" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Viernes" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sábado" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Domingo" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Habilitar planificador" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Activado" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- detiene todas las tareas" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- ejecuta tareas normalmente" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Todo" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Ninguno" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Marcar por filtro" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Marcar URLs por host Y por extensión de archivo." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Esto retablecerá todas las marcas de las URLs." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Ext. archivo" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Hipertexto de referencia base" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Marcar _todo" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "_Desmarcar todo" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Marcar por filtro..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "ej." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Desde:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Hasta:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "dígitos:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "D_esde:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "sensible a MAY/min" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "No hay caracteres comodín(*) en la URL de entrada." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "La URL no es válida." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "No hay caracteres en la entrada 'Desde' o 'Hasta'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Vista previa" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interfaz de usuario" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Ancho de banda" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Planificador" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Complemento" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Sitio web de medios" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Otros" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Activar monitor de portapapeles" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "Modo _silencioso" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Índice de categoría por defecto" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Añadir a la categoría Nth si ninguna categoría coincide." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Monitorear la URL del sitio web de medios" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorear portapapeles para determinados tipos de archivos:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Separe los tipos con el caracter '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "También puede usar expresiones regulares." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Confirmación" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Mostrar diálogo de confirmación al salir" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Confirmar eliminación de archivos" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Bandeja del sistema" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Siempre mostrar icono en bandeja" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimizar a la bandeja al inicio" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Ocultar a la bandeja al cerrar la ventana" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Usar indicador de aplicaciones de Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Habilitar modo fuera de línea al inicio" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notificar inicio de descarga" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Sonido al finalizar la descarga" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Mostrar icono grande" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Esto afectará a todos los complementos." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Límite de velocidad global" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Velocidad de subida máxima" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Velocidad de descarga máxima" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Al finalizar Acciones-Automáticas" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Comando personalizado:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Comando personalizado si se produce un error:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Autoguardar" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervalo:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minutos" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Configuración de la línea de comandos" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Usar '--quiet' por defecto" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Complemento en orden correspondiente:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 opciones del complemento" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Token secreto de autorización RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Límite de velocidad global solo para aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Ejecutar aria2 al inicio" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Cerrar aria2 al salir" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Ejecutar aria2 en dispositivo local" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Ruta" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumentos" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Debe reiniciar uGet después de modificarlo." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Modo de emparejamiento de los medios:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Condiciones de coincidencia" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Calidad:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Tipo:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Archivo" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Carpeta" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Ítem" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Valor" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copiar _todo" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Mostrar ventana" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Modo _fuera de línea" uget-2.2.2/po/he.po0000664000175000017500000011374013470304402010761 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Arthur Zamarin , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Hebrew (http://www.transifex.com/uget/uget/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "מתחבר..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "מעביר..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "נסה שוב" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "הורדה הושלמה" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "סיים" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "ניתן להשהיה" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "לא ניתן להשהיה" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "לא הצליח להתחבר לשרת." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "התקיה כשלה בהיווצרותה." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "יצירת קובץ נכשלה (שם לא מתאים או קובץ קיים)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "פתיחת קובץ נכשלה." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "מנהל הורדות" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "מצב" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "torrent חדש..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "קטגוריה חדשה" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "העתק - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "" #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "שגיאה" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "הודעה" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "בחר תיקיה" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "התחבר" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "מהירות העלאה מירבית:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "כתובת" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "גודל" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "נשאר" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "נוסף ב-" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "הורד" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "פורום תמיכה" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "כללי" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "גודל" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "כתובת" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "רגיש לאותיות גדולות" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "איבר" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "העתק הכל" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "הצג חלון" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "" uget-2.2.2/po/POTFILES.in0000664000175000017500000000121113470304401011566 00000000000000uget/pwmd.c uget/UgetApp.c uget/UgetEvent.c uget/UgetMedia-youtube.c uget/UgetPluginAria2.c uget/UgetPluginMedia.c uget/UgetPluginMega.c ui-gtk/UgtkAboutDialog.c ui-gtk/UgtkApp-main.c ui-gtk/UgtkApp-timeout.c ui-gtk/UgtkApp-ui.c ui-gtk/UgtkApp.c ui-gtk/UgtkBanner.c ui-gtk/UgtkBatchDialog.c ui-gtk/UgtkCategoryForm.c ui-gtk/UgtkConfirmDialog.c ui-gtk/UgtkDownloadForm.c ui-gtk/UgtkMenubar-ui.c ui-gtk/UgtkMenubar.c ui-gtk/UgtkNodeDialog.c ui-gtk/UgtkNodeView.c ui-gtk/UgtkProxyForm.c ui-gtk/UgtkScheduleForm.c ui-gtk/UgtkSelector.c ui-gtk/UgtkSequence.c ui-gtk/UgtkSettingDialog.c ui-gtk/UgtkSettingForm.c ui-gtk/UgtkSummary.c ui-gtk/UgtkTrayIcon.c uget-2.2.2/po/fa.po0000664000175000017500000014163213470304402010754 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ali 4129 , 2016 # amin hosseinzadeh fardnia , 2015 # Arash Kadkhodaei , 2016 # deadmarshal , 2014 # mhajiloo , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Ali 4129 \n" "Language-Team: Persian (http://www.transifex.com/uget/uget/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "همه دسته‌ها" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "در حال اتصال" #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "در حال ارسال" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "تلاش دوباره" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "پایان بارگیری" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "پایان یافت" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "با قابلیت از سر گرفتن" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "بدون قابلیت از سر گرفتن" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "پرونده خروجی قابل نامگذاری نیست." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "خطا در ارتباط با میزبان." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "ساخت پوشه به مشکل برخورد." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "پرونده قابل ساخت نیست (نام غیرمجاز یا تکراری)" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "پرونده قابل باز شدن نیست." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "اشکال در ساختن سوژه." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "منبع نادرست (تفاوت در حجم فایل)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "منابع تمام شد (هارد پرشده یا رَم کم است)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "بدون فایل خروجی." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "بدون تنظیمات خروجی" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "بیش از حد تلاش شده." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "طرح (پروتوکل) پشتیبانی نشده." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "پرونده پشتیبانی نشده." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "کوکی‌ها پیدا نشد." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "این ویدیو پاک شده است." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "در زمان دریافت اطلاعات ویدیو خطا رخ داد." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "در زمان اتصال به صفحه اینترنتی ویدیو خطا رخ داد." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "در این URL از YouTube ویدیو با این شناسه video_id پیدا نشد." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: خطایی نامشخص رخ داد." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: تایم آوت رخ داد." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: منبع یافت نشد." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "آریا2: تعدادی خطای «منبع یافت نشد» مشاهده کرد. گزینه‌ی --max-file-not-found را مشاهده کن" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "آریا2: سرعت خیلی کم بود" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "آریا2: مشکل شبکه رخ داد" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "آریا2: بارگیری‌های تمام نشده" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "منبع تمام شد." #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "آریا2: طول قطعه در فایل کنترلی .aria2 از یکی متفاوت بود." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 نیز همان فایل را دانلود می کرد." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "آریا2 اطلاعات هش شده تورنت یکسان بارگیری کرد." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: فایل از قبل وجود دارد. گزینه --allow-overwrite را نگاه کنید." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: نتوانست فایل موجود را باز کند." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "آریا2: نتوانست پرنده را بسازد یا پرنده موجود ناقص است " #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "آریا2: خطای I/O برای پرونده رخ داد." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "آریا2: تحلیل نام شکست خورد." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "آریا2: نتوانست سند متالینک را تجزیه کند." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "آریا2: دستور FTP شکست خورد." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "آریا2: عنوان پاسخ HTTP بد و یا غیر منتظره بود." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "تغییر مسیر بیش از حد" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "آریا2: مجوز HTTP شکست خورد." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "آریا2: نتوانست پرونده bencoded (معولاً پرونده تورنت) را تجزیه کند." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "آرای2: پرونده تورنت خراب شده بود و یا اطلاعات از دست رفته." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: URI مگنت اشتباه بود." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "آریا2: گزینه‌ی بد/ناشناخته داده شده یا آرگومان گزینه‌ی ناشناخته داده شده." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "آریا2: نتوانست سرور راه دور را به دست بگیرد." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "آریا2: می توان درخواست JSON-RPC را تجزیه کرد." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "بدون پاسخ. آیا aria2 خاموش است؟" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "آریا2: gid حذف شد." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "مشکلی در دریافت لینک وجود دارد." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "رسانه‌ی همسان وجود ندارد." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "مدیریت دانلودها" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "توضیحات مترجم" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "مؤسس uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "مدیر پروژه uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "کارها" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "دانلود تازه از کلیپبورد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "دانلود تازه" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "کلیپبورد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "خط فرمان" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "ارور رخ داد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "هنگام دانلود ارور رخ داد." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "دانلود در حال شروع" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "در حال شروع صف دانلود" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "پایان دانلود" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "تمام دانلودها پایان یافتند." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "وضعیت" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "دسته" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "ایجاد دانلود جدبد" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "ـدانلود تازه" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "ـدسته تازه..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "دانلود گروهی جدید از کلیپبورد..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "دانلود گروهی جدید" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "تورنت تازه..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "ابرپیوند تازه" #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "همه تنظیمات را ذخیره کن" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "دانلود انتخاب شده را قابل اجرا تنظیم کن" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "دانلود انتخاب شده را نگه دار" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "مشخصات دانلود انتخاب شده را تنظیم کن" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "دانلود انتخاب شده را ببر بالا" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "دانلود انتخاب شده را ببر پایین" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "دانلود انتخاب شده را بالای همه ببر." #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "دانلود انتخاب شده را به پایین همه ببر" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "دسته‌ی جدید" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "کپی -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "مشخصات رده" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "مشخصات دانلود" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "تورنت تازه" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "ابرپیوند تازه" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "گشودن فایل تورنت" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "فایل‌های تورنت (torrent.*)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "باز کردن فایل ابرپیوند" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "ذخیره‌سازی دسته‌بندی فایل شکست خورد." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "بارکردن دسته‌بندی فایل شکست خورد." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "دسته‌بندی پرونده را ذخیره کن." #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "دسته‌بندی پرونده را باز کن." #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "فایل‌های JSON" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "لینک " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "عکس " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "فایل متنی" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "وارد کردن آدرس ها از فایل HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "وارد کردن URLsها از فایل متنی" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "فایل متنی" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "URLها را به پرونده متنی صادر کن" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "دنباله گروهی sequence" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "هیچ آدرسی در کلیپبورد پیدا نشد." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "همه URLها وجود داشته است." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "دانلود گروهی از کلیپبورد" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "تازه" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "خطا" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "پیام" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d مورد انتخاب شده" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "توجه کنید کاربران uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "ما یک درایو کمک مالی برای ادامه توسعه uGet راه انداخته ایم، لطفا کلیک کنید" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "اینجا" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "لطفا این ارزیابی کوچک را به خاطر uGet پر کنید." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "برای ارزیابی اینجا را بزنید" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "نام رده:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "دانلودهای فعال:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "ظرفیت پایان یافته ها:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "ظرفیت بازیافتی ها:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "شرایط تطبیق URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "میزبان همسان:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "طرح‌های همسان:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "انواع همسان:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "واقعا خارج شوید؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "آیا مطمٔنید که میخواهید خارج شوید؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "آیا واقعا فایل ها حذف شوند؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "آیا مطمٔنید که میخواهید فایلها را پاک کنید؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "آیا واقعا رده پاک شود؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "آیا واقعا میخواهید که این رده پاک شود؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "دیگر از من نپرس" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "آینه ها:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "فایل:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "پوشه را برگزینید" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "پوشه:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "مرجع:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "ـبیشترین تعداد اتصال" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "قابل اجرا" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "توقف" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "ورود" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "کاربر:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "پسورد:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "فایل کوکی:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "انتخاب فایل کوکی" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "فایل پست:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "انتخاب فایل پست" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "ارگان کاربر:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "حداکثر تلاشها:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "تعداد" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "فاصله تلاشها:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "به ثانیه" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "بیشترین سرعت آپلود" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "بیشترین سرعت دانلود" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "بازیابی مُهر زمان" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_فایل" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "دانلود دسته جمعی" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "دانلود دسته جمعی از کلیپبورد" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "دنباله URL گروهی" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "وارد کردن از فایل متن (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "وارد کردن از فایل اچ تی ام ال(.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "ریختن به فایل متن (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "دسته‌ی باز..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "دخیره‌ی دسته به عنوان..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "تمام تنظیمات را ذخیره کن" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "حالت آفلاین" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "ویرایش" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "زیرنظر داشتن کلیپبورد" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "کلیپ‌برد بی صدا کار می‌کند" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "کامند لاین بی صدا کار می‌کند" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "از URl موجود صرف نظر کن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "تکمیل خودکار اقدامات" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "غیرفعال کن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "هایبرنیت" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "معلق" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "خاموش کردن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "ریبوت کردن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "دستی" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "تنظیمات را به یاد بسپار" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "راهنما" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "ـتنظیمات..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "نشان دادن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "بخش ابزارها" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "بخش وضعیت" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "خلاصه" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "موارد خلاصه" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "نام" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "پوشه" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "ـپیام" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "ردیف های دانلود" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "پایان" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "حجم" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "درصد '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "مانده" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "ـچپ" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "سرعت" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "سرعت آپلود" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "آپلود شده" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "نرخ" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "تلاش دوباره" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "افزوده شده در" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "پایان یافته در" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "رده بندی" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "رده تازه..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "پاک کردن رده" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "دانلود" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "پاک کردن ورودی" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "پاک کردن ورودی و پرونده" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "پوشه دربرگیرنده را باز کن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "شروع با زور" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "بردن به" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "اولویت" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "بالا" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "معمولی" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "پایین" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "دریافت راهنمایی آنلاین" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "مستندات" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "انجمن پشتیبانی" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "ارسال بازخورد" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "خبر دادن باگ" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "شورتکات های کیبورد" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "گشتن برای بروزرسانی" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "تنظیمات" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "اشکال در اجرای برنامه ی پیشفرض برای فایل '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - این پوشه وجود ندارد." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URl از پیش وجود داشت" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "این URl از پیش وجود داشت، آیا مطمئنید میخواهید ادامه دهید؟" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "اصلی" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "پیشرفته" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "تنظیمات دسته" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "پیشفرض برای دانلود 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "پیشفرض 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "بدون نام" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "متوقف شده" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "در حال آپلود" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "پایان یافته" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "بازیابی شده" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "در حال صف کشی" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "فعال" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "تمام وضعیت ها" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "نام" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "پایان" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "سایز" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "سپری شده" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "مانده" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URl" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "مقدار" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "پروکسی:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "استفاده نکن" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "پیشفرض" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "میزبان:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "درگاه:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "سوکت:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "مشخصه های سوکت:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "المنت" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "دوشنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "سه شنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "چهار شنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "پنج شنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "جمعه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "شنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "یکشنبه" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "فعال سازی زمان بند" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "خاموش کن" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "توقف تمام کارها" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "عادی" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "اجرای معمولی کارها" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "همه" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "هیچ" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "انتخاب بر اساس فیلتر" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "نشانه گذاری URLها با میزبان و پسوند فایلها" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "این تمام انتخاب های URLها را برمیگرداند." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "میزبان" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "پسوند فایل" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "مرجع ابرمتن پایه" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "انتخاب همه" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "انتخاب هیچکدام" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "انتخاب بر اساس فیلتر" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "برای نمونه" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "از:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "به:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "شماره ها:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "از:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "حساس به بزرگ و کوچکی" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "کاراکترهای wildcard(*) در ورودی URL نیستند." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL معتبر نمی‌باشد" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "هیچ کاراکتری در ورودی 'از' یا 'به' نبود." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "پیش نمایش" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "رابط کاربری" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "پهنای باند" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "زمان بند" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "افزونه" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "بقیه" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "زیر نظرگرفتن کلیپبورد" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "حالت ساکت" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "فهرست پیشفرض رده" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "اضافه کردن به Nمین رده اگر رده ای مناسب نبود." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "بررسی URL از وب‌سایت مدیا " #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "برای مدل فایل های تعیین شده کلیپبورد را زیر نظر بگیر:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "شما میتوانید انواع را با کاراکتر |‌ جداکنید." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "میتوانید از عبارت های با قاعده استفاده کنید." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "تاییدیه" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "نشان دادن دیالوگ تایید هنگام خروج" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "گرفتن تایید هنگام پاک کردن پرونده ها" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "System Tray" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "همیشه آیکن tray را نشان بده" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "هنگام شروع به tray جمع کن" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "بستن در Tray هنگام بستن پنجره" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "استفاده از Ubuntu App Indicator" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "هنگام شروع حالت آفلاین را فعال کن" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "آگاه ساز شروع دانلود" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "پخش صدا هنگام پایان دانلود" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "نمایش آیکون‌های بزرگ" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "این همه افزونه تأثیر می‌گذارد." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "محدودیت جهانی سرعت" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "سرعت بیشینه ی آپلود" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "سرعت بیشینه ی دانلود" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "کارهای خودکار هنگام پایان" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "فرمان سفارشی:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "فرمان سفارشی اگر خطا رخ داد:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "دخیره خودکار" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "دوره زمانی:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "دقیقه" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "تنظیمات خط فرمان" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "به طور پیشفرض از حالت بیصدا استفاده کن" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "درخواست مطابقت افزونه:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "گزینه‌های افزونه‌ی آریا2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "علامتِ محرمانه‌ی مجوز RPC " #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "محدودیت سرعت سراسری فقط برای آریا2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "اجرای aria2 در شروع" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "خاموش کردن aria2 در خروج" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "راه‌اندازی آریا2 روی دستگاه محلی" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "مسیر" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "آرگمانها" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "شما باید uGet را پس از اصلاح راه اندازی مجدد کنید." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "وضعیت مطابقت مدیا:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "شرایط تطبیق:" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "کیفیت:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "نوع:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "فایل" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "پوشه" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "آیتم" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "مقدار" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "کپی همه" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "نمایش پنجره" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "حالت آفلاین" uget-2.2.2/po/ca.po0000664000175000017500000013247513470304401010755 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dsabadell , 2015 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Catalan (http://www.transifex.com/uget/uget/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Totes les categories" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Connectant..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmetent..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Torna a provar" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "La descàrrega ha estat completada" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Ha finalitzat" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Reprèn la baixada" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "No es pot reprendre" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "L'arxiu de sortida no pot ser reanomenat." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "S'ha produït un error al connectar amb l'amfitrió." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "No es pot crear la carpeta." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "No es pot crear el fitxer (ja existeix o no s'admet el nom)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "El fitxer no es pot obrir." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "No es pot crear un fil." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "El fitxer font no és correcte (té una grandària diferent)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Hem fet curt de recursos (el disc està ple o hem esgotat la memòria)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Manca el fitxer de sortida." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Manca un paràmetre de sortida." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Ho hem intentat massa vegades." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "No s'admet el procés (o protocol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "No s'admet el tipus de fitxer." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: s'ha produït un error desconegut." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: el temps d'espera s'ha esgotat." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: no s'ha trobat el recurs." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 ha arribat al límit d'errors 'recurs no trobat' de l'opció --max-file-not-found." #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: la velocitat de baixada és massa lenta." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: s'ha produït un error de xarxa." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: no s'han enllestit les descàrregues." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Manquen recursos." #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: la mida del fragment és diferent de la consignada al fitxer de control .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2: ja has descarregat aquest fitxer." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 estàs descarregant informació duplicada del torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: el fitxer ja existeix. Fixa't en l'opció --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: no es pot obrir un fitxer existent." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: no s'ha pogut crear un nou fitxer o truncar-ne un d'existent." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: s'ha produït un error d'I/O d'un fitxer " #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: la resolució de nom ha fallat." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: no s'ha pogut gestionar un fitxer Metalink." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: l'ordre de FTP ha fallat." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: la capçalera de resposta HTTP és dolenta o desconeguda." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "S'ha redireccionat massa vegades." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: ha fallat l'autorització HTTP." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: no s'ha pogut analitzar un fitxer .torrent." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: el fitxer torrent és defectuós o conté informació incompleta." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: l'URI del fitxer magnet és dolent." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: l'opció donada és dolenta o incompleta; o bé l'opció té un argument desconegut. " #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: el servidor remot no pot gestionar la petició." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: no es pot gestionar la petició JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "aria2 no respon. Comprova que estigui actiu." #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: s'ha eliminat l'identificador de grup." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Gestor de descàrregues" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "David Sabadell i Ximenes " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Fundador d'uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Gestor de Projecte d'uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "tasques" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nova des del porta-retalls" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nova descàrrega" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Porta-retalls" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Línia d'ordres" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "S'ha produït un error" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "S'ha produït un error mentre descarregava." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "S'està iniciant la baixada" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Comença la descàrrega de la cua." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "S'ha enllestit la descàrrega." #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "S'ha enllestit la cua de descàrregues." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Estat" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Categoria" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Crea una nova descàrrega" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nova _descàrrega" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nova _categoria..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Nou _lot del porta-retalls..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nova _seqüència d'URLs... " #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nou torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nou metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Desar tots els paràmetres" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Defineix les descàrregues seleccionades com actives" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Posa les descàrregues seleccionades en espera" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Defineixles propietats de les descàrregues seleccionades" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Mou les descàrregues seleccionades amunt" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Mou les descàrregues seleccionades avall" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Posa les descàrregues seleccionades dalt de tot" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Posa les descàrregues seleccionades sota de tot" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nova categoria" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Copia -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Propietats de la categoria" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Propietats de la descàrrega" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nou torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nou metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Obre un fitxer torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Obre un fitxer metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "No s'ha pogut desar la categoria." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "No s'ha pogut carregar la categoria." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Desar el fitxer de categoria" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Obrir un fitxer de categoria" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Enllaç " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Imatge " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Fitxer de text" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importa URLs des d'un fitxer HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importa URLs des d'un fitxer de text" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exporta URLs a un fitxer de text" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Lot de seqüència d'URLs" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "No s'ha trobat cap URL al porta-retalls." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Totes les URL existeixen." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Lot del porta-retalls" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nova" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Error" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Missatge" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d ítems seleccionats" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Atenció usuaris d'uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "hem endegat una campanya de donació per al futur desenvolupament d'uGet: si us plau, cliqueu" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "AQUÍ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "Empleneu aquesta breu enquesta d'ús per millorar uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "Clica aquí per respondre l'enquesta" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nom de la categoria:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "_Descàrregues actives:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Capacitat de les finalitzades:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Capacitat de la paperera:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Les condicions de coincidència d'URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Amfitrions coincidents:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Esquemes/processos coincidents:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Tipus coincidents:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Vols sortir del programa?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Estàs segur que vols sortir?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Vols esborrar els fitxers?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Estàs segur que vols esborrar els fitxers?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vols esborrar la categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Esteu segur que vols esborrar la categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "No m'ho demanis més" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Servidors alternatius:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fitxer:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Selecciona una carpeta" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Carpeta:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Referència:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "Nombre _màxim de connexions simultànies:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Activa" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ausa" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Inicia sessió" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Usuari:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Contrasenya:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Galeta:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Selecciona una galeta" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Fitxer 'post':" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Seleccioneu el fitxer 'post'" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Agent d'usuari:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Núm. màx. de temptatives:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "contador" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Retard en intentar-ho:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "segons" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Velocitat màx. de pujada:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Velocitat màx. de baixada:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Data i hora actuals" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fitxer" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Lot de descàrregues" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Lot del _porta-retalls..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Lot de seqüència d'_URLs..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importa un fitxer de _text (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importa un fitxer _HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exporta a un fitxer de _text (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "Obre categoria" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "De_sa la categoria com..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Des_a els paràmetres" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Mode fora de línia" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Edita" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitoreja el porta-retalls" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Porta-retalls silenciós" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Línia d'ordres silenciosa" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Evita URI existent" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Aplica els paràmetres de baixada més nous" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Accions autom. de compleció" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Inhabilita" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hiberna" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Suspèn" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Atura l'equip" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Reinicia l'equip" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Personalitza" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Recorda els paràmetres" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "A_juda" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Paràmetres..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Visualitza" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Barra d'eines" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barra d'estat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sumari" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Ítems del sumari" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nom" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Carpeta" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Missatge" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Columnes de descàrrega" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Complet" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Mida" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Percentatge '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Transcorregut" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Pendent" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Velocitat" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Límit de velocitat" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Transferit" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Relació" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Reintenta" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Afegit en" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Completat en" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Categoria" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nova categoria..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Esborra la categoria" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Descarrega" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "Es_borra aquesta entrada" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Esborra el _fitxer i les dades" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Obre la _carpeta contenidora" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Força'l a engegar" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Mou a" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "Alta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Baixa" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Aconsegueix ajuda en línia" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Documentació" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Fòrum de suport" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Volem conèixer el teu parer" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Informa d'un error" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Comprova si hi ha actualitzacions" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Paràmetres" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "No es pot executar l'aplicació predefinida per al fitxer '%s'" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Aquesta carpeta no existeix." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "L'URI ja existeix." #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Aquesta URI ja existeix. Estàs segur que vol continuar?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "General" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avançat" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Paràmetres de categoria" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Predeterminada per a nova descàrrega 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Predeterminada 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "sense nom" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "En pausa" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "S'està transferint" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Completades" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Descartades" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Posant en cua" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Actives" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Tots els estats" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nom" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Complet" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Mida" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Transcorregut" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Pendent" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Quantitat" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Servidor intermediari:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "No l'empris" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Predeterminada" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Amfitrió:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Sòcol:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Arguments del sòcul:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Dll" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Dm" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Dc" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Dj" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Dv" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Ds" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Dg" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Habilita el temporitzador" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Desactiva" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- atura totes les tasques" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- executa les tasques amb normalitat" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Tot" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Cap" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Selecciona per filtrar" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Selecciona URLs per servidor I per extensió de fitxer" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Això netejarà tota selecció d'URLs." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Amfitrió" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Extensió de fitxer" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Referència base d'hipertext" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Seleccion_a-les totes" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "No e_n seleccionis cap" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Selecciona per filtre..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "p.ex." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_De:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "A:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "dígits:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_De" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "distingeix majúsc. i minúsc." #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "No empreu el caràcter comodí (*) en el camp URL" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "L'URL no és vàlida." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Cap caràcter en els camps 'De' o 'A'" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Previsualització" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interfície d'usuari" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Ample de banda" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Temporitzador" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Connector" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Altres" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Habilita el monitor del porta-retalls" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Mode silenciós" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Índex predeterminat de categoria" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Si no coincideix amb cap categoria, afegeix a la Na categoria." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "_Cerca aquests tipus de fitxer al porta-retalls " #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Separa els tipus de fitxer amb el caràcter '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Aquí pots emprar expressions regulars." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Confirma" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Demana confirmació per sortir" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Confirma l'eliminació de fitxers" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Safata del sistema" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Sempre mostra icona a la safata" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimitza a la safata en arrencar" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Minimitza a la safata al tancar la finestra" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Activa l'extensió d'integració amb l'Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Habilita el mode fora de línia en arrencar" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notificació d'inici de descàrrega" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Fés un so quan la descàrrega acabi" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Això afectarà a tots els connectors." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Límit global de velocitat" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Velocitat màx. de pujada" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Velocitat màx. de baixada" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Accions autom. de compleció" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Ordre personalitzada:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Ordre predeterminada si s'escau un error:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "Desa _automàticament" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intèrval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minuts" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Paràmetres de línia d'ordres" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Empra el mode silenciós" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Ordre de coincidència dels connectors:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Opcions dels connectors d'aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Autorització secreta de RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Límit de velocitat global només per aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Executa l'aria2 en arrencar" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Atura l'aria2 en sortir" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Arrenca aria2 en el dispositiu local" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Camí" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Arguments :" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Cal reiniciar uGet en modificar-los." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fitxer" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Carpeta" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Element" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Valor" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copia-ho _tot" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Mostra la finestra" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Mode fora de línia" uget-2.2.2/po/sr.po0000664000175000017500000014537013470304402011015 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # markosm , 2016 # markosm , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: markosm \n" "Language-Team: Serbian (http://www.transifex.com/uget/uget/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Менаџер лозинки: uget\n\nТоком покушаја SSH повезивања за %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n\nДа ли би желели да ову конекцију третирате као поуздана за сада и будућа повезивања додавањем %s's кључа од познатог домаћина?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Све категорије" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Повезивање..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Шаљем..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Покушај поново" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Преузимање завршено" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Завршено" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Обновљиво" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Није обновљиво" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Излазни фајл не може бити преименован." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "немогуће повезивање са рачунаром." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Фасцикла не може бити креирана." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Фајл не може бити креиран (погрешно име или фајл већ постоји)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Фајл се не може отворити" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Није могуће створити нит." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Неисправан извор (различита величина фајла)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Премало ресурса (диск је пун или нема довољно меморије)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Нема излазног фајла." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Нема излазне поставке." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Превише поновних покушаја." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Неподржана шема (протокол)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Неподржан фајл." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "фајл поста није пронађен." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "фајл колачића није пронађен." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Овај видео је уклоњен." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Грешка код прибављања информација о видеу." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Грешка код прибављања странице са видеом." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Није пронађен video_id на YouTube адреси." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: догодила се непозната грешка." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: временска пауза." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: ресурси нису пронађени." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 пријављује одређени број 'resource not found' грешки. Погледај --max-file-not-found опцију" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: брзина је врло спора." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: догодио се проблем са мрежом." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: незавршена преузимања." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Ван ресурса" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: дужина комада је различита од оне у .aria2 контролном фајлу." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 је преузела исти фајл." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 је преузела исти торент инфо." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: фајл већ постоји. Погледај --allow-overwrite опцију." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: не могу отворити постојећи фајл." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: не могу креирати нови фајл или скратити постојећи." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: догодила се I/O грешка." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: неуспело именовање резолуције." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: није могуће анализирати Металинк документ." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: ФТП команда није успела." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP одговор је лош или неочекива." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Превише преусмеравања." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP ауторизација није успела." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: не могу анализирати фајл (обично .torrent фајл)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: торент фајл је оштећен или недостају информације." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Магнет URI је био лош." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: дата је лоша/непозната опција." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: удаљени сервер није могао да обради захтев." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: није могуће анализирати JSON-RPC захтев." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Без одговора. Да ли је aria2 угашен?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: гид је уклоњен." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Неуспело добављање медијског линка." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Без подударних медија." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Менаџер преузимања" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "заслуге преводилаца" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet оснивач:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet менаџер пројекта: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "задаци" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Ново из клипборда" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Ново преузимање" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Клипборд" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Командна линија" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Догодила се грешка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Догодила се грешка код преузимања." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Преузимање започиње" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Покретање преузимања на чекању" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Преузимање завршено" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Сва преузимања са пописа чекања су завршена." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Стање" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Категорија" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Креирај ново преузимање" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Ново _преузимање..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Нова _категорија..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Ново из _клипборда..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Нови _URL редослед линкова..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Нови торент..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Нови мета-линк..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Сачувај сва подешавања" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Покрени одабрано преузимање" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Паузирај одабрано преузимање" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Подеси својства одабраног преузимања" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Помери одабрано преузимање горе" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Помери одабрано преузимање доле" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Помери одабрано преузимање на врх" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Помери одабрано преузимање на дно" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Нова категорија" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Копирај - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Својства категорије" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Својства преузимања" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Нови торент" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Нови мета-линк" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Отвори торент фајл" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Торент фајл (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Отвори мета-линк фајл" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Неуспело чување фајла категорије" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Неуспело учитавање категорије фајла." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Сачувај фајл категорије" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Отвори фајл категорије" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON фајл (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Линк " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Слика " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Текстуални фајл" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Увези URL-ове из HTML фајла" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML фајл (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Увези URL-ове из текстуалног фајла" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Чист текстуални фајл" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Извези УРЛ у текстуални фајл" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL Редослед линкова" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Без URL-а пронађених у клипборду." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Све УРЛ адресе су постојеће." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Из клипборда" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Ново" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Грешка" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Порука" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Одабрано %d ставки" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Пажња uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "покренули смо прикупљање донација за будући развој uGet-а, молим кликните " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ОВДЕ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "молимо попуните ову кратку корисничку анкету за uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "кликните овде за почетак анкете" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Име _категорије:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Активна _преузимања:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Капацитет завршеног:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Капацитет обрисаног:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "УРИ подударајући услови" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Подударени _хостови:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Подударене _шеме:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Подударени _режими:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Стварно желите изаћи?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Да ли сте сигурни да желите изаћи?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Стварно желите обрисати фајлове?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Да ли сте сигурни да желите обрисати фајлове?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Стварно желите обрисати категорију?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Да ли сте сигурни да желите обрисати категорију?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Не питај ме поново" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Сервери:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Фајл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Одабери фасциклу:" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Фасцикла:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Извор транзиције:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Макс конекција:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Покрени" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "П_ауза" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Пријава" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Корисник:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Лозинка:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Фајл колачића:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Одабери фајл колачића" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Поштански фајл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Одабери поштански фајл" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Кориснички заступник" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Ограничење _покушаја:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "покушаја" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Одгађање _покушаја:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунди" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Максимална брзина отпремања:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Максимална брзина преузимања:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Прихвати временске ознаке" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Фајл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Пакетна преузимања" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Из клипборда..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL редослед линкова..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Увоз текстуалног фајла (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Увоз HTML фајла (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Извоз у текстуалном фајлу (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Отвори категорију..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Сачувај категорију као..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Сачувај _сва подешавања" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Режим ван мреже" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Уреди" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Клипборд _монитор" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Клипборд ради у позадини" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Командна линија ради у позадини" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Прескочи постојећи URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Примени недавне поставке преузимања" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Завршене _ауто-акције" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Онемогући" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Успавај" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Суспендуј" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Напусти" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Поново покрени" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Прилагођено" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Запамти подешавања" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Помоћ" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Поставке..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Преглед" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Трака алата" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Статусна трака" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Сажетак" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Ставке _сажетка" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Име" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Фасцикла" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Порука" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Колоне _преузимања" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Завршено" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Величина" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Проценат '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Прошло времена" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Лево" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Брзина" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Брзина отпреме" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Отпремљено" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Однос" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Покушај поново" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Додато" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Завршено" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Категорија" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Нова категорија..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Обриши категорију" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Преузимање" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Обриши ставку" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Обриши ставку и _фајл" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Отвори _садржајну фасциклу" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Присили покретање" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Премести у" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Приоритет" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Висок" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Нормалан" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Низак" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Потражите помоћ на мрежи" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Документација" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Форум за подршку" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Пошаљите повратну информацију" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Пријавите грешке" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Пречице тастатуре" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Проверите ажурирања" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Поставке" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Немогуће покретање подразумеване апликација за фајл '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Ова фасцикла не постоји." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI постоји" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Овај URI постоји, да ли желите да наставите?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Опште" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Напредно" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Поставке категорије" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Подразумевано за ново преузимање 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Подразумевано 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "безимено" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Паузирано" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Отпремање" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Завршено" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Обрисано" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "На чекању" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Активно" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Сви статуси" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Име" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Завршено" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Величина" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Покренуто" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Завршено" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Количина" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Прокси:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Не користи" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Подразумевано" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Рачунар:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Утичница:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Утичница args:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Елемент:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Пон" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Уто" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Сре" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Чет" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Пет" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Суб" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Нед" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Омогући распоред" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Искључи" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- заустави све задатке" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Нормално" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- нормално покрени задатак" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Све" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Непознато" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Означи према филтеру" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Означи URL-ове према рачунару и врсти фајла." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Ово ће ресетовати све означене URL-ове." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Рачунар" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Врста фајла" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Основна хипертекст препорука" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Означи _све" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Означи _ништа" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Означи према филтеру..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "нпр." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Од:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "На:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "бројеви:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "О_д:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "мала-велика слова" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Без заменских(*) карактера у URL уносу." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL није исправан." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Нема знакова у 'Од' или 'На' уносу." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Преглед" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Корисничко сучеље" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Проток" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Распоред" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Додатак" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Медијски сајт" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Остало" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Омогући клипборд монитор" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Тихи режим" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Подразумевани индекс категорије" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Додавање у Nth категорију ако се не подударају." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Монитор УРЛ од медијског сајта" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Монитор клипборда за одређени тип фајла:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Раздвој врсте фајлова са знаком '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Можете користити уобичајене изразе овде." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Потврда" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Прикажи дијалог потврде на изласку" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Потврди при брисању фајлова" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Системска касета" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Увек прикажи икону у системској касети" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Смањи у системску касету по покретању" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Спусти у системску касету кад затвориш прозор" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Користи Ubuntu индикатор" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Омогући на почетку режим ван мреже" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Обавештење о почетку преузимања" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Звук када се заврши преузимање" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Прикажи већу икону" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Ово ће утицати на све додатке." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Опште ограничење брзине" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Макс брзина отпремања" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Макс брзина преузимања" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Завршене ауто-акције" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Прилагођена команда:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Прилагођена команда ако се догоди грешка:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Аутоматско чување" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Интервал:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "минута" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Поставке командне линије" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Користи '--quiet' као подразумевано" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Поредак повезивања:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 опције повезивања" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC тајно питање за ауторизацију" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Опште ограничење брзине само за aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Покрени aria2 на почетку" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Искључи aria2 на излазу" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Покрени aria2 на локалном уређају" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Путања" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Аргументи" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Морате поново покренути uGet након измена." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Режим медијског подударања:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Подударање услова" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Квалитет:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Тип:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Фајл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Фасцикла" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Ставка" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Вредност" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Копирај _све" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Прикажи прозор" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Режим ван мреже" uget-2.2.2/po/pt_BR.po0000664000175000017500000013412013470304402011366 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # carlo giusepe tadei valente sasaki , 2014,2016 # Rafael Fontenelle , 2013 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: carlo giusepe tadei valente sasaki \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/uget/uget/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Serviço de gerenciamento de senhas: uget\n\nHouve um problema na conexão SSH com %s : sua hostkey não foi encontrada no arquivo de hospedeiros conhecidos e confiáveis.\n\nGostaria de adicionar a hostkey de %s ao arquivo de hospedeiros conhecidos e definir essa conexão como confiável agora e futuramente?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Todas as categorias" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Conectando..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmitindo..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Tentar novamente" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Download concluído" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Finalizado" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Resumível" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Não resumível" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "O arquivo de saída não pode ser renomeado." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "não foi possível conectar ao host." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "A pasta não pôde ser criada." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "O arquivo não pôde ser criado (nome de arquivo inválido ou arquivo existe)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "O arquivo não pôde ser aberto." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Não foi possível criar a tarefa." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Fonte incorreta (tamanho do arquivo diferente)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Recursos insuficientes (disco cheio ou sem memória)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nenhum arquivo de saída." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nenhuma configuração de saída." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Número excessivo de tentativas." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Sem suporte ao esquema (protocolo)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Arquivo sem suporte." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "arquivo enviado não encontrado." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "arquivo de cookie não encontrado." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Esse vídeo foi removido." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Erro ao obter informações do vídeo." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Erro ao obter a página do vídeo." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Nenhuma video_id encontrada na URL do YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: ocorreu um erro desconhecido." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: tempo excedido." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: recurso não encontrado." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 viu o erro de número específico de 'recurso não encontrado'. Veja --max-file-not-found option" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: velocidade muito baixa." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: ocorreu um problema na rede." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: downloads não encerrados." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Sem recursos" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: comprimento da peça diferente do arquivo de controle .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "O aria2 estava baixando o mesmo arquivo." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "O aria2 estava baixando o mesmo info hash de torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: o arquivo já existe. Veja a opção --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: não foi possível abrir o arquivo existente." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: não foi possível criar um novo arquivo ou mesclar o arquivo existente." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: erro de I/O de arquivo." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: falha na resolução de nome." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: não foi possível analisar o documento Metalink." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: falha no comando FTP." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: cabeçalho de resposta HTTP errado ou inesperado." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Número excessivo de redirecionamentos." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: falha na autorização de HTTP." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: não foi possível analisar o arquivo bencoded (geralmente arquivo .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: arquivo torrent corrompido ou com informação ausente." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: URI Magnet errada." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: foi dada uma opção errada/não reconhecida ou um argumento inesperado." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: o servidor remoto foi incapaz de manipular a requisição." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: não foi possível analisar a requisição JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Sem resposta. O aria2 está desligado?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: o gid foi removido." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Falha ao obter o link da mídia." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Nenhuma mídia correspondente." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Gerenciador de downloads" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Rafael Ferreira" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Criador do uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Gerente de Projeto do uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "tarefas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Novo da área de transferência" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Novo download" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Área de transferência" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Linha de comando" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Ocorreu um erro" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Ocorreu um erro ao baixar." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Download começando" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Começando a fila de downloads." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Download concluído" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Todos os downloads da fila foram concluídos." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Categoria" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Cria novo download" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Novo _download..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nova _categoria..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Novo _lote da área de transferência..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Novo lote de sequência de _URL..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Novo torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Novo metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Salvar todas as configurações" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Define o download selecionado como continuável" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Define o download selecionado como pausado" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Define as propriedades do download selecionado" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Move o download selecionado para cima" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Move o download selecionado para baixo" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Move o download selecionado para o topo" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Move o download selecionado para canto inferior" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nova categoria" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Cópia -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Propriedades da categoria" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Propriedades de download" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Novo torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Novo metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Abrir arquivo torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Arquivo torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Abrir arquivo metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Falha ao salvar a categoria de arquivo." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Falha ao carregar a categoria de arquivo." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Salvar categoria de arquivo" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Abrir categoria de arquivo" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Arquivo JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Link " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Imagem " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Arquivo texto" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importar URLs de arquivo HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Arquivo HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importar URLs de arquivo texto" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Arquivo de texto simples" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exportar URLs para arquivo de texto" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Lote de sequência de URLs" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nenhuma URL encontrada na área de transferência." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Todas as URLs existiram." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Lote da área de transferência" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Novo" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Erro" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Mensagem" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Selecionados %d itens" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Atenção usuários do uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "nós estamos fazendo uma Arrecadação de Doações para o Desenvolvimento Futuro do uGet, por favor clique" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "AQUI" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "por favor, preencha esta rápida Pesquisa de Usuário do uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "clique aqui para iniciar a pesquisa" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nome da categoria:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "_Downloads ativos:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Capacidade de finalizados:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Capacidade de reciclados:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Condições de correspondência de URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "_Hosts correspondentes:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "_Esquemas correspondentes:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "_Tipos correspondentes:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Realmente sair?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Tem certeza que deseja sair?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Realmente excluir arquivos?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Tem certeza que deseja excluir os arquivos?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Realmente excluir a categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Tem certeza que deseja excluir a categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Não me perguntar novamente" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Espelhos:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Arquivo:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Selecione uma pasta" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Pasta:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Referência:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Máximo de conexões:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Continuável" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ausar" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Login" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Usuário:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Senha:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Arquivo de cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Selecione um arquivo de cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Arquivo de post:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Selecione um arquivo de Post" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Agente de usuário:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Limite de tentativas:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "vezes" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Atraso entre tentativas:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "segundos" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Velocidade máxima de upload:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Velocidade máxima de download:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Obter marca de tempo " #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Arquivo" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Downloads em _lote" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Lote da área de _transferência..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Lote de sequência de _URL..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importação de arquivo de _texto (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importação de arquivo _HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportar para arquivo de texto (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Abrir categoria..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Salvar categoria como..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Salvar _todas as configurações" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Modo offline" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Editar" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitor de área de transferência" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Monitor da área de transferência trabalha silenciosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Linha de comando trabalha silenciosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Pular URI existente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Aplica configurações de download recentes" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Ações automáticas de acabamento" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Desabilitar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Suspender" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Desligar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Reiniciar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Personalizado" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Lembrar configuração" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "Aj_uda" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Configurações..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Ver" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Barra de ferramentas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barra de status" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sumário" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Itens do sumário" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nome" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Pasta" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Mensagem" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Colunas de download" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Concluído" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Tamanho" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Porcentagem \"%\"" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "Tra_nscorrido" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Restante" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Velocidade" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Veloc. Upload" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Enviado" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Proporção" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "Tenta_r novamente" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Adicionado em" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Concluído em" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Categoria" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nova categoria..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Excluir categoria" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Baixar" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Deletar entrada" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Deletar entrada e _arquivo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Abrir pasta de _conteúdo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Forçar início" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Mover para" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioridade" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Alta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Baixa" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Obtenha ajuda on-line" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Documentação" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Fórum de suporte" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Enviar feedback" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Relatar um erro" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Atalhos de teclado" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Verificar por atualizações" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Configurações" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Não foi possível iniciar o aplicativo padrão para o arquivo \"%s\"." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "\"%s\" - Esta pasta não existe." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "A URI existe" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Essa URI já existe, tem certeza que quer continuar?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Geral" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avançado" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Configurações da categoria" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Padrão para novos downloads 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Padrão 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "sem nome" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pausado" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Enviando" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Concluído" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Reciclado" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Enfileramento" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Ativo" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Todos os estados" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nome" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Concluído" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Tamanho" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Transcorrido" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Restante" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Qualidade" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Não usar" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Padrão" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Porta:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Args. de socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elemento:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Seg" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Ter" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Qua" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Qui" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Sex" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sáb" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Dom" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Habilitar agendador" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Desligar" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- para todas as tarefas" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- executa a tarefa normalmente" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Todos" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nenhum" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Marcar por filtro" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Marcar URLs por host E por extensão do nome do arquivo." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Isso vai redefinir todos marcadores de URLs." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Ext. de arquivo" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Referência em base hipertexto" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Marcar _todos" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Marcar _nenhum" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Marcar por filtro..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "ex.:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_De:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Para:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "dígitos:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_De:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "diferenciar maiúsculo/minúsculo" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Nenhum caractere coringa (*) na entrada de URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL não válida." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Nenhum caractere nas entradas \"De\" ou \"Para\"." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Visualizar" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interface de usuário" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Largura de banda" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Agendador" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plug-in" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Site de mídias" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Outros" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Habilitar monitor da área de transferência" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "Modo _silencioso" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Índice de categoria padrão" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Adicionar à N categoria se não houver categoria correspondente." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Monitorar URL do site de mídias" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorar a área de transferência para os seguintes tipos de arquivo:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Separe os tipos com o caractere \"|\"." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Você pode usar expressões regulares aqui." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Confirmação" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Exibir diálogo de confirmação ao sair" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Confirma ao excluir arquivos" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Barra do sistema" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Sempre mostra o ícone na área de notificação" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimiza para a área de notificação ao inicializar" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Ir para a barra ao fechar a janela" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Usar " #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Habilita modo offline ao inicializar" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notificação de início de download" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Produz som quando o download tiver finalizado" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Exibir ícones grandes" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Isso afetará todos os plugins." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Limite de velocidade global" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Velocidade máxima de upload" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Velocidade máxima de download" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Ações automáticas de acabamento" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Comando personalizado:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Comando personalizado caso ocorra um erro:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Autosalvar" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervalo:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minutos" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Configurações de linha de comando" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Usa \"--quiet\" por padrão" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Ordem de correspondência de plugin:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Opções de plugins do Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Token secreto de autorização RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Limite de velocidade global apenas para o aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Executar aria2 ao inicializar" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Desligar aria2 ao sair" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Executar o aria2 em dispositivo local" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Caminho" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumentos" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Você deve reiniciar o uGet após modificá-lo." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Modo de correspondência de mídia:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Condições para correspondência:" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Qualidade:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Tipo:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Arquivo" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Pasta" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Item" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Valor" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copiar _todos" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Mostrar janela" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Modo _offline" uget-2.2.2/po/fr.po0000664000175000017500000013556713470304402011007 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Nicolas Cuffia , 2016 # Patrice LACOUTURE , 2017 # Rémy J. , 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: Rémy J. \n" "Language-Team: French (http://www.transifex.com/uget/uget/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Service de gestion de mots de passe : uget\n\nLors de la tentative de connexion SSH à %s il y a eu un problème de vérification de la clé d'hôte vis à vis du fichier d'hôte connu et de confiance car cette clé d'hôte n'a pas été trouvé.\n\nSouhaitez-vous traiter cette connexion comme digne de confiance pour celle-ci et les futures connexions en ajoutant la clé d'hôte %s au fichier des hôtes connus ?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Toutes les catégories" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Connexion en cours..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmission en cours ..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Réessayer" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Téléchargement terminé" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Fini" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Reprise possible" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Reprise impossible" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Le fichier de sortie ne peut pas être renommé." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Impossible de se connecter au serveur." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Le dossier ne peut pas être créé." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Le fichier ne peut être créé (mauvais nom de fichier ou le fichier existe)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Fichier ne peut pas être ouvert." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Impossible de créer fil." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Mauvaise source (taille de fichier différente)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Plus de ressources (disque plein ou à court de mémoire)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Pas de fichier de sortie." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Pas de réglage de la sortie." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Trop de tentatives." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Programme non pris en charge (protocole)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Fichier non pris en charge." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "fichier post introuvable." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "fichier cookie introuvable." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Cette vidéo a été supprimée." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Une erreur est survenue lors de l'obtention d'infos sur la vidéo." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Une erreur est survenue lors de l'obtention de la page web de la vidéo." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Pas de video_id trouvé dans l'URL YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2 : une erreur inconnue s'est produite." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2 : un dépassement de temps s'est produit." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2 : la ressource n'a pas été trouvé." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 a vu le nombre spécifié d'erreur 'ressource non trouvé'. Voir l'option --max-file-option non trouvée" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2 : la vitesse était trop lente." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2 : un problème de réseau s'est produit." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2 : téléchargements inachevés." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Hors des ressources" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2 : la longueur de pièce était différente de celui du fichier de contrôle .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 téléchargeait le même fichier." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 téléchargeait le même torrent de hachage d'informations." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2 : le fichier existait déjà. Voir l'option --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2 : n'a pas pu ouvrir le fichier existant." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2 : impossible de créer le nouveau fichier ou de tronquer fichier existant." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2 : une erreur de I/O de fichier s'est produite." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2 : la résolution de nom a échoué." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2 : n'a pas pu analyser le document Metalink." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2 : la commande FTP a échoué." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2 : l'entête de réponse HTTP était mauvaise ou inattendue." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Trop de redirections." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2 : l'autorisation HTTP a échoué." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2 : n'a pas pu analyser le fichier bencoded (fichier .torrent habituellement)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2 : fichier torrent a été endommagé ou manquant d'informations." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2 : l'URI Magnet était mauvais." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2 : option mauvaise/non reconnue a été donnée ou argument d'option inattendue était " #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2 : le serveur distant n'a pas pu traiter la demande." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2 : n'a pas pu analyser la demande JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Pas de réponse. Est-ce que aria2 est arrêté ?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2 : gid a été retiré." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Impossible d'obtenir le lien média." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Aucune correspondance média." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Gestionnaire de téléchargement" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Robert-André Mauchin\nEmmanuel Andry" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Fondateur uGet : " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Chef de projet uGet : " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "tâches" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nouveau depuis le Presse-papiers" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nouveau téléchargement" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Presse-papiers" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Ligne de commande" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Une erreur est survenue" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Une erreur est survenue lors du téléchargement." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Démarrage Téléchargement" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Démarrer la file d'attente téléchargement." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Téléchargement Terminé" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Toutes les files d'attente téléchargement sont terminées." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Statut" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Catégorie" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Créer un nouveau téléchargement" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nouveau _Téléchargement" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nouvelle _Catégorie ..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Nouveau traitement par lot _depuis le presse-papiers" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nouveau lot de séquence URL" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nouveau Torrent ..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nouveau Metalink ..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Enregistrer tous les paramètres" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Mettre téléchargement sélectionné exécutable" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Mettre téléchargement sélectionné en pause" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Définir les propriétés du téléchargement sélectionnées " #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Déplacer le téléchargement sélectionné vers le haut" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Déplacer le téléchargement sélectionné vers le bas" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Déplacer le téléchargement sélectionné au début" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Déplacer le téléchargement sélectionné à la fin" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nouvelle catégorie" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Copier -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Propriétés catégorie" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Propriétés Téléchargement" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nouveau Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nouveau Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Ouvrir le fichier Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Fichier Torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Ouvrir le fichier Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Impossible d'enregistrer le fichier de catégorie." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Impossible de charger le fichier de catégorie." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Enregistrer le fichier de catégorie" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Ouvrir le fichier de catégorie" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Fichier JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Lien " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Image " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Fichier Texte" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importer des URLs depuis un fichier HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Fichier HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importer des URLs depuis un fichier texte" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Fichier texte" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exporter les URL dans un fichier texte" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Lot de séquence URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Aucune URL trouvée dans le presse-papiers." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Toutes les URL ont existé." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Traitement par lot du presse-papiers" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nouveau" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Erreur" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Message" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d éléments sélectionnés" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Attention uGetters :" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "nous sommes entrain d'organiser une compagne de donation pour le développement futur de uGet, cliquez SVP" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ICI" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "remplissez SVP ce rapide sondage d'utilisateur pour uGet" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "cliquez ici pour remplir le sondage" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nom de la catégorie :" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "_Téléchargements actifs :" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Capacité des finis :" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Capacité des supprimés :" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI appairant les conditions" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "_Hôtes appariés :" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "_Schémas appariés :" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "_Types appariés:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Vraiment quitter ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Veux-tu vraiment quitter ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Vraiment supprimer ces fichiers ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Êtes-vous sûr de vouloir supprimer ces fichiers ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vraiment supprimer la catégorie ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Êtes-vous sûr de vouloir supprimer la catégorie ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Ne plus jamais me demander" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI :" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Miroirs :" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fichier :" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Sélectionnez un dossier" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Dossier :" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Référent :" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "Connexions _Max :" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Exécutable" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ause" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Connexion" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Identifiant :" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Mot de passe :" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Fichier cookie :" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Sélectionner Fichier Cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Fichier posté :" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Sélectionnez Fichier Posté" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Utilisateur :" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Limite des ré-essais :" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "comptes" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Délai pour réessayer " #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "secondes" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Vitesse max téléchargement (up) :" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "Ko/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Vitesse max téléchargement (dl) :" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Récupérer horodatage" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fichier" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Traitement par lot de téléchargement" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Traitement par lot du _presse-papiers ..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Lot de séquence URL..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importer un fichier _Texte (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importer un fichier _HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exporter vers un fichier texte (.txt) ..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Ouvrir la catégorie ..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Sauver la catégorie comme ..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Enregistrer tous les paramètres" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Mode hors ligne" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Éditer" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Surveiller le Presse-papiers" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Le presse-papiers fonctionne discrètement" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "La ligne de commande fonctionne discrètement" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Passer l'URI existante" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Appliquer les paramètres de téléchargement récents" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Complétion _Auto-Actions" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Désactiver" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hiberner" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Suspendre" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Éteindre" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Redémarrer" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Personnalisé" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Se rappeler du paramètre" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Aide" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Paramètres..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Vue" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Barre d'_outils" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barre d’état" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Résumé" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Résumé des _Items" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nom" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Dossier" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Message" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Colonnes Téléchargement" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Treminé" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Taille" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Pourcentage « % »" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Passé" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Restant" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Vitesse" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Vitesse d'émission" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Envoyé" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Ratio" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Réessayer" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Ajouté" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Terminé" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Catégorie" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nouvelle catégorie" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "Catégorie _Supprimée" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Téléchargement" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "Supprimer l'entrée" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Supprimer l'entrée et le fichier" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Ouvrir le dossier contenant" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Forcer le Démarrage" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Déplacer à" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorité" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "En _haut" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "En _bas" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Obtenir de l'aide en ligne" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Documentation" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Forum d'aide" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Envoyer un retour" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Rapport de bug" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Vérifier les mises à jour" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Paramètres" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Impossible de lancer l'application par défaut pour le fichier « %s ». " #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "« %s » - Ce dossier n'existe pas." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "l'URI avait existé" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Cette URI avait existé, êtes vous sûr de vouloir continuer ?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Général" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Options avancées" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Paramètres catégorie" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Par défaut pour le nouveau téléchargement 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Défaut 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "sans nom" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "En Pause" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Envoi en cours" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Terminé" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Supprimé" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "File d'attente" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Actif" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Tous les états" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nom" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Complété" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Taille" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Fini" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Restant" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Quantité" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy :" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Ne pas utiliser" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Standard" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Hôte :" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port :" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket :" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket args:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Élément :" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Lun" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Mar" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Mer" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Jeu" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Ven" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sam" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Dim" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Activer le Planificateur" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Eteindre" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- Arrêter toutes les tâches" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- Exécuter normalement les tâches " #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Tous" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Aucune" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Marquer par filtre" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Marquer les URL par serveur et extension de fichier." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Ceci permet de réinitialiser toutes les marques d'URL." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Hôte" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Ext. Fichier" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Base de référence hypertexte" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Marquer _Tout" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Marquer _Aucun" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Marquer par filtre ..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "ex :" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_De :" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Vers :" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "Nb :" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_De" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "sensible à la casse" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Pas de caractère joker (*) dans l'URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "L'URL est invalide." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Pas de caractère dans les entrées « De » ou « Pour »." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Aperçu" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interface utilisateur" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Bande passante" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Échéancier" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plug-in" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Site Web média" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Autres" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "Activer le moniteur de presse-papiers" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Mode silencieux" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Indice de la catégorie par défaut" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Ajouter à la catégorie Nième si aucune catégorie appariés." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "Surveiller URL site Web média" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Surveiller presse-papiers pour les types de fichiers spécifiés :" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Séparer les types avec le caractère '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Vous pouvez utiliser des expressions régulières ici." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Confirmation" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Afficher la boite de dialogue de confirmation lors de la sortie" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Confirmer lors de la suppression de fichiers" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Zone de notification" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Toujours afficher dans la barre d'icônes" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Réduire en icône au démarrage" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Fermer le plateau sur la fenêtre fermée" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Utilisez App Indicateur d'Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Activer le mode hors ligne au démarrage" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notification au démarrage des téléchargements" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Son quand le téléchargement est fini" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Afficher grande icône" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Tout cela affectera tous les greffons." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Limite de vitesse globale" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Vitesse de téléchargement max" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Vitesse de téléchargement max" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Complétion Auto-Actions" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Commande personnalisée :" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Commande personnalisée en cas d'erreur :" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "Sauvegarde _Auto" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervalle :" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minutes" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Paramètres ligne de commande" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Utiliser '--quiet' par défaut" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Ordre d'appariement des greffons :" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Options des greffons Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Jeton secret d'autorisation RPC " #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Limite de vitesse goblale pour aria2 seulement" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Lancement au démarrage d'aria2" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "Arrêt d'aria2 à la sortie" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Lancer aria2 sur périphérique local" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Chemin d'accès" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Arguments" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Vous devez redémarrer uGet après l'avoir modifié." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Mode de correspondance média :" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Conditions de correspondance" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Qualité :" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Type :" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fichier" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Dossier" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Élément" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Valeur" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "To_ut copier" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Afficher la fenêtre" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Mode h_ors ligne" uget-2.2.2/po/id.po0000664000175000017500000013165713470304402010770 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # benny , 2013 # Hasan Al Banna, 2014 # Ikhwan Setiawan , 2014 # Muhammad Iqbal , 2013 # Rendiyono Wahyu Saputro , 2015 # Rizal Muttaqin , 2014 # Sony 2TH , 2016 # Yurike, 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Sony 2TH \n" "Language-Team: Indonesian (http://www.transifex.com/uget/uget/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Semua Kategori" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Menghubungkan" #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Sedang mengirim" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Ulangi" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Download selesai" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Selesai" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Dapat dilanjutkan" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Tidak dapat dilanjutkan" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Tidak dapat mengubah nama file" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Tidak dapat menyambung ke host" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Map tidak bisa dibuat " #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Berkas tidak dapat dibuat (kesalahan penamaan atau berkas sudah ada)" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Berkas tidak dapat dibuka" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Tidak dapat membuat thread." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Sumber tidak benar (ukuran file berbeda)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Melebihi kapasitas (penyimpanan penuh atau melebihi kapasitas memori)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Berkas keluaran tidak ada" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Tidak ada pengaturan keluaran" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Terlalu banyak mengulang" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Skema tidak di dukung (protokol)" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Berkas tidak didukung" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "catatan berkas tidak ditemukan." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "cookie berkas tidak ditemukan." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Video ini telah dihapus." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Kesalahan terjadi selama mendapatkan info video." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Kesalahan terjadi selama mendapatkan halaman web video." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Tidak ada video_id ditemukan di URL Youtube ini." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: sebuah galat yang tidak diketahui terjadi." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: kehabisan waktu terjadi." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: sumber daya tidak ditemukan." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 melihat angka spesifik dari galat 'sumber daya tidak ditemukan'. Lihat opsi --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: kecepatan terlalu lambat." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: masalah jaringan terjadi." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: Unduhan yang belum selesai." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Keluar dari sumber daya" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: panjang bagian berbeda dari satunya di berkas kendali .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 telah mengunduh berkas yang sama." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 telah mengunduh informasi hash torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: berkas sudah ada. Lihat opsi --boleh-timpa." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: tidak bisa membuka berkas yang ada." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: tidak bisa membuat berkas baru atau memotong berkas yang ada." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: galat I/O berkas terjadi." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: resolusi nama gagal." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: tidak bisa mengurai dokumen Metalink." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: perintah FTP gagal." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: kepala respon HTTP buruk atau tak terduga." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Terlalu banyak pengalihan" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: autorisasi HTTP gagal." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: tidak bisa mengurai berkas bencoded(biasanya berkas .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: berkas torrent rusak atau kehilangan informasi." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI buruk." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: opsi buruk/tidak dikenal telah diberikan atau argumen opsi tak terduga diberikan." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: remote server tidak dapat menangani permintaan." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: tidak dapat mengurai permintaan JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Tidak ada respon. Apakah aria2 mati?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid telah dihapus." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Gagal untuk mendapatkan tautan media." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Tidak sesuai media." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Download Manager" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Daftar penerjemah" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Pendiri uGet: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Manajer Proyek uGet: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "tugas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Baru dari klipboard" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Download Baru" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Papan klip" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Baris perintah" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Galat Terjadi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Galat Terjadi ketika sedang mengunduh." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Memulai Unduhan" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Memulai antrian unduhan" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Unduhan selesai" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Semua antrian unduhan sudah selesai" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategori" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Membuat unduhan baru" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Unduhan_ Baru" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Kategori_Baru" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Batch_Klipboard Baru" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Rangkaian baru kumpulan _URL" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Torrent Baru..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Metalink Baru..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Simpan semua pengaturan" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Pilih unduhan untuk dilanjutkan" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pilih unduhan untuk berhenti sebentar" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Atur properti unduhan yang dipilih" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Pindahkan unduhan terpilih keatas" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Pindah unduhan terpilih kebawah" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Pindah unduhan terpilih ke paling atas" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Pindah unduhan terpilih ke paling bawah" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Kategori Baru" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Salin -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategori Properti" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Properti Download" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Torrent Baru" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Metalink Baru" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Buka file Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Berkas torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Membuka file Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Gagal untuk menyimpan berkas kategori" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Gagal untuk memuat berkas kategori" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Simpan Berkas kategori" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Buka Berkas kategori" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Berkas JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Tautan " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Gambar " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Berkas Teks" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Mengimpor URLs dari berkas HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Berkas HTML (*.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Mengimpor URLs dari berkas teks" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Berkas text biasa" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Ekspor URL ke berkas teks" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Urutan kumpulan URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Tidak ada URL ditemukan pada papan klip" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Semua URL telah ada" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Kumpulan papan klip" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Baru" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Kesalahan " #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Pesan" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Memilih %d items" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Perhatian uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "kami menjalankan Donation Drive untuk pengembangkan uGet ke depannya, tolong klik" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "DISINI" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "Harap isi Survei Pengguna untuk uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "klik disini untuk mengikuti survei" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Nama_kategori" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Unduhan_aktif" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapasitas yang telah selesai:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapasitas yang didaur ulang:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Kondisi Pencocokan URL" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Cocok _Host:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Cocok _Skema:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Cocok _Tipe:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Apakah yakin mau keluar?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Apakah anda yakin akan keluar?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Yakin akan menghapus file?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Apakah Anda yakin akan menghapus file ini?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Sungguh menghapus kategori?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Apakah kamu yakin ingin menghapus kategori?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Jangan tanya saya lagi" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Mirror:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Nama Berkas:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Memilih Folder" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Folder" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Penghubung:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_ Koneksi Maks:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Dapat dijalankan" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "_Jeda" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Login" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Pengguna:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Kata kunci" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Berkas cookie" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Pilih Berkas Cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Berkas postingan:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Pilih berkas postingan" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Kurir:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Batas_mengulang" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "Jumlah" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Penundaan_mengulang:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "detik" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Kecepatan unggah maksimal:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Kecepatan unduh maksimal:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Mengambil catatan waktu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Berkas" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Batch Downloads" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_batch klipboard" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Urutan Batch URL" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Impor berkas teks (.txt)" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Impor berkas HTML (.html)" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Export ke berkas Text (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Buka kategori..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Simpan kategori sebagai..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Simpan _semua pengaturan" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Mode Offline" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Edit" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Pemantau_ Papan Klip" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Papan klip bekerja diam - diam" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Baris perintah bekerja diam - diam" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Lewati URL yang ada" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Terapkan pengaturan unduh baru-baru ini" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Penyelesaian _Aksi Otomatis" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Nonaktifkan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernasi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Menangguhkan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Matikan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Hidupkan Ulang" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Kustom" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Ingat pengaturan" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Bantuan" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Pengaturan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Tampilan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Peralatan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barstatus" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Hasil" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Butir _Ringkasan" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nama" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Folder" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL/Alamat" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Rincian" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Kolom_ Unduhan" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Selesai" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Ukuran" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Persentasi '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Sudah berjalan" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Tersisa" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Kecepatan" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Kecepatan Unggah" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Terunggah" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Perbandingan" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_mengulang" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Ditambahkan Pada" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Selesai Pada" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategori" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Kategori Baru" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Hapus Kategori" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Unduh" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Hapus Entri" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Hapis Entri dan _Berkas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Buka _Folder yang berisi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Mulai Paksa" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Pindah Ke" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Tinggi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Rendah" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Dapatkan Bantuan Online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentasi" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Dukungan Forum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Kirim Saran" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Melaporkan Masalah" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Cara Pintas Keyboard" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Periksa Update" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Pengaturan" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Tidak bisa menjalankan aplikasi untuk file '%s'" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Berkas ini tidak ditemukan." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI telah ada" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "URI ini telah ada, apa kamu ingin lanjutkan?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Umum" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Tingkat Lanjut" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Atur Kategori" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Bawaan untuk unduhan baru 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Bawaan 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "tidak dinamai" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Berhenti sejenak" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Mengunggah" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Selesai" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Kembalikan" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Antrian" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktif" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Semua Status" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nama" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Selesai" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Ukuran" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Sudah berjalan" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Tersisa" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Kuantitas" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Jangan gunakan" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Bawaan" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Soket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "args Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elemen:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Senin" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Selasa" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Rabu" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Kamis" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Jumat" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sabtu" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Minggu" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Aktifkan Penjadwalan" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Matikan" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- hentikan semua tugas" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- jalankan tugas secara normal" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Semuanya" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Tidak ada" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Tandai berdasarkan filter" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Tandai URLs berdasarkan host dan ekstensi berkas" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Ini akan mereset semua tanda pada URL" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Ekstensi File" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Referensi dasar hypertext" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Tandai_Semua" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Hilangkan_Tanda" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Tandai berdasarkan filter" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "contoh" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Dari:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Ke:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "digit" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_Dari:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "hurup besar & kecil dibedakan" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Tidak boleh ada character wildcard(*) di entri URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL tidak valid." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Tidak ada karakter di entri 'Dari' atau 'Ke'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Lihat" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Antarmuka Pengguna" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Bandwidth" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Pengatur Jadwal" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plug-In" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Media situs web" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Lainnya" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Aktifkan pemantau papan klip" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Mode senyap" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Index kategori standar" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Tambahkan ke kategori ke-N jika tidak ada kategori yang cocok." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Mengamati URL dari media situs web" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Pantau papan klip untuk tipe berkas tertentu:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Pisahkan tuisan dengan carakter '|'" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Anda dapat menggunakan regular ekspresi disini" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Konfirmasi" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Tampilkan dialog konfirmasi saat keluar" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Konfirmasi ketika menghapus file" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Sistem Baki" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Selalu tampilkan ikon tray" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimalkan ke tray saat starup" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Tutup ke baki saat jendela ditutup" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Gunakan indikator Aplikasi Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Aktifkan modus offline saat startup" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Pemberitahuan memulai unduhan" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Aktifkan suara ketika unduhan selesai" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Menampilkan ikon besar" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Ini akan mempengaruhi semua pengaya." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Batas kecepatan global" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Kecepatan maks unggah" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Kecepatan maks unduh" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Penyelesaian Aksi Otomatis" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Perintah kustom:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Perintah kustom jika galat terjadi:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Simpan otomatis" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Jarak" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "menit" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Pengaturan baris perintah" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Gunakan '--senyap' sebagai default" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Urutan pengaya yang cocok:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Opsi pengaya Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "token autorisasi rahasia RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Batas kecepatan global hanya untuk aria2 saja" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Nyalakan aria2 pada startup" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Matikan aria2 saat keluar" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Luncurkan aria2 pada perangkat lokal" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Lokasi" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumen" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Kamu harus hidupkan ulang uGet setelah memodifikasinya." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Mode menyesuaikan media:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Menyesuaikan kondisi" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Kualitas:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Menggolongkan:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Berkas" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Folder" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Item" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Nilai" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Salin_Semua" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Tunjukkan jendela" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Modus Offline" uget-2.2.2/po/kk.po0000664000175000017500000012430613470304402010772 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Baurzhan Muftakhidinov , 2016 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: Baurzhan Muftakhidinov \n" "Language-Team: Kazakh (http://www.transifex.com/uget/uget/language/kk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kk\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Барлық санаттар" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Байланысты орнату..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Қайталау" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Жүктеме аяқталды" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Дайын" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Шығыс файлы жоқ." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Қолдауы жоқ файл." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: белгісіз қате орын алған." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Қайта бағдарлаулар саны тым көп." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Жүктемелер басқарушысы" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Baurzhan Muftakhidinov " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet негізін қалаған: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet жоба басқарушысы: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "тапсырма" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Жаңа, алмасу буферінен" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Жаңа жүктеме" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Алмасу буфері" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Командалық жол" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Қате орын алды" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Жүктеп алу қатесі." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Жүктеп алу басталды" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Жүктемелер кезегін бастау." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Жүктеме аяқталды" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Кезектегі барлық жүктемелер аяқталды." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Күйі" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Санат" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Жаңа жүктемені жасау" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Жаңа _жүктеме..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Жаңа _санат..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Жаңа торрент..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Жаңа метасілтеме..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Барлық баптауларды сақтау" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Таңдалған жүктемені орындалатын етіп белгілеу" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Таңдалған жүктемені аялдату" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Таңдалған жүктеменің баптауларын орнату" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Таңдалған жүктемені жоғары жылжыту" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Таңдалған жүктемені төмен жылжыту" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Таңдалған жүктемені басына жылжыту" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Таңдалған жүктемені соңына жылжыту" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Жаңа санат" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Көшірме - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Санат қасиеттері" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Жүктеме қасиеттері" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Жаңа торрент" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Жаңа метасілтеме" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Торрент файлын ашу" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent файлы (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Метасілтеме файлын ашу" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Санаттар файлын сақтау сәтсіз аяқталды." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Санаттар файлын жүктеу сәтсіз аяқталды." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Санаттар файлын сақтау" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Санаттар файлын ашу" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON файлы (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "" #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Мәтін файлы" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML файлы (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Жаңа" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Қате" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Хабарлама" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Шығуды қалайсыз ба?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Санатты өшіруді шынымен қалайсыз ба?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Мені келесіде сұрамау" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Айналар:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Буманы таңдау" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "Бу_ма:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Сілтеуші:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "О_рындалатын" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "А_ялдату" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Логин" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Пайдаланушы:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Пароль:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookie файлы:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Cookie файлын таңдау" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post файлы:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Post файлын таңдау" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "рет" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунд" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "КиБ/сек" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Файл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Желіден тыс режимі" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "Тү_зету" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "Сө_ндіру" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Гибернация" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Ұйықтату" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Сөндіру" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Қайта қосу" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Таңдауыңызша" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Көмек" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Баптаулар..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "Тү_рі" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Панель" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Қалып-күй жолағы" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "Жи_ынды мәлімет" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Аты" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Бума" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_Сілтеме" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Хабарлама" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "Ө_лшемі" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "Қа_лды" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Жылдамдығы" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "Қа_йталау" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Санат" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Жаңа санат..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "Санатты ө_шіру" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "Жү_ктеп алу" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "Элементті ө_шіру" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Элементті және _файлды өшіру" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "_Орналасқан бумасын ашу" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Мәжбүрлі бастау" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "Қайда ж_ылжыту" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Приоритеті" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Жоғары" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "Қ_алыпты" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Төмен" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Желідегі көмек" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Құжаттама" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Қолдау көрсету форумы" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Кері байланыс пікірін жіберу" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Ақаулық жөнінде хабарлау" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Пернетақта жарлықтары" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Жаңартуларға тексеру" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Баптаулар" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "'%s' файлы үшін үнсіз келісім қолданбасын жөнелту мүмкін емес." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Бұл бума жоқ болып тұр." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Жалпы" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Кеңейтілген" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Санат баптаулары" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "атаусыз" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Аялдатылған" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Аяқталған" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Белсенді" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Барлық қалып-күйлер" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Атауы" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Аяқталды" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Өлшемі" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Өткен" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Қалды" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Саны" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Прокси:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Қолданбау" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Бастапқы" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Хост:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Сокет:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Сокет аргументтері:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Дс" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Сс" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Ср" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Бс" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Жм" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Сн" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Жк" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Сөндіру" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- барлық тапсырмаларды тоқтату" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Қалыпты" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- тапсырманы қалыпты орындау" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Барлығы" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Ешнәрсе" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Хост" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "мыс." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Алдын-ала қарау" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Пайдаланушы интерфейсі" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Жоспарлаушы" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Басқалар" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Тыныш режимі" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Растау" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Жүйелік трей" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Трей таңбашасын әрқашан көрсету" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Іске қосылғанда, трейге қайыру" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Терезе жабылғанда, трейге қайыру" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Үлкен таңбашаны көрсету" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Автосақтау" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Аралығы:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "минут" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Командалық жол баптаулары" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Орналасу" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Аргументтер" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Сапасы:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Түрі:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Файл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Бума" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Элемент" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Мәні" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Бар_лығын көшіріп алу" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Терезені көрсету" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Желіден т_ыс режимі" uget-2.2.2/po/be.po0000664000175000017500000014073613470304401010757 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mihail Varantsou , 2011 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Belarusian (http://www.transifex.com/uget/uget/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Усе катэгорыі" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Злучэнне..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Перадача..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Спробы" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Сцягванне скончана" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Сцягнутыя" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Можна дацягнуць пазней" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Без дацягвання" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Немагчыма пераназваць выходны файл." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "немагчыма падлучыцца да хоста." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Немагчыма стварыць каталог." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Немагчыма стварыць файл (памылковая назва файла або файл існуе)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Немагчыма адкрыць файл." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Не выйшла стварыць трэд." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Памылковая крыніца (адрозны памер файла)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Не стае рэсурсаў (дыск перапоўнены або недастаткова памяці)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Няма выходнага файла." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Няма выходных настáўленняў." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Занадта шмат спробаў." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Схема (пратакол) не падтрымліваецца." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Файл не падтрымліваецца." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Няма рэсурсаў" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Занадта шмат перанакіраванняў." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Няма адказу. Можа, aria2 адключаная?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Кіраўнік сцягванняў" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Міхась Варанцоў " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Заснавальнік uGet: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Кіраўнік праекту uGet: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "заданні" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Новае з буферу абмену" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Новае сцягванне" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Буфер абмену" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Загадны радок" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Узнікла памылка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Падчас сцягвання ўзнікла памылка." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Пачалося сцягванне" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Пачалося сцягванне па чарзе." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Сцягванне скончана" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Уся чарга сцягванняў скончана." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Стан" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Катэгорыі" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Стварыць новае сцягванне" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Новае _сцягванне..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Новая катэгорыя..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Новае _з буферу абмену..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Новае пакетнае сцягванне..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Новы торэнт..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Новая мета-спасылка..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Захаваць усе настáўленні" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Запусціць вылучаныя сцягванні" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Прыпыніць вылучаныя сцягванні" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Наставіць вылучаныя сцягванні" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Пасунуць вылучанае вышэй" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Пасунуць вылучанае ніжэй" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Пасунуць вылучанае дагары" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Пасунуць вылучанае дадолу" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Новая катэгорыя" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Скапіяваць - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Уласцівасці катэгорыі" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Уласцівасці сцягвання" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Новы торэнт" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Новая мета-спасылка" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Адкрыць Torrent-файл" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Адкрыць файл мета-спасылкі" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Не выйшла захаваць файл катэгорыі." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Не выйшла прачытаць файл катэгорыі." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Захаваць файл катэгорыі" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Адкрыць файл катэгорыі" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Спасылка " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Выява " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Тэкставы файл" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Імпартаваць URL'ы з HTML-файла" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Імпартаваць URL'ы з тэкставага файла" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Экспартаваць URL'ы у тэкставы файл" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Пакетнае сцягванне" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Не знойдзена URL'аў у буферы абмену." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Усе URL'ы ўжо існавалі." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Настáўленні _буферу абмену" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Новы" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Памылка" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Стан" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Абрана %d элементаў" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Карыстальнікі uGet, увага:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "мы запусцілі Donation Drive для далейшай распрацоўкі uGet. Калі ласка, пстрыкніце " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ТУТ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "калі ласка, прайдзіце хуткае апытанне карыстальнікаў Uget." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "пстрыкніце тут, каб прайсці апытанне" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Назва катэгорыі:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Дзейных сцягванняў, не болей за:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Памятаць скончаных сцягванняў, не болей за:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Памятаць выдаленых сцягванняў, не болей за:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Умовы распазнання URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Распазнаваць _хосты:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Распазнаваць _схемы:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Распазнаваць _тыпы:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Сапраўды выйсці?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Вы сапраўды хочаце выйсці?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Сапраўды выдаліць файлы?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Вы сапраўды хочаце выдаліць файлы?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Сапраўды выдаліць катэгорыю?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Вы сапраўды хочаце выдаліць катэгорыю?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Болей не пытацца" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Люстэркі:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Пазначыць каталог" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Каталог:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Крыніца пераходу:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Максімум злучэнняў:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Запусціць" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "П_рыпыніць" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Уваход" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Карыстальнік:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Пароль:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Файл кукі:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Пазначыць файл кукі" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Файл для дасылання:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Пазначыць файл, што трэба даслаць" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "User Agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Колькасць паўтораў:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "разоў" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Затрымка паўтора:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунд" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Найбольшая хуткасць зацягвання:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "КіБ/с" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Найбольшая хуткасць сцягвання:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Атрымліваць часавы адбітак" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Файл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Новая серыя сцягванняў" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Настáўленні буферу абмену..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Пакетнае сцягванне..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Імпарт тэкставага файла (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Імпарт HTML-файла (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Экспартаваць у тэкставы файл (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Адкрыць катэгорыю..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Захаваць катэгорыю як..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Захаваць _усе настáўленні" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Афлайн-рэжым" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Змяніць" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Сачыць за _буферам абмену" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Буфер абмену ў аўтаматычным рэжыме" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Загадны радок у аўтаматычным рэжыме" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Пропуск існага URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Ужываць настáўленні апошняга сцягвання" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Дзеянні па сканчэнні" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Адключыць" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Заснуць" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Прыпыніць" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Адключыць" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Перастартаваць" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Сваё" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Запомніць настáўленне" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Даведка" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Настáўленні..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Выгляд" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Паліца _начыння" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Радок стану" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Падрабязнасці" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Паказваць у _падрабязнасцях" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Назва" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Каталог" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Стан" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Слупкі _спісу сцягванняў" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Колькі сцягнута" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Памер" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Рух (у %)" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Мінула часу" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Засталося часу" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Хуткасць сцягвання" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Хуткасць раздачы" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Раздадзена" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Стасунак" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Паўторныя спробы" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Калі дададзена" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Калі скончана" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Катэгорыя" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Новая катэгорыя..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Выдаліць катэгорыю" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Сцягванне" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Выдаліць элемент" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Выдаліць элемент і _файл" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Адкрыць _змяшчальны каталог" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Хуткі старт" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Перанесці ў катэгорыю" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Прыярытэт" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Высокі" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Нармальны" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Нізкі" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Анлайн-даведка" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Дакументацыя" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Форум падтрымкі" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Даслаць водгук" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Паведаміць пра хібу" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Клавіятурныя скароты" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Праверыць на абнаўленні" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Настáўленні" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Немагчыма запусціць стандартную праграму для файла '%s'" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - гэты каталог не існуе." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI ужо існаваў" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Гэты URI ужо існаваў. Вы сапраўды жадаеце працягваць?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Галоўныя" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Дадатковыя" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Настáўленні катэгорыі" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Стандартныя настáўленні катэгорыі" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Дадатковыя стандартныя настáўленні" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "безназоўны" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Прыпынена" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Зацягванне" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Скончана" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Выдаленыя" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "У чарзе" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Дзейныя" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Агульны стан" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Назва" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Сцягнута" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Памер" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "Рух, %" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Мінула" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Засталося" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Колькасць" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Проксі:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Не выкарыстоўваць" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Стандартна" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Хост:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Сокет:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Аргументы сокета:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Элемент:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Пнд" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Аўт" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Срд" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Чцв" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Птн" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Сбт" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Ндз" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Праца паводле раскладу" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Спыніць" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- спыніць усе заданні" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Запусціць" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- запусціць заданні як звычайна" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Усе" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Нічога" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Вылучыць паводле фільтру" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Вылучыць URL'ы паводле хоста І ТАКСАМА тыпу файла." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Гэта скіне ўсе вылучэнні URL'аў." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Хост" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Тып файла." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Базавая гіпертэкставая спасылка" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Вылучыць _усё" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Зняць _усе вылучэнні" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Вылучыць паводле фільтру..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "напрыклад" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_З:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "_Па:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "лічбаў:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_З:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "зважаць на рэгістр" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Няма знака падстановы(*) у полі URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL нядзейсны." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "У палях 'З' ці 'Па' нічога няма." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Перадпрагляд" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Інтэрфэйс карыстальніка" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Прапускная здольнасць" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Планавальнік" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Убудовы" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Іншае" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Уключыць назіральнік буферу абмену" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Аўтаматычны рэжым" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Стандартны індэкс катэгорыі" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Даданне да N-ай катэгорыі, калі катэгорыя не распазнана." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Сачыць за буферам абмену на прадмет дадзеных тыпаў файлаў:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Тыпы размяжоўваюцца знакам '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Дазваляюцца рэгулярныя выразы." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Пацверджанне" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Паказваць вакенца пацверджання пры закрыцці" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Пацверджанне выдалення файлаў" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Сістэмны трэй" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Заўсёды паказваць значок у трэі" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Згарнуць у трэй на пачатку" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Згортвацца ў трэй пры закрыцці вакна" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Выкарыстоўваць індыкатар праграм Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Увайсці ў афлайн-рэжым на пачатку" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Абвяшчэнне пра пачатак сцягвання" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Гук, калі сцягванне скончана" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Гэта паўплывае на ўсе ўбудовы." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Глабальнае абмежаванне хуткасці" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Найбольшая хуткасць зацягвання" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Найбольшая хуткасць сцягвання" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Дзеянні па сканчэнні" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Свой загад:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Свой загад на выпадак узнікнення памылкі:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Аўтазахаванне" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Прамежак часу:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "хвілін" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Загадны радок" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Выкарыстоўваць '--quiet' стандартна" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Парадак распазнання убудоў:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Параметры убудовы aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Сакрэтны токен RPC-аўтарызацыі" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Глабальнае абмежаванне хуткасці выключна для aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Запускаць aria2 на пачатку" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Спыняць aria2 пры закрыцці" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Запускаць aria2 на лакальнай прыладзе" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Шлях" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Аргументы" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Трэба перазапусціць uGet пасля змянення." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Файл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Каталог" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Элемент" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Значэнне" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Капіяваць _усё" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Паказаць вакно" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Афлайн-рэжым" uget-2.2.2/po/ku.po0000664000175000017500000013016413470304402011003 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Haval Abdulkarim , 2015 # muhamad osman muhamad , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Kurdish (http://www.transifex.com/uget/uget/language/ku/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ku\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "پەیوەندی دەکرێ..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "بڵاودەکرێتەوە" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "دوبارە هەوڵدان" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "داگرتن تەواوبوو" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "تەواوبووە" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "بەردەوامبوون لە توانادا هەیە" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "بەردەوامبوون لە توانادا نیە" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "فایلەکە لەتوانادانیە ناوبنرێتەوە" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "لە توانادا نەبوو پەیوەندی بکرێت" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "فۆلدەرەکە لە توانادانیە دروستبکرێت" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "فایلەکە لەتوانادانیە دروستبکرێت )ناوی فایلەکە خراپە یان دووبارەیە)" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "فایلەکە لەتوانادانیە بکرێتەوە" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "شوێنی بەتاڵ نەماوە ( زاکیرە یان مێمۆری پڕبووە)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "فایلەکە بوونی نیە" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "هیچ ڕێکخستنێکی دەرخستە." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "ژمارەیەکی زۆر لە هەوڵدانەوە" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "فایلێکی پشتگیرینەکراوە." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "ژمارەیەکی زۆر لە ڕێپیشاندان." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "بەڕێوەبەری داگرتن" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "ناوی-وەرگێڕەکان" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "کارەکان" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "نوێ لە کلیپبۆردەوە" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "داگرتنی نوێ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "کلیپبۆرد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "هێڵی فرمان" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "داگرتن دەستی پێکرد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "دەستپێکردنی داگرتنی ڕیز." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "داگرتن تەواوبوو" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "هەموو دابەزاندنە دانراوەکان تەواوبوون" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "دۆخ" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "پۆلێن" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "دروستکردنی داگرتنی نوێ" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "داگرتنی نوێ..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "پۆلێنی نوێ..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "کۆمەڵە لینکێکی نوێی یەک لەدوای یەک" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "تۆرێنتێکی نوێ..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "مێتالینکێکی نوێ..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "ئەم دابەزاندنە دیاریکراوانە دەستپێبکە" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "داگرتنی دیاریکراو بوەستێنە" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "دانانی زانیاری دابەزاندنە دیاریکراوەکان" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "ئەم دابەزاندنە دیاریکراوانە ببە لوتکە" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "ئەم دابەزاندنە دیاریکراوانە ببە خوارەوە" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "جوڵاندنی داگرتنی دیاریکراو بۆ سەرەوە" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "ئەم دابەزاندنە دیاریکراوانە ببە بنەوە" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "کۆمەڵەیەکی نوێ" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "لەبەرگرتنەوە -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "زانیاری ئەم کۆمەڵە" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "خاسیەتەکانی داگرتن" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "تۆرێنتێکی نوێ" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "مێتا لینکێکی نوێ" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "فایلی تۆرێنت بکرەوە" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "فایلی مێتالینک بکەرەوە" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "لینک" #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "فایلێکی تێکست" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "وەرگرتنی لینکەکان لە فایلێکی HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "وەرگرتنی لینک لە فایلێکی تێکستەوە" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "هیچ لینکێک لە کلیپبۆرد نەدۆزرایەوە" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "یەکلەدوای یەک لە کلیپبۆردەوە" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "هەڵە" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "نامە" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d دیاری کراوە" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "ئاگاداری بەکارهێنەرانی یوگێت" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "ئێمە بەخشینێک بۆ یوگێن دەکەین بۆ بەرەوپێشچونی زیاتر ،تکایە کلیک بکە" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "لێرە" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "تکایە ئەم خزمەتە خێرایە بکە بۆ یوگێت." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "کلیک لێرە بکە بۆئەوەی خزمەتێک بکەی" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "ناوی پۆلێن:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "دابەزاندنە چالاکەکان:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "قەبارەی تەواوبوو:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "قەبارەی سڕاوە:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "دڵنیایت دایدەخەیت؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "دڵنیایت دەتەوێت دایبخەیت؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "دڵنیایت دەتەوێت فایلەکان بسڕیتەوە" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "دڵنیایت دەتەوێ فایلەکان بسڕیتەوە" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "دانەوە" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "پەڕگە:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "فۆڵدەرەکە دیاری بکە" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "ـبوخچە:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "بەردەوامبێت" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "وەستاندن" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "چونەناوەوە" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "بەکارهێنەر:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "پاسوۆرد" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "فایلی کووکی" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "فایلی کووکی دیاریبکە" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "فایلی پۆست" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "فایلی پۆستەکە دیاری بکە" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "بریکاری بەکارهێنەر" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "سنوری دوبارەکردنەوە" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "ژماردنەکان" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "چرکە" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "زۆرترین خێرایی ناردن" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "کب/چ" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "بەرزترین خێرایی داگرتن:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "کاتی وەرگرتن" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "فایل" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "دابەزاندنی یەک لە دوای یەک" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "کۆمەڵە لینکی یەک لەدوای یەک" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "وەرگرتن لە فایلێکی تێکستەوە" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "وەرگرتنی لینک لە فایلێکی HTML" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "ناردنە ناو فایلێکی تێکست(.txt)" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "دەستکاری کردن" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "چاودێری کلیپبۆرد" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "یارمەتی" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "ڕێکخستنەکان..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "بینین" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "توڵامراز" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "باڕی دۆخ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "کورتە" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "پێشەکی پێکهاتەکان" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "ناو" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "فۆڵدەر" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "لینک" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "پەیام" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "ڕیزی دابەزاندنەکان" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "تەواوبوو" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "قەبارە" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "لەسەدا '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "کاتی بەسەرچوو" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "چەپ" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "خێرایی" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "خێرایی ناردن" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "ناردراو" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "تێکڕا" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "هەوڵدانەوە" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "دانراوە لە" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "تەواوبوو لە" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "کۆمەڵە" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "پۆلێنی نوێ" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "سڕینەوەی کۆمەڵە" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "ـداگرتن" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "بە فشار دەستپێکردن" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "بجوڵێنە بۆ " #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "لە ئینتەرنێت یارمەتی بەدەستبێنە" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "کۆڕی پشتگیری" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "ناردنی هەڵەیەک لە بەرنامەکە" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "هەواڵدان لە کەلێن" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "گەڕان بۆ ڤێرژنی نوێ" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "ڕێکخستن" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "لەتوانادا نیە بە بەرنامەیەک فایلی '%s' بکرێتەوە." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' ئەم فۆڵدەرە بوونی نیە" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "گشتی" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "پێشکەوتوو" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "ڕێکخستنی کۆمەڵە" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "ڕێکخستن بۆ دابەزاندنی نوێی 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "ناونەنراو" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "سڕاوە" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "هەڵدەگیرێت" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "چالاک" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "ناو" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "تەواوبوو" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "قەبارە" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "ماوە" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "ماوە" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "ژمارە" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "پڕۆکسی" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "بەکاری مەهێنە" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "سەرەتا" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "لینک" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "پۆرت" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "فرمانی بۆشایی:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "ماددەکان" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "دوو شەم" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "سێشەم" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "چوارشەم" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "پێنج شەم" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "هەینی" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "دانیشت" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "خۆر" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "کوژاندنەوە" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "هەموو کارەکان بوەستێنە" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "ئاسایی" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "بەئاسایی کارەکە بکە" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "هەموو" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "هیچ" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "دیاریکردن بە فلتەر" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "ئەمە هەموو دیاریکردنەکانی لینکەکەن دەگەڕێنێتەوە شێوەی سەرەتا." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "خانەخوێ" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "پاشکۆی فایل." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "لینک" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "نیشاندانی بنکەی زۆر نوسین" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "هەموو دیاری بکە" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "هیچیان دیاری مەکە" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "دیاریکردن بە فلتەر" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "بۆ نموونە" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "لێرەوە" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "بۆ:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "لێرەوە" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "کارێکی هەستیارە" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "نابێت (*) لە لینکەکەدا هەبێت." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "بەستەر نەگونجاوە." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "هیچ نەنوسراوە لە ' لێرەوە ' یان ' بۆ '" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "پیشاندان" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "خشتەی کات" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "پێوەکراو" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "دیکە" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "جۆری بێدەنگ" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "جۆرەکان جیابکەرەوە بە '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "دەتوانی دەربڕینی ئاسایی بەکاربێنی لێرە." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "دڵنیاکردنەوە لەکاتی سڕینەوەی فایلەکان" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "هەمیشە ئایکۆنی لەسەرەوە پشان بدە" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "بچووکبکەوە بۆ سەرەوە لە سەرەتاوە" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "ئیشپێکردنی دەرهێڵ لە سەرەتا" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "ئاگادارکەرەوەی دەستپێکردنی دابەزاندنی نوێ" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "دەنگ کە دابەزاندن تەواوبوو" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "وچان" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "خولەک" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "ڕێکخستنەکانی هێڵی فرمان" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "بێدەنگ هەڵبژێرە وەک سەرەتا" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "ئاریا 2 لە سەرەتاوە ئیشپێبکە" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "کوژاندنەوەی ئاریا 2 پاش داخستن" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "شوێن" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "فرمانەکان" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "پەڕگە" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "بوخچە" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "پێکهاتە" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "بڕ" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "کۆپیکردنی هەموو" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "پیشاندانی بەرنامە" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "شێوازی دەرهێڵ" uget-2.2.2/po/it.po0000664000175000017500000013312213470304402010775 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # bovirus , 2013 # Giuseppe Pignataro (Fasbyte01) , 2017 # Martino Mensio , 2018 # tomberry , 2015 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2018-01-15 22:05+0000\n" "Last-Translator: Martino Mensio \n" "Language-Team: Italian (http://www.transifex.com/uget/uget/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Demone di gestione delle password: uget\n\nNel tentativo di connessione SSH a %s c'è stato un problema nella verifica della chiave del rispettivo host considerando il file degli host conosciuti e fidati perché la sua chiave host non è stata trovata.\n\nVuoi considerare questa connessione come fidata per questa e le future connessioni aggiungendo la chiave host di %s al file di host conosciuti?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Tutte le categorie" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Connessione..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Trasmissione..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Riprova" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Download completato" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Completato" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Riprendibile" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Non riprendibile" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Impossibile rinominare il file destinazione." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "impossibile connettersi all'host." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "La cartella non può essere creata." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Il file non può essere creato (nome non valido o già utilizzato)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Il file non può essere aperto." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Impossibile creare il thread." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Sorgente errata (dimensione file differente)" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Risorse non disponibili (disco pieno o memoria esaurita)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nessun file destinazione." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nessuna impostazione destinazione." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Troppi tentativi." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Schema (protocollo) non supportato." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "File non supportato." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "file post non trovato." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "file coockie non trovato" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Questo video è stato rimosso." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Errore durante il recupero delle informazioni video." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Errore durante il recupero della pagina web del video." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Nessun video_id trovato nell'URL di YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: errore sconosociuto." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria: si è verificato un timeout." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: risorsa non trovata." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 vede il numero di errori 'risorse non trovate'. Vedi l'opzione --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: la velocità era troppo bassa." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: problemi di rete." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: download non completati." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Risorse esaurite" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: lunghezza segmento differente da quella nel file di controllo .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 sta scaricando lo stesso file." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 sta scaricando lo stesso torrrent info hash." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: il file esiste già. Vedi opzione --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: impossibile aprire file esistente." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: impossibile creare nuovo file o troncare file esistente." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: errore I/O." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: risoluzione nomi fallita." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: impossibile analizzare documento metalink." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: comando FTP fallito." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: intestazione risposta HTTP errata o inaspettata." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Troppi reindirizzamenti." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: autorizzazione HTTP fallita." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: impossibile analizzare file codificato (di solito file .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: il file .torrent è corrotto o mancano informazioni." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: URI Magnet errata." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: opzione errata/non riconosciuta o argomento opzione inaspettato." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: il server remoto non può gestire la richiesta." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: impossibile analizzare richiesta JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Nessuna risposta. Aria2 è in chiusura?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid è stato rimosso." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Impossibile aprire il link del media." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Nessun media corrispondente." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Gestore download" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "bovirus (bovirus@gmail.com) e Giovanni Santini (giovanni.santini@katamail.com)" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet (sviluppatore): " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet (manager progetto): " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "attività" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nuovo da Appunti" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nuovo download" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Appunti" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Linea di comando" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Si è verificato un errroe" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Errore durante il download." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Inizio download" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Avvia elaborazione coda download." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Download completato" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Tutti i download in coda sono stati completati." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Stato" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Categoria" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Crea un nuovo download" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nuovo _download..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nuova _categoria..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Nuovo _batch Appunti " #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Batch nuova sequenza _URL" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nuovo torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nuovo collegamento meta..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Salva tutte le impostazioni" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Imposta download come attivo" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Imposta download in pausa" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Imposta proprietà download" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Sposta in su il download selezionato" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Sposta in giù il download selezionato" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Sposta in alto il download selezionato" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Sposta in basso il download selezionato" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nuova categoria" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Copia - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Proprietà categoria" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Proprietà download" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nuovo torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nuovo collegamento meta" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Apri file torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "File Torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Apri file collegamento meta" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Impossibile salvare file categoria." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Caricamento fallito file categoria." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Salva file categoria" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Apri file categoria" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "File JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Collegamento " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Immagine " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "File di testo" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importa URL da file HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "File HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importa URL da file di testo" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "File di solo testo" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Esporta URL in un file di testo" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Batch sequenza URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nessun URL trovato negli appunti." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Tutti gli URL esistevano." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Batch Appunti" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nuovo" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Errore" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Messaggio" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Selezionati %d elementi" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Attenzione utenti uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Stiamo eseguendo una unità donazione per futuri sviluppi di uGet. Fai clic " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "QUI" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "compila per favore questo veloce sondaggio per uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "fai clic qui per partecipare al sondaggio" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nome categoria:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Download attivi:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Limite dei finiti:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Limite dei riciclati:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Condizioni corrispondenza URI:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Corrispondenza _host:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Corrispondenza _schemi:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Corrispondenza _tipi:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Confermi la chiusura?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Confermi la chiusura dell'applicazione?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Vuoi veramente eliminare i file?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Confermi la cancellazione dei file?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vuoi veramente eliminare la categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Sei sicuro di voler eliminare la categoria?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Non chiederlo nuovamente" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Mirror:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "File:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Scegli cartella" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Cartella:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Referrer:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "Connessioni _max:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Attivo" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ausa" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Accedi" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Utente:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Password:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "File cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Scegli file cookie:" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Carica file:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Scegli file da caricare" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Agente utente:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Limite tentativi:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "volte" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Pausa tra ogni tentativo:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "secondi" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Velocità massima upload:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Velocità massima download:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Ottieni data/ora file" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_File" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Download _batch..." #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Bat_ch Appunti" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Batch sequenza _URL..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importa file di _testo (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importa file _HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Esporta in un file di testo (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "Apri categ_oria..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Salva categoria come..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "S_alva tutte le impostazioni" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Modo offline" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Modifica" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitorizza Appunti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Gli Appunti funzionano silenziosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "La linea di comando funziona silenziosamente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Ignora URI esistente" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Applica impostazioni download recenti" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Completato - Azioni automatiche" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Disabilita" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Iberna" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Sospendi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Spegnimento" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Riavvio" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Personalizzato" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Ricorda impostazioni" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Aiuto" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Impostazioni..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Vista" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Barra strumenti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Barra di stato" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sommario" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Elementi sommario " #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nome" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Cartella" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Messaggio" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Colonne download" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Completato" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Dimensioni" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Percentuale '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Trascorso" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Rimanente" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Velocità" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Velocità upload" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Inviato" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Rapporto" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Ritenta" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Aggiunto il" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Completato il" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Categoria" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nuova categoria" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Elimina categoria" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Download" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Elimina elemento" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Elimina elemento e _file" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Apri cartella _contenitore" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Forza avvio" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Sposta in" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorità" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Alto" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normale" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Bassa" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Vai alla Guida in linea" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Documentazione" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Forum di supporto" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Invia feedback" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Segnala un problema" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Scorciatoie tastiera" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Verifica aggiornamenti" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Impostazioni" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Non posso lanciare l'applicazione predefinita per il file '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - questa cartella non esiste." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "L'URI esisteva" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Questa URI esisteva. Sei sicuro di voler continuare?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Generale" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avanzate" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Impostazioni categoria" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Predefinito per nuovo download 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Predefinito 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "senza nome" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "In pausa" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Upload..." #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Completato" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Riciclati" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "In coda" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Attivi" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Tutti gli stati" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nome" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Completato" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Dimensioni" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Trascorsi" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Rimanente" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Quantità" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Non usare" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Predefinito" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Porta:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Argomenti socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elemento:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Lun" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Mar" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Mer" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Gio" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Ven" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sab" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Dom" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Abilita pianificazione" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Disattiva" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- ferma tutte le attività" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normale" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- esegui normalmente le attività" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Tutti" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nessuno" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Seleziona tramite filtro" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Seleziona URL per host E per estensione del file." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Questo ripristinerà i marcatori delle URL." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Estensione file" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Riferimento ipertesto di base" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Seleziona _tutti" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Deselezio_na tutti" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Seleziona tramite filtro..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "e.g." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "Da:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "A:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "numeri:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_Da:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "sensibile maiuscole/minuscole" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Nessun carattere jolly (*) nell'URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL non valido." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Nessun carattere nel campo 'Da' o 'A'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Anteprima" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interfaccia utente" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Banda" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Pianificazione" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plugin" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Sito web media" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Varie" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "A_bilita monitoraggio Appunti" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Modalità pausa" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Indice categoria predefinita" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Aggiunta alla n categoria se nessuna categoria corrsiponde." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Monitora URL del sito web del media" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorizza Appunti per i tipi di file specificati:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Separa i tipi con il carattere '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Qui puoi usare normali espressioni." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Conferme" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Visualizza finestra conferma all'uscita" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Conferma quando elimini i file" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Barra di sistema" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Mostra sempre icona nella barra di sistema" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimizza nella barra di sistema all'avvio" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Mininimizza nella barra sistema alla chiusura finestra" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Usa indicatore app Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Abilità modalita offline all'avvio" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notifica avvio download" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Suono a download completato" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Mostra icona grande" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Questo si applicaherà a tutti i plugin." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Limite globale velocità" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Velocità upload max" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Velocità download max" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Azioni automatiche al completamento" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Comando personalizzato:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Comando personalizzato in caso di errore:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Auto salvataggio" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervallo:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minuti" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Impostazioni linea di comando" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Usa '--quiet' come predefinito" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Ordine controllo plugin:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Opzioni plugin Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Token segreto autorizzazione RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Limite globale velocità solo per aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Avvia aria2 all'avvio" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Chiudi aria2 alla chiusura" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Esegui aria2 sul dispositivo locale" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Percorso" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argomenti" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Devi riavviare uGet dopo averlo modificato." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Modalità corrispondenza media:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Condizioni corrispondenze" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Qualità:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Tipo:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "File" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Cartella" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Elemento" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Valore" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copi_a tutto" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Visualizza la finestra" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Modalità offline" uget-2.2.2/po/Makefile.in.in0000644000000000000000000001575612477174752012476 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/po/zh_CN.po0000664000175000017500000013107013470304402011362 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Demon Smith , 2018 # Dz Chen , 2015-2017 # jiajinming , 2014 # Tommy He , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2018-02-24 10:55+0000\n" "Last-Translator: Demon Smith \n" "Language-Team: Chinese (China) (http://www.transifex.com/uget/uget/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "密码管理器守护程序:uget\n\n当尝试 SSH 连接到 %s 时验证它的 hostkey 到已知和受信任的 hosts 文件出现问题,因为它的 hostkey 并未找到。\n\n您想要将此连接此连接和将来的连接视为受信任的吗?添加 %s's hostkey 到已知的 hosts 文件来完成此操作。" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "全部分类" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "连接中..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "传送中..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "重试" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "下载完成" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "完成" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "可续传" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "不可续传" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "无法重命名输出文件。" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "无法连接到主机。" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "无法创建文件夹。" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "无法创建文件(文件名错误或者文件已存在)。" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "无法打开文件。" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "创建线程失败。" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "不正确的来源(文件尺寸不同)。" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "资源不足(磁盘已满或者内存不足)。" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "没有输出文件。" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "没有输出设置。" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "重试已达上限。" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "不支持的方案(协议)。" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "不支持的文件。" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "未找到后处理文件。" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "未找到 cookie 文件。" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "该视频已被移除。" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "获取视频信息时发生错误。" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "获取视频网页时发生错误。" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "未在 YouTube 的 URL 上找到视频 ID" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: 发生未知的错误。" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: 发生超时。" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: 资源未找到。" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 遇到指定数量的“资源无法找到”错误。查看 --max-file-not-found 选项" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: 速度过慢。" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: 发生网络问题。" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: 未完成的下载。" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "资源不可用" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: 分块长度与 .aria2 配置文件中不同。" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 正在下载相同的文件。" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 正在下载信息哈希值相同的种子。" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: 文件已存在。查看 --allow-overwrite 选项。" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: 无法打开已存在文件。" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: 无法创建新文件或分割已有文件。" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: 发生文件 I/O 错误。" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: 名称解析失败。" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: 无法解析 Metalink 文档。" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP 命令失败。" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP 响应头错误或不符预期。" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "重定向已达上限。" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP 认证失败。" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: 无法解析 bencoded 文件(通常是 .torrent 文件)。" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: 种子文件损坏或缺少信息。" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: 磁链 URI 错误。" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: 配置或者配置参数错误/无法识别。" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: 远程服务器无法处理请求。" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: 无法解析 JSON-RPC 请求。" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "无响应。aria2 是否已被停止?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid 已被移除。" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "获取媒体链接失败。" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "没有匹配的媒体。" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "下载管理器" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "lh \nTommy He " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet 创始人:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet 项目管理员:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "任务" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "从剪切板中新建" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "新建下载" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "剪切板" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "命令行" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "发生错误" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "下载时发生错误。" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "下载开始" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "开始下载队列。" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "下载完成" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "队列里所有下载都已完成。" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "状态" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "分类" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "创建新下载" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "新建下载(_D)..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "新建分类(_C)..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "剪切板批量下载(_B)..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "新建 URL 序列下载(_U)..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "新建种子..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "新建磁链..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "保存全部设置" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "运行选中的下载" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "暂停选中的下载" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "设置选中的下载的属性" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "上移选中的下载" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "下移选中的下载" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "移动选中的下载到顶部" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "移动选中的下载到底部" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "新建分类" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "复制 - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "分类属性" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "下载属性" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "新建种子" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "新建磁链" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "打开种子文件" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "种子文件 (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "打开磁链文件" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "保存分类文件失败。" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "载入分类文件失败。" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "保存分类文件" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "打开分类文件" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON 文件 (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "链接 " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "图像 " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "文本文件" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "从 HTML 文件中导入 URL 地址" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML 文件 (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "从文本文件中导入 URL 地址" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "纯文本文件" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "导出 URL 至文本文件" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL 序列下载" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "剪切板中没有找到 URL 地址。" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "所有的 URL 已存在。" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "剪切板批量下载" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "新建" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "错误" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "信息" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "已选中 %d 个项目" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "uGet 用户们请注意:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "我们正在为保证 uGet 的未来发展的进行募捐,捐助请点击" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "这里" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "请填写 uGet 快速用户调查。" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "点击这里参加调查" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "分类名称(_N):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "同时进行下载数(_D):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "\"已完成\"分类的容量:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "\"回收站\"分类的容量:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI 匹配条件" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "匹配主机(_H):" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "匹配模式(_S):" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "匹配类型(_T):" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "确认退出吗?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "您确认要退出吗?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "确认删除文件吗?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "您确认要删除这些文件吗?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "确认删除分类?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "您确认要删除分类吗?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "下次不再询问" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "URI(_U):" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "镜像:" #: ../ui-gtk/UgtkDownloadForm.c:141 msgid "Leave blank to use default filename ..." msgstr "留空以使用默认文件名 ..." #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "文件:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "选择文件夹" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "文件夹(_F):" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "引用页:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "最大连接数(_M):" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "开始(_R)" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "暂停((_A)" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "登录" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "用户:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "密码:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookie 文件" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "选择 Cookie 文件" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "发送文件:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "选择发送文件" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "用户代理" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "重试上限(_L)" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "计数" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "重试延迟(_D)" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "秒" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "最大上传速度:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "最大下载速度:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "取回时间戳" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "文件(_F)" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "批量下载(_B)" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "剪切板批量下载(_C)..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "URL 序列下载(_U)..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "导入文本文件(_T)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "导入HTML文件(_H)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "导出文本文件(_E)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "打开分类(_O)..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "保存分类为(_S)..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "保存全部设置(_A)" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "离线模式" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "编辑(_E)" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "剪切板监视(_M)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "剪贴板静默工作" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "命令行静默工作" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "跳过已存在 URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "使用上一次的下载设置" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "完成时的自动操作(_A)" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "禁用(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "休眠" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "挂起" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "关机" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "重启" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "自定义" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "记住设置" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "说明(_H)" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "设置(_S)..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "查看(_V)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "工具栏(_T)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "状态栏" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "概况(_S)" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "概况项目(_I)" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "名称(_N)" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "文件夹(_F)" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "URL(_U)" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "信息(_M)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "下载列(_C)" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "完成(_C)" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "大小(_S)" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "百分比 '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "已用时间(_E)" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "剩余(_L)" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "速度" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "上传速度" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "已上传" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "分享率" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "重试(_R)" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "添加时间" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "完成时间" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "分类(_C)" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "新建分类(_N)..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "删除分类(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "下载(_D)" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "删除条目(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "删除条目及文件(_F)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "打开保存文件夹(_C)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "强制开始" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "移动到(_M)" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "优先级" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "高(_H)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "中(_N)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "低(_L)" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "获取在线帮助" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "文档" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "支持论坛" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "提交反馈" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "报告错误" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "检查更新" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "设置" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "无法使用默认程序打开文件 '%s'。" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - 文件夹不存在。" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI 已存在" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "该 URI 已存在,您确定要继续?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "一般" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "高级" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "分类设置" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "默认一般设置" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "默认高级设置" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "未命名" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "已暂停" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "正上传" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "已完成" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "回收站" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "队列" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "活跃的" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "全部状态" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "名称" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "完成" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "大小" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "已完成" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "剩余" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "数量" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "代理服务器:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "不使用" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "默认" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "主机:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "端口:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "端口参数:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "对象:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "一" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "二" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "三" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "四" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "五" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "六" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "日" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "启用下载计划(_E)" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "关闭" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- 停止所有的任务" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "正常" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- 正常运行任务" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "全部" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "无" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "根据过滤规则选择" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "根据主机和文件扩展名选择 URL 地址." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "将会重置所有选择的 URL 地址." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "主机" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "文件扩展名." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "基本超文本引用" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "全选(_A)" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "全不选(_N)" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "根据过滤规则选择(_M)..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "例如" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "来源(_F):" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "到:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "数字:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "从(_R):" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "区分大小写" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL 输入框中没有通配符(*)." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL 无效。" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "'来源'和'到'输入框为空。" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "预览" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "用户界面" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "带宽" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "下载计划" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "插件" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "媒体网站" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "其他" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "启用剪贴板监控(_E)" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "静默模式(_Q)" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "默认分类索引" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "如果没有匹配分类则添加至第 N 个分类。" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "监控媒体网站的 URL(_M)" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "监控剪贴板中的指定文件类型:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "使用符号'|'来分隔文件类型。" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "您可以在这里使用正则表达式。" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "确认" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "退出时显示确认对话框" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "删除文件时需要确认" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "系统托盘" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "始终显示托盘图标" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "程序启动自动最小化到系统托盘" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "窗口关闭时缩小至托盘" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "使用 Ubuntu 的 App Indicator" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "程序启动使用离线模式" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "下载开始提示" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "完成下载时发出声音" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "显示大图标" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "这将影响所有插件。" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "全局速度限制" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "最大上传速度" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "最大下载速度" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "完成时的自动操作" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "自定义命令:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "错误发生时的自定义命令:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "自动保存(_A)" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "间隔(_I):" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "分钟" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "命令行设置" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "默认使用 '--quiet'" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "插件匹配顺序:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 插件选项" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC 认证密钥" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "针对 aria2 的全局速度限制" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "启动时运行 aria2" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "退出时关闭 aria2" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "启动本地设备上的 aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "路径:" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "参数" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "您在修改它之后必须重启 uGet。" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "媒体匹配模式:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "匹配条件" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "质量:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "类型:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "文件" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "文件夹" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "项目" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "值" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "全部复制(_A)" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "显示窗口" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "离线模式(_O)" uget-2.2.2/po/ru.po0000664000175000017500000014614513470304402011020 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Anton Shcherbina , 2016 # Paul Zercy , 2013 # Pavlo Bohmat , 2010 # Vasya Durkin , 2017 # Дмитрий Серов , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-07-13 14:16+0000\n" "Last-Translator: Vasya Durkin \n" "Language-Team: Russian (http://www.transifex.com/uget/uget/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Все категории" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Соединение..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Передача..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Повторить" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Закачка завершена" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Завершено" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Возобновляемо" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Не возобновляемо" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Исходящий файл невозможно переименовать." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "не удается подключиться к узлу." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Невозможно создать каталог." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Файл не может быть создан (неверное имя или файл существует)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Невозможно открыть файл." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Не удается создать поток." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Неверный источник (разный размер файла)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Нет ресурсов (диск переполнен или недостаточно памяти)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Нет исходящего файла." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Нет исходящих настроек." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Слишком много повторений." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Неподдерживаемая схема (протокол)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Неподдерживаемый файл." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "cookie файл не найден" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Это видео удалено." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Не найден video_id в ссылке YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: произошла неизвестная ошибка." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: время истекло." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: ресурс не найден." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 получила определенное число ошибок \"ресурс не найден\". Смотрите параметр --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: скорость была слишком медленной." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: возникла проблема с сетью." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: незавершенные загрузки." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Нет ресурсов" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: размер блока был отличным от указанного в контрольном .aria2-файле" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 был загружен один и тот же файл." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 был загружен один и тот же хеш торрента." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: файл уже существует. Смотрите параметр --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: не удалось открыть существующий файл." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: не удалось создать новый файл или обнулить существующий файл." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: произошла ошибка чтения/записи файла." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: разрешение имен не удалось." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: не удалось проанализировать Metalink-документ." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP команда не удалась." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP-заголовок ответа был испорченным или неожиданным." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Слишком много перенаправлений." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP-авторизация не удалась." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: не удалось проанализировать закодированный файл (обычно файл \".torrent\")." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: торрент-файл поврежден или недостаточно информации." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: плохой Magnet URI." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: задан плохой/неопознанный параметр или неожиданный аргумент к нему." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: удаленный сервер не смог обработать запрос." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: не удалось проанализировать JSON-RPC запрос." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Нет ответа. Может быть aria2 отключена?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid был удален." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Невозможно получить media ссылку" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Менеджер закачек" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Павел Богмат \nМихаил Воронцов " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Основатель uGet: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Менеджер проекта uGet: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "задачи" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Новая из буфера обмена" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Новая закачка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Буфер обмена" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Командная строка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Произошла ошибка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Произошла ошибка при загрузке." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Закачка запущена" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Запущена очередь закачки" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Закачка завершена" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Все очереди загрузки были завершены." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Состояние" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Категории" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Создать новую закачку" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Новая _закачка..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Новая _категория" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Новая _из буфера обмена" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Новая пакетная закачка..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Новый торрент..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Новая мета-ссылка" #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Сохранить все настройки" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Установить выбранные закачки на исполнение" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Установить выбранные закачки на паузу" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Настройки выбранных закачек" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Поднять выбранное" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Опустить выбранное" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Переместить выбранное вверх" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Переместить выбранное вниз" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Новая категория" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Копировать - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Свойства категории" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Свойства закачки" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Новый торрент" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Новая мета-ссылка" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Открыть торрент-файл" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent файл (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Открыть файл мета-ссылки" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Не удалось сохранить файл категории." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Не удалось загрузить файл категории." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Сохранить файл категории" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Открыть файл категории" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Файл JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Ссылка " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Изображение " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Текстовый файл" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Импорт URL-адресов из HTML файла" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Файл HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Импорт URL-адресов из текстового файла" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Простой текстовый файл" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Экспорт URL-адресов в текстовый файл" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Последовательность ссылок" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "В буфере обмена не найдено URL-адресов." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Все URL-адреса уже существуют." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Из буфера обмена" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Новая" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Ошибка" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Сообщение" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Выбран(о) %d пункт(а,ов)" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Пользователи uGet, внимание:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "мы запустили Donation Drive для дальнейшей разработки uGet, пожалуйста, щелкните" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ЗДЕСЬ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "пожалуйста, пройдите быстрый опрос пользователей uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "нажмите здесь, чтобы пройти опрос" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Имя категории:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Активные _закачки:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Завершенных загрузок:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Количество удаленных:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Условия распознавания URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Распознавать _хосты:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Распознавать _схемы:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Распознавать _типы:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Действительно выйти?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Вы уверены, что хотите выйти?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Действительно удалить файлы?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Вы уверены, что хотите удалить файлы?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Действительно удалить категорию?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Вы уверены, что хотите удалить категорию?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Не спрашивать снова" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Зеркала:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Выбрать каталог" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Каталог:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Источник перехода:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Максимальное число соединений:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Запустить" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "П_ауза" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Вход" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Пользователь:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Пароль:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Файл куки:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Выбрать куки-файл" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Выберать отправляемый файл" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "User Agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Число повторов:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "раз" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Задержка повтора:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунд" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Наибольшая скорость отправки:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "кб/с" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Максимальная скорость закачки:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Получать timestamp" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Файл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Пакетная закачка" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Из _буфера обмена" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Пакетная закачка..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Импортировать _текстовый файл (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Импортировать _HTML файл (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Экспортировать в текстовый файл (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Открыть категорию..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Сохранить категорию как..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Сохранить _все настройки" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Автономный режим" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Правка" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Следить за буфером обмена" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Буфер обмена в автоматическом режиме" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Командная строка в автоматическом режиме" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Пропускать существующие URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Принять настройки последней закачки" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Действия после завершения" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Отключено" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Гибернация" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Ждущий режим" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Завершение работы" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Перезагрузка" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Пользовательское" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Запомнить настройку" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Справка" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Настройки..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Вид" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Панель _инструментов" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Строка состояния" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Подробности" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Показывать в подробностях" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Имя" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Каталог" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Сообщение" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Колонки списка _закачек" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Скачано" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Размер" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "Про_цент '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Прошло" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Осталось" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Скорость" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Скорость отдачи" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Отправлено" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Рейтинг" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Повторить" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Добавлено" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Завершено" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Категория" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "Создать _категорию..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Удалить категорию" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Закачка" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Удалить запись" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Удалить запись и _файл" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Открыть _содержащий каталог" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Быстрый старт" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "Пе_реместить в" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Приоритет" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Высокий" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Нормальный" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Низкий" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Получить помощь онлайн" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Документация" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Форум поддержки" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Оставить отзыв" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Сообщить об ошибке" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Сочетания клавиш" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Проверить наличие обновлений" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Настройки" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Не удается запустить приложение по умолчанию для файла '%s'" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - каталог не существует." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI уже существует" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Этот URI уже существует, вы уверены, что хотите продолжить?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Главные" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Дополнительные" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Настройки категории" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Умолчания для новой закачки 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Умолчания 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "безымянный" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Приостановлено" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Отправка" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Завершено" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Удалено" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Очередь" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Активно" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Все состояния" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Имя" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Скачано" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Размер" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Прошло" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Осталось" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Количество" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Прокси:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Не использовать" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "По умолчанию" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Сервер:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Сокет:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Параметры сокета:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Элемент:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Пнд" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Втр" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Срд" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Чтв" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Птн" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Суб" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Вск" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Включить планировщик" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Выключить" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- остановить всё" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Нормально" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- запустить задачу нормально" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Все" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Ничего" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Отметить по фильтру" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Отметить адреса принадлежащие узлу И расширению файлов." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Это приведет к сбросу всех отмеченные URL-адресов." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Сервер" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Расширение файла" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "База ссылок" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Отметить _всё" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Снять _все отметки" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Отметить по фильтру..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "Например:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_С:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "По:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "цифр:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_с:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "с учётом регистра" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Нет символа шаблона(*) в URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Недопустимый URL-адрес." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "В полях 'С' или 'По' ничего нет." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Предпросмотр" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Интерфейс" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Пропускная способность" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Планировщик" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Плагины" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Другое" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Включить мониторинг буфера обмена" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_В автоматическом\n режиме" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Индекс категории по умолчанию" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Добавление к N-ой категории, если категория не распознана." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Следить за этими типами файлов в буфере обмена:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Типы отделяются символом '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Можно использовать регулярные выражения." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Подтверждение" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Показывать окно подтверждения при выходе" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Подтверждение при удалении файлов" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Область уведомлений" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Всегда показывать иконку в трее" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Минимизировать в трей при запуске" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Скрывать в трей при закрытии окна" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Использовать индикатор приложений Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Включить автономный режим при запуске" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Уведомление при запуске загрузки" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Звуковое уведомление по окончании" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Показать увеличенные иконки" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Они воздействуют на все плагины." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Глобальные ограничения скорости" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Максимальная скорость отправки" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Максимальная скорость закачки" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Действия после завершения" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Пользовательская команда:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Пользовательская команда при возникновении ошибки:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Автосохранение" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Интервал:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "минут" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Настройки параметров командной строки" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Использовать '--quiet' по умолчанию" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Порядок распознавания плагинов:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Опции плагина aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Секретный токен RPC-авторизации" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Глобальные ограничения скорости только для aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Запускать aria2 при старте" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Выключать aria2 при выходе" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Запускать aria2 на локальном устройстве" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Путь" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Параметры" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Вы должны перезагрузить uGet после внесения изменений." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Соответствует условиям" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Качество:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Тип:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Файл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Каталог" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Пункт" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Значение" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Копировать _всё" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Показать окно" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Автономный режим" uget-2.2.2/po/sk_SK.po0000664000175000017500000013222113470304402011372 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # pyler , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/uget/uget/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Všetky kategórie" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Pripájanie..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Prenášanie..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Skúsiť znovu" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Sťahovanie dokončené" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Dokončené" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Obnoviteľné" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Neobnoviteľné" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Výstupný súbor nemôže byť premenovaný." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Nemožno sa pripojiť k hostiteľovi." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Priečinok nemôže byť vytvorený." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Súbor nemôže byť vytvorený (zlý názov súboru alebo súbor už existuje)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Súbor nemôže byť otvorený." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nemožno vytvoriť vlákno." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Nesprávny zdroj (odlišná veľkosť súboru)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Nedostatok zdrojov (plný disk alebo nedostatok pamäte)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Žiadny výstupný súbor." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Žiadne nastavenie výstupu." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Príliš veľa opakovaní." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nepodporovaná schéma (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nepodporovaný súbor." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: Vyskytla sa neznáma chyba." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: Časový limit vypršal." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: Zdroj nebol nájdený." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 má špecifický počet chýb 'zdroj nebol nájdený'. Pozrite možnosť --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: Rýchlosť bola príliš pomalá." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: Vyskytol sa problém so sieťou." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: Nedokončené sťahovania." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Nedostatok zdrojov" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: Dĺžka časti bola odlišná od uvedenej v kontrolnom súbore .aria2." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 sťahoval rovnaký súbor." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 stiahol rovnaký info hash torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: Súbor už existuje. Pozrite možnosť --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: Nemožno otvoriť existujúci súbor." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: Nemožno vytvoriť nový súbor alebo skrátiť existujúci súbor." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: Vyskytla sa vstupno-výstupná chyba súboru." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: Rozlíšenie názvu zlyhalo." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: Nemožno parsovať Metalink dokument." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP príkaz zlyhal." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: Hlavička HTTP odozvy bola zlá alebo neočakávaná." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Príliš veľa presmerovaní." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP overenie zlyhalo." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: Nemožno parsovať benkódovaný súbor (zvyčajne súbor .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: Súbor torrentu je poškodený alebo neobsahuje niektoré informácie." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI je zlá." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: Bola zadaná zlá alebo nerozpoznaná možnosť alebo zlý argument možnosti" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: Vzdialený server nemohol spracovať požiadavku." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: Nemožno parsovať JSON-RPC požiadavka." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Žiadna odozva. Je plugin aria2 vypnutý?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: Gid bol odstránený." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Správca sťahovaní" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "pyler" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Zakladateľ uGet: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Správca projektu uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "úlohy" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nové zo schránky" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nové sťahovanie" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Schránka" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Príkazový riadok" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Vyskytla sa chyba" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Vyskytla sa chyba pri sťahovaní." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Sťahovanie začalo" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Sťahovanie fronty začalo." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Sťahovanie dokončené" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Všetky sťahovania vo fronte sú dokončené." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Stav" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategória" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Vytvoriť nové sťahovanie" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nové _sťahovanie..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nová _kategória..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "New Clipboard _batch..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nové _dávkové z URL sekvencie..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nový torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nový metaodkaz..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Uložiť všetky nastavenia" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Spustiť vybrané sťahovanie" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pozastaviť vybrané sťahovanie" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Vlastnosti vybraného sťahovania" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Posunúť vybrané sťahovanie vyššie" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Posunúť vybrané sťahovanie nižšie" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Posunúť vybrané sťahovanie nahor" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Posunúť vybrané sťahovanie nadol" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nová kategória" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopírovať - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Vlastnosti kategórie" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Vlastnosti sťahovania" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nový torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nový metaodkaz" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Otvoriť súbor torrentu" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Otvoriť súbor metaodkazu" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Nepodarilo sa uložiť súbor kategórií." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Nepodarilo sa načítať súbor kategórií." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Uložiť súbor kategórií" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Otvoriť súbor kategórií" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Odkaz " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Obrázok " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Textový súbor" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importovať URL adresy z HTML súboru" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importovať URL adresy z textového súboru" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exportovať URL adresy do textového súboru" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Dávkové zo URL sekvencie" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nenájdené žiadne URL adresy v schránke." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Všetky URL adresy existujú." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Dávkové zo schránky" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nové" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Chyba" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Správa" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Počet vybraných položiek: %d" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Upozornenie používateľom uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "zbierame dary na financovanie budúcich verzií uGet, prosíme klikněte" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "TU" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "prosím, vyplňte tento krátky používateľský prieskum ohľadom uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "kliknite sem a zúčastnite sa prieskumu" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Názov kategórie:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktívne _sťahovania:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacita dokončených:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacita koša:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Zodpovedajúce podmienky URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Zodpovedajúci _hostitelia:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Zodpovedajúce _schémy:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Zodpovedajúce _typy:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Naozaj ukončiť?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Ste si istý, že chcete ukončiť?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Naozaj vymazať súbory?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Ste si istý, že chcete vymazať súbory?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vymazať kategóriu?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Ste si istý, že chcete vymazať kategóriu?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Nepýtať sa znovu" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Zrkadlá:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Súbor:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Vyberte priečinok" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Priečinok:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Odkazovateľ:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maximálny počet pripojení:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Spustiť" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "_Pozastaviť" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "_Prihlásiť sa" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Používateľ:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Heslo:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Súbor cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Vyberte súbor cookie:" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Odoslať súbor:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Vyberte súbor na odoslanie:" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Používateľský agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Limit opakovaní:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "počet" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "_Oneskorenie opakovania:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekúnd" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maximálna rýchlosť nahrávania:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maximálna rýchlosť sťahovania:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Načítať časovú pečiatku" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Súbor" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Dávkové sťahovanie" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Dávkové zo schránky..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Dávkové z URL sekvencie..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Importovať z textového súboru (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Importovať z HTML súboru (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportovať do textového súboru (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Otvoriť kategóriu..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Uložiť kategóriu ako..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Uložiť _všetky nastavenia" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Režim offline" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Upraviť" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitor schránky" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Schránka pracuje potichu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Príkazový riadok pracuje potichu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Preskočiť existujúce URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Použiť nedávne nastavenia sťahovania" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Dokončenie _automatických akcií" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Zakázať" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernovať" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Pozastaviť" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Vypnúť" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Reštartovať" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Vlastné" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Zapamätať nastavenie" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Pomocník" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Nastavenia..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Zobraziť" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Panel nástrojov" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Stavový riadok" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Zhrnutie" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Zhrnutie _položiek" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Názov" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Priečinok" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Správa" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Stĺpce sťahovania" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Dokončené" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Veľkosť" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Percento '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Uplynulé" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Zostáva" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Rýchlosť" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Rýchlosť nahrávania" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Nahrané" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Pomer" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Skúsiť znovu" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Dátum pridania" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Dátum dokončenia" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategória" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nová kategória..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Vymazať kategóriu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Sťahovanie" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Vymazať položku" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Vymazať položku a _súbor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Otvoriť _cieľový priečinok" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Vynútiť spustenie" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Presunúť do" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorita" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Vysoká" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normálna" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Nízka" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Získať pomoc online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentácia" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Fórum podpory" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Odoslať spätnú väzbu" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Nahlásiť chybu" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Klávesové skratky" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Skontrolovať aktualizácie" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Nastavenia" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Nemožno spustiť predvolenú aplikáciu pre súbor '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Tento priečinok neexistuje." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI existuje" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Toto URI existuje, naozaj chcete pokračovať?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Všeobecné" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Pokročilé" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Nastavenia kategórie" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Predvolené pre nové sťahovanie 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Predvolené 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "bez názvu" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pozastavené" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Nahrávanie" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Dokončené" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "V koši" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Vo fronte" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktívne" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Všetky stavy" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Názov" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Dokončené" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Veľkosť" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Uplynulé" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Zostáva" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Počet" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Nepoužívať" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Predvolené" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Hostiteľ:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Argumenty socketu:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Prvok:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Po" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Ut" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "St" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Št" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pi" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "So" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Ne" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Povoliť plánovač" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Vypnúť" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- zastaviť všetky úlohy" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normálne" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- spustiť úlohu normálne" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Všetky" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Žiadne" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Označiť podľa filtra" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Označiť URL podľa hostiteľa a prípony súboru" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Toto obnoví všetky označené URL." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Hostiteľ" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Prípona súboru" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Základ hypertextových odkazov" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Označiť _všetko" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Neoznačiť _žiadne" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Označiť podľa filtra..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "napríklad" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Od:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Do:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "číslice:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_Od:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "citlivé na veľkosť písmen" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Žiadny znak divokej karty (*) v položke URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL nie je platná" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Žiadny znak v položkách 'Od' alebo 'Do'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Náhľad" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Používateľské rozhranie" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Šírka pásma" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Plánovač" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Zásuvný modul" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Ostatné" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Povoliť monitor schránky" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tichý režim" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Predvolený index kategórií" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Pridať do N-tej kategórie, ak nie je žiadna zodpovedajúca kategória" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorovať schránku pre konkrétne typy súborov:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Oddeľte typy pomocou znaku '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Tu môžete používať regulárne výrazy." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Potvrdenie" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Zobraziť potvrdovací dialóg pri ukončení" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Potvrdiť pri vymazávaní súborov" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Systémový panel" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Vždy zobraziť ikonu v oznamovacej oblasti" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimalizovať po štarte do oznamovacej oblasti" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Minimalizovať do panela po zavretí okna" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Použiť Ubuntu indikátor aplikácie" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Povoliť režim offline po štarte" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Oznámenie o začatí sťahovania" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Zvuk pri dokončení sťahovania" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Toto bude mať vplyv na všetky pluginy." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Globálne limity rýchlostí" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maximálna rýchlosť nahrávania" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maximálna rýchlosť sťahovania" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Dokončenie automatických akcií" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Vlastný príkaz:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Vlastný príkaz ak dôjde k chybe:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Automaticky ukladať" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minútach" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Nastavenia príkazového riadku" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Používať predvolene '--quiet'" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Plugin odpovedajúci zadaniu:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Možnosti pluginu Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Overovací tajný token RPC" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Globálne limity rýchlostí sú len pre aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Spustiť aria2 po štarte" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Vypnúť aria2 po ukončení" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Spustiť aria2 na lokálnom zariadení" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Umiestnenie" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenty" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Po zmene musíte reštartovať uGet." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Súbor" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Priečinok" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Položka" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Hodnota" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopírovať _všetko" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Zobraziť okno" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Režim offline" uget-2.2.2/po/uz@Latn.po0000664000175000017500000012653713470304402011752 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Akmal , 2015 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Uzbek (Latin) (http://www.transifex.com/uget/uget/language/uz@Latn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz@Latn\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Barcha turkum" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Ulanmoqda..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Uzatilmoqda..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Qayta urinish" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Yuklab olish jarayoni tugadi!" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Tugadi" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Davom ettirsa bo‘ladi" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Davom ettirib bo‘lmaydi" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Chiquvchi fayl nomini o‘zgartirib bo‘lmaydi" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "hostga ulana olmadi." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Jild yaratilmadi." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Fayl yaratilmadi (fayl nomi to‘g‘ri kelmaydi yoki shu nomdagi fayl mavjud)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Faylni ochib bo‘lmaydi." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Mavzu yaratilmadi." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Noto‘g‘ri manba (boshqa fayl hajmi)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Manbadan tashqari (disk to‘la yoki xotira yetishmayapti)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Chiquvchi fayl yo‘q." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Chiqish sozlamasi o‘rnatilmagan." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Juda ko‘p urinildi." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Mos kelmaydigan sxema (protokol)" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Mos kelmaydigan fayl." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: noma’lum xatolik yuz berdi." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: tanaffus yuz berdi." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: manba topilmadi." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 'resource not found' xatosining ko‘rsatilgan raqamini ko‘ring. --max-file-not-found tanlamasini ko‘ring" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: tezlik juda past." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: tarmoqda muammo yuz berdi." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: tugallanmagan yuklab olishlar." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Manbadan tashqari" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: fayl allaqachon mavjud. Ko‘ring: --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: o‘lcham nomi amalga oshmadi." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: ma’lumot havolasi hujjatini ajratib bo‘lmadi." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP buyrug‘i amalga oshmadi." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP javob bosh qatori juda yomon yoki kutilmaganda yuz berdi." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Juda ko‘p qayta yo‘naltirildi." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP tasdiqdan o‘tish amalga oshmadi." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI manzili yomon edi." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: masofaddagi server so‘rovni ishlay olmadi." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: JSON-RPC so‘rovi tahlil qilinmadi." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Javob bo‘lmadi. aria2 o‘chirilganmi?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid o‘chirilgan edi." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Yuklab olish menejeri" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "tarjima mualliflari" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet asoschisi: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet loyihasi menejeri: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "ta vazifa" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Almashish buferidan yangi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Yangi yuklab olish" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Almashish buferi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Buyruq qatori" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Xatolik yuz berdi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Yuklab olinayotganda xatolik yuz berdi." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Yuklab olish boshlanmoqda" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Yuklash navbati boshlanmoqda" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Yuklab olish tugadi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Barcha navbatga qo‘shilgan yuklab olishlar tugadi." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Holati" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Turkum" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Yangi yuklab olish yaratish" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Yangi _yuklanish..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Yangi _turkum..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Yangi almashish buferi _paketi..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Yangi _URL davomiylik paketi..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Yangi torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Yangi metahavola..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Barcha sozlamalarni saqlash" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Tanlangan yuklab olishni vaqtincha davom etadigan qilish" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Tanlangan yuklab olishni vaqtincha to‘xatsa bo‘ladigan qilish" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Tanlangan yuklab olish xossalarini o‘rnatish" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Tanlangan yuklab olishni yuqoriga o‘tkazish" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Tanlangan yuklab olishni pastga o‘tkazish" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Tanlangan yuklab olishni eng yuqoriga o‘tkazish" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Tanlangan yuklab olishni eng pastga o‘tkazish" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Yangi turkum" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Nusxa olish - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Turkum xossalari" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Yuklab olish xossalari" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Yangi Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Yangi metahavola" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Torrent faylini ochish" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Metahavola faylini ochish" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Turkum faylini saqlab bo‘lmadi." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Turkum faylini yuklash amalga oshmadi." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Turkum faylini saqlash" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Turkum faylini ochish" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Havola: " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Rasm: " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Matn fayli" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "URL manzillarni HTML faylidan import qilish" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "URL manzillarni matn faylidan import qilish" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "URL manzillarni matn fayliga eksport qilish" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL davomiyligi to‘plami" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Vaqtinchalik xotirada URL manzillar topilmadi." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Barcha URL manzillar mavjud." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Almashish buferi paketi" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Yangi" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Xato" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Xabar" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d ta element tanlandi" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "uGetters’ga diqqat qiling:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "uGet dasturini kelajakda rivojlantirish uchun xayriya loyihasini ishga tushirdik. Yordam berish uchun " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "BU YERGA BOSING!" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "uGet uchun tezkor foydalanuvchi so‘rovnomasini to‘ldirib bering, iltimos." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Yana soʻralmasin" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Oynalar:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fayl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Jildni tanlash" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Jild:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maksimal ulanishlar:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Yangilanadigan" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_auza" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Kirish" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Foydalanuvchi:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Parol:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Kuki fayli:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Kuki faylini tanlash" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post fayli" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Post faylini tanlash" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Foydalanuvchi agent" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Qayta urinish cheklovi:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "miqdori" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Qayta urinish _orasi:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "soniya" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maksimal yuklash tezligi:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maksimal yuklab olish tezligi:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fayl" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML faylni (.html) import qilish..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "Matn fayilga (.txt) eksport qilish..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "Turkumni _ochish..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "Turkumni _saqlash..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "_Barcha sozlamalarni saqlash" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Oflayn rejimi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "&Tahrirlash" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Vaqtinchqlik xotirani _nazorat qilish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Tugaganda keyingi amallar" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_O‘chirib qo‘yish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Uyquga ketish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "To‘xtatib turish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Tizimni o‘chirish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Qayta ishga tushirish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Boshqa" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Sozlamasi eslab qolish" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Yordam" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Sozlamalar..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Ko‘rinishi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Asboblar paneli" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Holat paneli" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Natija" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Elementlar natijasi" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nomi" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Jild" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Xabar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Yuklab olish _ustunlari" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Tugatish" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Hajmi" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Foiz '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Sarflangan vaqt" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Qolgan vaqt" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Tezlik" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Tezlikni oshirish" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Yuklandi" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Nisbat" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Qayta urinish" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Qo‘shilgan" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Tugallangan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Turkum" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Yangi turkum..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Turkumni o‘chirish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Yuklab olish" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Kiritilganni o‘chirish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Kiritilgan va _Faylni o‘chirish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "_Saqlangan jildni ochish" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Majburiy boshlash" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Ko‘chirish" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Muhimligi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Yuqori" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_O‘rtacha" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Past" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Onlayn yordam olish" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Qo‘llanma" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Yordam forumi" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Fikr bildirish" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Nosozlik haqida xabar berish" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Tugmalar birikmasi" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Yangilanishlar uchun tekshirish" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Sozlamalar" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "'%s' fayli uchun standart ilova dastur ishga tushmadi." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Ushbu jild mavjud emas." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "Bunday URI mavjud" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Ushbu URI mavjud. Davom etishni xohlaysizmi?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Umumiy" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Qo‘shimcha" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Turkum sozlamalari" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "1-yangi yuklab olish uchun standart" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Standart 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "nomsiz" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Vaqtincha to‘xtatildi" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Saytga yuklanmoqda" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Tugadi" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Chiqindiga tashlangan" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Navbatda" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Faol" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Barcha holat" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nomi" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Tugatish" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Hajmi" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "O‘tgan vaqt" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Qolgan vaqt" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Miqdori" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proksi:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Foydalanmang" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Standart" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Sokket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Sokket argumentlari:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Dush" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Sesh" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Chor" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Pay" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Jum" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Shan" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Yak" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Rejalashtirgichni _yoqish" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "O‘chirish" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- barcha vazifalarni to‘xtatish" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "O‘rtacha" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- vazifani o‘rtacha bajarish" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Barchasi" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Yo‘q" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Filter bo‘yicha belgilash" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URL manzillarni host va fayl nomi kengaytmasi bo‘yicha belgilash" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "U barcha URL belgilashlarni tiklaydi." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Fayl keng." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "_Barchasini belgilash" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "_Yo‘q deb belgilash" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "mas-n:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "raqamlar:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "katta-kichik harflarni farqlash" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL noto‘g‘ri." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Ko‘rinishi" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Foydalanish interfeysi" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Rejalashtirgich" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plagin" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Boshqalar" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Fayl turlarini ajratish uchun '|' belgisidan foydalaning." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Siz muntazam ifodalardan bu yerda foydalanishingiz mumkin." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Tasdiqlash" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Chiqishda tasdiqlash oynasini ko‘rsatish" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Fayllar o‘chirilayotganda tasdiqlash" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Tizim nishonchasi" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Global tezlik cheklovi" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maksimal yuklash tezligi" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maksimal yuklab olish tezligi" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Tugaganda keyingi amallar" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Boshqa buyruq:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Boshqa xato yuz bersa, boshqa buyruq:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Autosaqlash" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "daqiqa" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Buyruqlar qatori sozlamalari" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Joriy holat bo‘yicha '--quiet' buyrug‘ida foydalaning" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Plagin mosligi tartibi:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 plug-in moslamalari" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Faqat aria2 uchun global tezlik cheklov" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "aria2’ni tizim bilan birga ishga tushirish" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "aria2’dan chiqishda _o‘chirish" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "aria2’ni kompyuterda ishga tushirish" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Yo‘l" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumentlar" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "uGet moslangandan so‘ng qayta ishga tushirish kerak." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fayl" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Jild" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Element" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Qiymat" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "_Barchasidan nusxa olish" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Oynani ko‘rsatish" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Oflayn rejimi" uget-2.2.2/po/ka_GE.po0000664000175000017500000014203113470304402011326 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Giorgi Maghlakelidze , 2013 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/uget/uget/language/ka_GE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ka_GE\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "დაკავშირება..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "გადაცემა..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "ხელახლა" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "ჩამოტვირთვა დასრულებულია" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "დასრულებული" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "გაგრძელებადი" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "გაუგრძელებადი" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "გამომავალი ფაილის გადარქმევა შეუძლებელია." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "ჰოსტთან კავშირი ვერ დამყარდა." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "საქაღალდის შექმნა შეუძლებელია." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "ფაილის შექმნა შეუძლებელია (ფაილის დაუშვებელი სახელი აქვს, ან ის უკვე არსებობს)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "ფაილის გახსნა შეუძლებელია." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "რესურსი ამოიწურა (დისკი გავსებული არის, ან მეხსიერება არასაკმარისია)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "გამომავალი ფაილის გარეშე." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "გამომავალი პარამეტრის გარეშე." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "მეტისმეტად ბევრი ხელახალი ცდა." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "მხარდაუჭერელი სქემა (პროტოკოლი)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "მხარდაუჭერელი ფაილი." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "მეტისმეტად ბევრი გადამისამართება." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "ჩამოტვირთვების მმართველი" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Giorgi Maghlakelidze " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "დავალებები" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "ახალის შექმნა ბუფერიდან" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "ახალი ჩამოტვირთვა" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "ბუფერი" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "ბრძანების ველი" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "ჩამოტვირთვა იწყება" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "ჩამოტვირთვების რიგის დაწყება." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "ჩამოტვირთვა დასრულებულია" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "რიგში მდგომი ყველა ჩამოტვირთვა დასრულებულია." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "მდგომარეობა" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "კატეგორია" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "ახალი ჩამოტვირთვის შექმნა" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "ახალი _ჩამოტვირთვა..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "ახალი _კატეგორია..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "ახალი ჯგუფი _ბუფერიდან..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "ახალი _URL-თა მიმდევრობა..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "ახალი ტორენტი..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "ახალი მეტაბმული..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "არჩეული ჩამოტვირთვა გაშვებადია" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "არჩეული ჩამოტვირთვის შეჩერება" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "არჩეული ჩამოტვირთვის თვისებები" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "არჩეული ჩამოტვირთვის ზემოთ წაწევა" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "არჩეული ჩამოტვირთვის ქვემოთ წაწევა" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "არჩეული ჩამოტვირთვის თავში გადატანა" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "არჩეული ჩამოტვირთვის ძირში გადატანა" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "ახალი კატეგორია" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "ასლი - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "კატეგორიის თვისებები" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "ჩამოტვირთვის თვისებები" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "ახალი ტორენტი" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "ახალი მეტაბმული" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "ტორენტ ფაილის გახსნა" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "მეტაბმულიანი ფაილის გახსნა" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "ბმული " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "გამოსახულება " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "ტექსტური ფაილი" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "URL ბმულების შემოტანა HTML ფაილიდან" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "URL ბმულების შემოტანა ტექსტური ფაილიდან" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL-თა მიმდევრობის ჩამოტვირთვა" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "ბუფერში URL მისამართები არ მოიძებნა." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "ჯგუფი ბუფერიდან" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "შეცდომა" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "შეტყობინება" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "არჩეულია %d ელემენტი" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "ყურადღება, მომხმარებელო:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "ჩვენ ვატარებთ საქველმოქმედო აქციას uGet-ის მომავალი განვითარებისთვის, გვეწვიეთ" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "*აქ*" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "თუ არ შეწუხდებით, შეავსეთ uGet-ის მოკლე სამომხმარებლო გამოკითხვა." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "გამოკითხვისთვის დაწკაპეთ აქ " #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "კატეგორიის _სახელი:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "მოქმედი _ჩამოტვირთვები:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "დასრულებულის მოცულობა:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "გადაყრილის მოცულობა:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "გასვლა გსურთ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "დანამდვილებით გსურთ გასვლა?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "ფაილების წაშლა გსურთ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "დანამდვილებით გსურთ ფაილების წაშლა?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "სარკეები:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "ფაილი: " #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "საქაღალდის არჩევა" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_საქაღალდე:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "გადმოსვლის მისამართი:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_გაშვებადი" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "შე_ჩერება" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "ავტორიზება" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "სახელი:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "პაროლი:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "ფუნთუშას ფაილი:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "ფუნთუშას ფაილის არჩევა:" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "POST ფაილი:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "POST ფაილის არჩევა:" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "სამომხმარებლო აგენტი:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "ცდების _ზღვარი:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "ცდა" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "ცდების და_ყოვნება:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "წამი" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "ატვირთვის სიჩქარე არაუმეტეს:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "კიბ/წმ" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "ჩამოტვირთვის სიჩქარე არაუმეტეს:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "თარიღის ბეჭდის მიღება" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_ფაილი" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_ჯგუფური ჩამოტვირთვები" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "ჯგუფი ბუ_ფერიდან..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL-თა მიმდევრობა..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_ტექსტური ფაილის შემოტანა (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML ფაილის შემოტანა (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_ტექსტური ფაილის გატანა (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_ჩასწორება" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "ბუფერის _მეთვალყურე" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "ახლახანს ჩამოტვირთულის პარამეტრების გამოყენება" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_დახმარება" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_მომართვა..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_ხედი" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_ხელსაწყოთა ზოლი" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "მდგომარეობის ზოლი" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_შეჯამება" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "შეჯამებული _ელემენტები" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_სახელი" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_საქაღალდე" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_შეტყობინება" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "ჩამოტვირთვის _სვეტები" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_დასრულებული" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_ზომა" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_პროცენტი '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_გასული დრო" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_დარჩენილი დრო" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "სიჩქარე" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "ატვირთვის სიჩქარე" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "ათვირთულის ზომა" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "შეფარდება" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_ხელახლა" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "დამატების თარიღი" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "დასრულების თარიღი" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_კატეგორია" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_ახალი კატეგორია..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "კატეგორიის _წაშლა" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_ჩამოტვირთვა" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "ძალდატანითი დაწყება" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_გადატანა" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "დახმარების მოძიება ინტერნეტში" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "დამხმარე მასალა" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "მხარდაჭერის ფორუმი" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "უკუკავშირის გაგზავნა" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "შეცდომის გაგზავნა" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "განახლების შემოწმება" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "მომართვა" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "ვერ მოხერხდა '%s' ფაილის ნაგულისხმები პროგრამის გახსნა." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - საქაღალდე არ არსებობს." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "ზოგადი" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "გაღრმავებული" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "კატეგორიის მომართვა" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "ნაგულისხმები ახალი ჩამოტვირთვებისათვის 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "ნაგულისხმები 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "უსახელო" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "გადაყრილი" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "რიგში" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "მოქმედი" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "სახელი" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "დასრულებული" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "ზომა" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "გასული" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "დარჩენილი" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "ოდენობა" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "პროქსი:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "არ გამოიყენო" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "ნაგულისხმები" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "ჰოსტი:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "პორტი:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "სოკეტი:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "სოკეტის არგ-ბი:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "ელემენტ:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "ორშ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "სამ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "ოთხ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "ხუთ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "პარ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "საბ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "კვი" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "განრიგის _გამოყენება" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "გათიშვა" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- ყველა დავალების გაჩერება" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "ჩვეულებრივი" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- დავალებების ჩვეულებრივად შესრულება" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "ყველა" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "არაფერი" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "მონიშვნა ფილტრის მიხედვით" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URL ბმულების მონიშვნა ჰოსტისა და გაფართოების მიხედვით." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "ეს ჩამოყრის URL ბმულების მონიშვნას." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "ჰოსტი" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "გაფართოება" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "ძირეული ჰიპერტექსტული მიმართვა" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "_ყველას მონიშვნა" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "_არაფრის მონიშვნა" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_მონიშვნა ფილტრით..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "მაგ." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_გამომგზავნი:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "მიმღები:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "ციფრები:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "გამო_მგზავნი:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "რეგისტრის მიმართ მგძნობიარე" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL ბმულში არ მოიძებნება '*' ნიშანი." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL ბმული უმართებულოა." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "რომელიმე ველი, 'გამომგზავნი' ან 'მიმღები', ცარიელია." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "გადახედვა" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "განრიგი" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "დანამატი" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "სხვა" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_ჩუმი რეჟიმი" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "სახეობათა გაყოფისთვის გამოიყენეთ სიმბოლო '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "ასევე შეგიძლიათ გამოიყენოთ რეგულარული გამოსახულებები." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "დადასტურება ფაილების წაშლისას" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "სისტემურ არეში ხატულის ყოველთვის ჩვენება" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "ჩართვისას ჩაკეცვა სისტემურ არეში" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "ჩართვისას ხაზგარე რეჟიმის ამოქმედება" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "ჩამოტვირთვის დაწყების შეტყობინება" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "ხმა ჩამოტვირთვის დასრულებისას" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_შუალედი:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "წუთი" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "ბრძანებათა სტრიქონის მომართვა" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "ნაგულისხმებად '--quiet' არგუმენტის გამოყენება" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_ჩართვისას aria2-ის გაშვება" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_გათიშვისას aria2-ის გათიშვა" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "გზა" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "არგუმენტები" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "ფაილი" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "საქაღალდე" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "ელემენტი" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "სიდიდე" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "ყველას _ასლი" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "ფანჯრის ჩვენება" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_ხაზგარე რეჟიმი" uget-2.2.2/po/ja.po0000664000175000017500000014132713470304402010761 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Naofumi , 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-04-09 14:59+0000\n" "Last-Translator: Naofumi \n" "Language-Team: Japanese (http://www.transifex.com/uget/uget/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "パスワード マネージャー デーモン: uget\n\n%s に SSH 接続をしようとしたときに、既知の信頼済ホストファイルに対してホストキーを確認する際に、ホストキーが見つかりませんでした。\n\n既知の hosts ファイルに %s のホストキーを追加することで、この接続および将来の接続に対して信頼済として扱いますか?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "すべてのカテゴリー" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "接続中..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "送信中..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "リトライ" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "ダウロード完了" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "完了" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "再開可能" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "再開不可能" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "出力ファイルの名前を変更できません。" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "ホストに接続できません。" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "フォルダーを作成できません。" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "ファイルを作成できません (ファイル名が正しくないか、ファイルが存在します)。" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "ファイルを開くことができません。" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "スレッドを作成できません。" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "ソースが正しくありません (ファイルサイズが異なります)。" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "リソース不足 (ディスクフル、またはメモリ不足)。" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "出力ファイルがありません。" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "出力の設定がありません。" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "リトライ回数が多すぎます。" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "サポートされていない方式 (プロトコル)。" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "サポートされていないファイル。" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "投稿ファイルが見つかりません。" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "cookie ファイルが見つかりません。" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "このビデオは削除されました。" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "ビデオ情報の取得中にエラーが発生しました。" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "ビデオ Web ページの取得中にエラーが発生しました。" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "YouTube の URL に video_id が見つかりません。" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: 不明なエラーが発生しました。" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: タイムアウトが発生しました。" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: リソースが見つかりません。" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 は指定された数の 'リソースが見つかりません' というエラーを検出しました。 --max-file-not-found オプションを参照してください。" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: 速度が遅すぎます。" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: ネットワークの問題が発生しました。" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: ダウンロードが完了していません。" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "リソース不足" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: ピース長が .aria2 コントロールファイルのものと異なりました。" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 が同じファイルをダウンロードしていました。" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 が同じ情報ハッシュの torrent をダウンロードしていました。" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: ファイルがすでに存在します。 --allow-overwrite オプションを参照してください。" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: 既存のファイルを開くことができませんでした。" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: 新しいファイルを作成、または既存のファイルを削除できませんでした。" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: ファイル I/O エラーが発生しました。" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: 名前解決に失敗しました。" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: Metalink ドキュメントを解析できませんでした。" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP コマンドに失敗しました。" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP レスポンスヘッダーが間違っているか予期しないものでした。" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "リダイレクトが多すぎます。" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP 認証に失敗しました。" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: bencode されたファイル (通常 .torrent ファイル) を解析できませんでした。" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torrent ファイルが壊れているか、情報が不足していました。" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI が間違っています。" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: 間違った/認識できないオプションが指定されたか、予期しないオプション引数が指定されました。" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: リモートサーバーがリクエストを処理できませんでした。" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: JSON-RPC リクエストを解析できませんでした。" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "応答がありません。 aria2 がシャットダウンされていますか?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid が削除されました。" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "メディアリンクの取得に失敗しました。" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "一致するメディアがありません。" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "ダウンロードマネージャー" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "翻訳者のクレジット" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet 創設者: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet プロジェクトマネージャー: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "タスク" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "クリップボードから新規" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "新規ダウンロード" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "クリップボード" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "コマンドライン" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "エラーが発生しました" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "ダウンロード中にエラーが発生しました。" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "ダウンロードを開始しました" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "ダウンロードキューを開始しています。" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "ダウロード完了" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "すべてのキューのダウンロードが完了しました。" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "ステータス" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "カテゴリー" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "新規ダウンロードを作成" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "新規ダウンロード(_D)..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "新規カテゴリー(_C)..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "新規クリップボード一括(_b)..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "新規 _URL 順序一括..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "新規 Torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "新規 Metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "すべての設定を保存" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "選択したダウンロードを実行可能に設定する" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "選択したダウンロードを一時停止に設定する" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "選択したダウンロードのプロパティを設定する" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "選択したダウンロードを上に移動" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "選択したダウンロードを下に移動" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "選択したダウンロードを先頭に移動" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "選択したダウンロードを最後に移動" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "新規カテゴリー" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "コピー - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "カテゴリープロパティ" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "ダウンロードプロパティ" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "新規 Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "新規 Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Torrent ファイルを開く" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent ファイル (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Metalink ファイルを開く" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "カテゴリーファイルの保存に失敗しました。" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "カテゴリーファイルの読み込みに失敗しました。" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "カテゴリーファイルを保存" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "カテゴリーファイルを開く" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON ファイル (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "リンク " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "画像 " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "テキストファイル" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "HTML ファイルから URL をインポート" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML ファイル (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "テキストファイルから URL をインポート" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "プレーンテキストファイル" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "URL をテキストファイルにエクスポート" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL 順序一括" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "クリップボードに URL が見つかりません。" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "すべての URL が存在しています。" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "クリップボード一括" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "新規" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "エラー" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "メッセージ" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d アイテム選択済" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "注意 uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "uGet の未来の発展のために寄付ドライブを実行しています。クリックしてください" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ここ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "uGet の簡単なユーザーアンケートにご記入ください。" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "アンケートはここをクリックしてください" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "カテゴリー名(_n):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "アクティブなダウンロード数(_d):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "完了した容量:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "リサイクルの容量:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI 一致条件" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "一致したホスト(_H):" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "一致したスキーマ(_S):" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "一致したタイプ(_T):" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "本当に終了しますか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "終了してもよろしいですか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "本当にファイルを削除しますか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "ファイルを削除してもよろしいですか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "本当にカテゴリーを削除しますか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "カテゴリーを削除してもよろしいですか?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "今後表示しない" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "ミラー:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "ファイル:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "フォルダーを選択" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "フォルダー(_F):" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "リファラー:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "最大接続数(_M):" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "実行可能(_R)" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "一時停止(_a)" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "ログイン" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "ユーザー:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "パスワード:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookie ファイル:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Cookie ファイルを選択" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post ファイル:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Post ファイルを選択" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "User Agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "リトライ限度(_l):" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "回数" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "リトライ遅延(_d):" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "秒" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "最大アップロード速度:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "最大ダウンロード速度:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "タイムスタンプを取得" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "ファイル(_F)" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "一括ダウンロード(_B)" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "クリップボード一括(_C)..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL 順序一括..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "テキストファイルインポート(_T) (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML ファイルインポート (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "テキストファイルにエクスポート(_E) (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "カテゴリーを開く(_O)..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "名前を付けてカテゴリーを保存(_S)..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "すべての設定を保存(_a)" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "オフラインモード" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "編集(_E)" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "クリップボードモニター(_M)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "クリップボードを静かに動作" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "コマンドラインを静かに動作" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "既存の URI をスキップ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "最近のダウンロード設定を適用" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "完了自動操作(_A)" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "無効にする(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "休止状態" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "サスペンド" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "シャットダウン" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "再起動" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "カスタム" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "設定を記憶する" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "ヘルプ(_H)" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "設定(_S)..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "表示(_V)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "ツールバー(_T)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "ステータスバー" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "サマリー(_S)" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "アイテムのサマリー(_I)" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "名前(_N)" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "フォルダー(_F)" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "メッセージ(_M)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "ダウンロード列(_C)" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "完了(_C)" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "サイズ(_S)" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "パーセント(_P) '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "予測(_E)" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "残り(_L)" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "速度" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "アップ速度" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "アップロード済" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "レシオ" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "リトライ(_R)" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "追加" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "完了" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "カテゴリー(_C)" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "新規カテゴリー(_N)..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "カテゴリーを削除(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "ダウンロード(_D)" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "エントリを削除(_D)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "エントリとファイルを削除(_F)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "含むフォルダーを開く(_C)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "強制開始" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "移動(_M)" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "優先度" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "高(_H)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "通常(_N)" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "低(_L)" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "オンラインでヘルプを得る" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "ドキュメント" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "サポートフォーラム" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "フィードバックを送信" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "バグを報告" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "キーボードショートカット" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "更新を確認" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "設定" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "ファイル '%s' のデフォルトアプリケーションを起動できません。" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - このフォルダーが存在しません。" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI が存在していました" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "この URI は存在していました、続行してもよろしいですか?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "全般" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "詳細" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "カテゴリー設定" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "新規ダウンロードのデフォルト 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "デフォルト 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "名前なし" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "一時停止しました" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "アップロード中" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "完了" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "リサイクル" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "キュー中" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "アクティブ" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "すべてのステータス" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "名前" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "完了" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "サイズ" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "予測" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "残り" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "数量" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "プロキシ:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "使用しない" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "デフォルト" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "ホスト:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "ポート:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket 引数:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "要素:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "月" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "火" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "水" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "木" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "金" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "土" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "日" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "スケジューラ―を有効にする(_E)" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "オフにする" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- すべてのタスクを停止" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "通常" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- 通常でタスクを実行" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "すべて" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "なし" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "フィルターでマーク" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "ホストとファイル名の拡張子で URL をマークします。" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "これにより URL のすべてのマークがリセットされます。" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "ホスト" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "ファイル拡張子" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "ベースハイパーテキスト参照" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "すべてマーク(_A)" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "マークなし(_N)" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "フィルターでマーク(_M)..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "例" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "開始(_F):" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "終了:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "桁数:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "開始(_r):" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "大文字小文字を区別" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL エントリにワイルドカード(*) はありません。" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL が正しくありません。" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "'開始' または '終了' エントリに文字がありません。" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "プレビュー" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "ユーザーインターフェース" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "帯域幅" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "スケジューラ―" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "プラグイン" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "メディアウェブサイト" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "その他" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "クリップボードモニターを有効にする(_E)" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "静かモード(_Q)" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "デフォルトのカテゴリーインデックス" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "カテゴリーが一致しない場合、N番目のカテゴリーに追加します。" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "メディアウェブサイトの URL をモニター(_M)" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "指定したファイルタイプのクリップボードをモニター:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "文字 '|' でタイプを区切ります。" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "ここで正規表現を使うことができます。" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "確認" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "終了時に確認ダイアログを表示します" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "ファイルを削除するときに確認します" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "システムトレイ" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "常にトレイアイコンを表示" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "起動時にトレイに最小化" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "ウインドウを閉じる時にトレイに閉じる" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Ubuntu のアプリインジケーターを使用する" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "起動時にオフラインモードを有効にする" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "ダウンロード開始通知" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "ダウンロード完了時にサウンド" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "大きいアイコンを表示" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "これはすべてのプラグインに影響します。" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "グローバル速度制限" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "最大アップロード速度" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "最大ダウンロード速度" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "完了自動操作" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "カスタムコマンド:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "エラーが発生した場合のカスタムコマンド:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "自動保存(_A)" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "間隔(_I):" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "分" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "コマンドライン設定" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "デフォルトで '--quiet' を使用する" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "プラグインの一致順序:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 プラグインオプション" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC 認証のシークレットトークン" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "aria2 のみのグローバル速度制限" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "起動時に aria2 を起動(_L)" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "終了時に aria2 をシャットダウン(_S)" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "ローカルデバイスで aria2 を起動する" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "パス" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "引数" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "変更後に uGet を再起動する必要があります。" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "メディア一致モード:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "一致条件" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "品質:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "タイプ:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "ファイル" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "フォルダー" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "アイテム" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "値" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "すべてコピー(_A)" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "ウインドウを表示" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "オフラインモード(_O)" uget-2.2.2/po/sr@latin.po0000664000175000017500000013061113470304402012135 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # markosm , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/uget/uget/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Sve kategorije" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Povezivanje..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Šaljem..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Pokušaj ponovo" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Preuzimanje završeno" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Završeno" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Obnovljivo" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nije obnovljivo" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Izlazni fajl ne može biti preimenovan." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "nemoguće povezivanje sa računarom." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Fascikla ne može biti kreirana." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Fajl ne može biti kreiran (pogrešno ime ili fajl već postoji)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Fajl se ne može otvoriti" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nije moguće stvoriti nit." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Neispravan izvor (različita veličina fajla)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Premalo resursa (disk je pun ili nema dovoljno memorije)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nema izlaznog fajla." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nema izlazne postavke." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Previše ponovnih pokušaja." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nepodržana šema (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nepodržan fajl." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: dogodila se nepoznata greška." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: vremenska pauza." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: resursi nisu pronađeni." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 prijavljuje određeni broj 'resource not found' greški. Pogledaj --max-file-not-found opciju" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: brzina je vrlo spora." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: dogodio se problem sa mrežom." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: nezavršena preuzimanja." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Van resursa" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: dužina komada je različita od one u .aria2 kontrolnom fajlu." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 je preuzela isti fajl." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 je preuzela isti torent info." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: fajl već postoji. Pogledaj --allow-overwrite opciju." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: ne mogu otvoriti postojeći fajl." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: ne mogu kreirati novi fajl ili skratiti postojeći." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: dogodila se I/O greška." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: neuspelo imenovanje rezolucije." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: nije moguće analizirati Metalink dokument." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP komanda nije uspela." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP odgovor je loš ili neočekiva." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Previše preusmeravanja." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP autorizacija nije uspela." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: ne mogu analizirati fajl (obično .torrent fajl)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torent fajl je oštećen ili nedostaju informacije." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI je bio loš." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: data je loša/nepoznata opcija." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: udaljeni server nije mogao da obradi zahtev." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: nije moguće analizirati JSON-RPC zahtev." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Bez odgovora. Da li je aria2 ugašen?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid je uklonjen." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Menadžer preuzimanja" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "zasluge prevodilaca" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet osnivač:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet menadžer projekta: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "zadaci" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Novo iz klipborda" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Novo preuzimanje" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Klipbord" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Komandna linija" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Dogodila se greška" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Dogodila se greška kod preuzimanja." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Preuzimanje započinje" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Pokretanje preuzimanja na čekanju" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Preuzimanje završeno" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Sva preuzimanja sa popisa čekanja su završena." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Stanje" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorija" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Kreiraj novo preuzimanje" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Novo _preuzimanje..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nova _kategorija..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Novo iz _klipborda..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Novi _URL redosled linkova..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Novi torent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Novi meta-link..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Sačuvaj sva podešavanja" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Pokreni odabrano preuzimanje" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pauziraj odabrano preuzimanje" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Podesi svojstva odabranog preuzimanja" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Pomeri odabrano preuzimanje gore" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Pomeri odabrano preuzimanje dole" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Pomeri odabrano preuzimanje na vrh" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Pomeri odabrano preuzimanje na dno" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nova kategorija" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopiraj - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Svojstva kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Svojstva preuzimanja" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Novi torent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Novi meta-link" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Otvori torent fajl" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Otvori meta-link fajl" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Neuspelo čuvanje fajla kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Neuspelo učitavanje kategorije fajla." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Sačuvaj fajl kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Otvori fajl kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Link " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Slika " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Tekstualni fajl" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Uvezi URL-ove iz HTML fajla" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Uvezi URL-ove iz tekstualnog fajla" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Izvezi URL u tekstualni fajl" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL Redosled linkova" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Bez URL-a pronađenih u klipbordu." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Sve URL adrese su postojeće." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Iz klipborda" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Novo" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Greška" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Poruka" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Odabrano %d stavki" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Pažnja uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "pokrenuli smo prikupljanje donacija za budući razvoj uGet-a, molim kliknite " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "OVDE" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "molimo popunite ovu kratku korisničku anketu za uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "kliknite ovde za početak ankete" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Ime _kategorije:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktivna _preuzimanja:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacitet završenog:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacitet obrisanog:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI podudarajući uslovi" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Podudareni _hostovi:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Podudarene _šeme:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Podudareni _režimi:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Stvarno želite izaći?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Da li ste sigurni da želite izaći?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Stvarno želite obrisati fajlove?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Da li ste sigurni da želite obrisati fajlove?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Stvarno želite obrisati kategoriju?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Da li ste sigurni da želite obrisati kategoriju?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Ne pitaj me ponovo" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Serveri:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fajl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Odaberi fasciklu:" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Fascikla:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Izvor tranzicije:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maks konekcija:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Pokreni" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_auza" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Prijava" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Korisnik:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Lozinka:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Fajl kolačića:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Odaberi fajl kolačića" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Poštanski fajl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Odaberi poštanski fajl" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Korisnički zastupnik" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Ograničenje _pokušaja:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "pokušaja" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Odgađanje _pokušaja:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekundi" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maksimalna brzina otpremanja:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maksimalna brzina preuzimanja:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Prihvati vremenske oznake" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fajl" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Paketna preuzimanja" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Iz klipborda..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL redosled linkova..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Uvoz tekstualnog fajla (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Uvoz HTML fajla (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Izvoz u tekstualnom fajlu (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Otvori kategoriju..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Sačuvaj kategoriju kao..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Sačuvaj _sva podešavanja" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Režim van mreže" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Uredi" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Klipbord _monitor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Klipbord radi u pozadini" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Komandna linija radi u pozadini" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Preskoči postojeći URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Primeni nedavne postavke preuzimanja" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Završene _auto-akcije" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Onemogući" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Uspavaj" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Suspenduj" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Napusti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Ponovo pokreni" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Prilagođeno" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Zapamti podešavanja" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Pomoć" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Postavke..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Pregled" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Traka alata" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Statusna traka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sažetak" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Stavke _sažetka" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Ime" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Fascikla" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Poruka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Kolone _preuzimanja" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Završeno" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Veličina" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procenat '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Prošlo vremena" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Levo" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Brzina" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Brzina otpreme" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Otpremljeno" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Odnos" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Pokušaj ponovo" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Dodato" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategorija" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nova kategorija..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Obriši kategoriju" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Preuzimanje" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Obriši stavku" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Obriši stavku i _fajl" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Otvori _sadržajnu fasciklu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Prisili pokretanje" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Premesti u" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Visok" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normalan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Nizak" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Potražite pomoć na mreži" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentacija" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Forum za podršku" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Pošaljite povratnu informaciju" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Prijavite greške" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Prečice tastature" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Proverite ažuriranja" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Postavke" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Nemoguće pokretanje podrazumevane aplikacija za fajl '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Ova fascikla ne postoji." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI postoji" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Ovaj URI postoji, da li želite da nastavite?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Opšte" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Napredno" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Postavke kategorije" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Podrazumevano za novo preuzimanje 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Podrazumevano 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "bezimeno" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pauzirano" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Otpremanje" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Obrisano" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Na čekanju" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktivno" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Svi statusi" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Ime" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Veličina" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Pokrenuto" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Količina" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proksi:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Ne koristi" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Podrazumevano" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Računar:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Utičnica:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Utičnica args:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Pon" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Uto" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Sre" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Čet" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pet" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sub" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Ned" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Omogući raspored" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Isključi" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- zaustavi sve zadatke" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normalno" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- normalno pokreni zadatak" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Sve" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nepoznato" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Označi prema filteru" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Označi URL-ove prema računaru i vrsti fajla." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Ovo će resetovati sve označene URL-ove." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Računar" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Vrsta fajla" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Osnovna hipertekst preporuka" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Označi _sve" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Označi _ništa" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Označi prema filteru..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "npr." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Od:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Na:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "brojevi:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "O_d:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "mala-velika slova" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Bez zamenskih(*) karaktera u URL unosu." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL nije ispravan." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Nema znakova u 'Od' ili 'Na' unosu." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Pregled" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Korisničko sučelje" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Protok" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Raspored" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Dodatak" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Ostalo" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Omogući klipbord monitor" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tihi režim" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Podrazumevani indeks kategorije" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Dodavanje u Nth kategoriju ako se ne podudaraju." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitor klipborda za određeni tip fajla:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Razdvoj vrste fajlova sa znakom '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Možete koristiti uobičajene izraze ovde." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Potvrda" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Prikaži dijalog potvrde na izlasku" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Potvrdi pri brisanju fajlova" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Sistemska kaseta" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Uvek prikaži ikonu u sistemskoj kaseti" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Smanji u sistemsku kasetu po pokretanju" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Spusti u sistemsku kasetu kad zatvoriš prozor" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Koristi Ubuntu indikator" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Omogući na početku režim van mreže" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Obaveštenje o početku preuzimanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Zvuk kada se završi preuzimanje" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Ovo će uticati na sve dodatke." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Opšte ograničenje brzine" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maks brzina otpremanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maks brzina preuzimanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Završene auto-akcije" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Prilagođena komanda:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Prilagođena komanda ako se dogodi greška:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Automatsko čuvanje" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minuta" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Postavke komandne linije" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Koristi '--quiet' kao podrazumevano" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Poredak povezivanja:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 opcije povezivanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC tajno pitanje za autorizaciju" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Opšte ograničenje brzine samo za aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Pokreni aria2 na početku" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Isključi aria2 na izlazu" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Pokreni aria2 na lokalnom uređaju" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Putanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenti" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Morate ponovo pokrenuti uGet nakon izmena." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fajl" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Fascikla" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Stavka" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Vrednost" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopiraj _sve" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Prikaži prozor" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Režim van mreže" uget-2.2.2/po/ChangeLog0000664000175000017500000000115213470304401011567 00000000000000Current translation files: https://www.transifex.com/projects/p/uget/ Former Translators: * ar.po: Arabic - Safa Alfulaij * be.po: Belarusian - Mihas Varantsou * cs.po: Czech - Přelozil:WastingDouglas * de.po: German - Alexander Haeussler * es.po: Spanish - Victor Emmanuel * hu.po: Hungarian - Kurják Richárd * fr.po: French - jc1 * it.po: Italian - Giovanni Santini * pl.po: Polish - Miś Uszatek * ru.po: Russian - Mihas Varantsou * tr.po: Turkish - Yiğit Ateş * uk.po: Ukrainian - Сергій Дубик * zh_CN.po: Simplified Chinese - Liu Hao * zh_TW.po: Traditional Chinese - C.H. Huang uget-2.2.2/po/hr.po0000664000175000017500000012444113470304402010776 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # gogo , 2015 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Croatian (http://www.transifex.com/uget/uget/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Sve kategorije" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Povezivanje..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Prenošenje..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Pokušaj ponovno" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Preuzimanje završeno" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Završeno" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Izlazna datoteka ne može biti preimenovana." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Nemoguće povezivanje s računalom." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Mapa ne može biti stvorena" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Datoteka ne može bit stvorena (pogrešan naziv datoteke ili datoteka ne postoji)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Datoteka se ne može otvoriti" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Neispravan izvor (drugačija veličina datoteke)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Premalo resursa (nema slobodnog prostora na disku ili nema dovoljno memorije)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nema izlazne datoteke." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nema izlazne postavke." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Previše ponovnih pokušaja" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nepodržana shema (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nepodržana datoteka." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: dogodila se nepoznata greška." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: istek vremena." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: izvor nije pronađen." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Previše preusmjeravanja." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Upravitelj preuzimanja" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "prevoditelj-zasluge" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet osnivač: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet Upravitelj projektom " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "zadaci" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Novo iz međuspremnika" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Novo preuzimanje" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Međuspremnik" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Naredbeni redak" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Nastala je greška" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Nastala je greška pri preuzimanju." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Preuzimanje započinje" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Pokretanje preuzimanja u popisu čekanja." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Preuzimanje završeno" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Sva preuzimanja s popisa čekanja su završena." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Stanje" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorija" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Stvori novo preuzimanje" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Novo _preuzimanje..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nova _kategorija..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Novi torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nova metapoveznica..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Spremi sve postavke" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Pokreni odabrano preuzimanje" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pauziraj odabrano preuzimanje" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Prikaži svojstva odabranog preuzimanja" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Pomakni odabrano preuzimanje gore" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Pomakni odabrano preuzimanje dolje" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Pomakni odabrano preuzimanje na vrh" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Pomakni odabrano preuzimanje na dno" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nova kategorija" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopiraj - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Svojstva kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Svojstva preuzimanja" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Novi torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nova metapoveznica" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Otvori datoteku torrenta" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Otvori datoteku metapoveznice" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Neuspjelo spremanje datoteke kategorije." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Neuspjelo učitavanje datoteke kategorije." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Spremi datoteku kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Otvori datoteku kategorije" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Poveznica " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Slika " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Tekstna datoteka" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Uvezi URL-ove s HTML datoteke" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Uvezi URL-ove s tekstne datoteke" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Izvezi URL-ove u tekstnu datoteku" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nema pronađenih URL-ova u međuspremniku." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Svi URL-ovi su postojali." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Greška" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Poruka" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Odabrano %d stavki" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Pozor uGetteri:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "pokrenuli smo prikupljanje donacija za budući razvoj uGet-a, kliknite ovdje" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "OVDJE" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "ispunite ovu brzu koriničku anketu za uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "kliknite ovdje za početak ankete" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Naziv _kategorije:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktivna _preuzimanja:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacitet završenog:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacitet obrisanog:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Stvarno želite izaći?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Jeste li sigurni da želite izaći?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Sigurno želite obristai datoteke?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Jeste li sigurni da želite obristi datoteke?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Sigurno želite obristai kategoriju?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Jeste li sigurni da želite obristi kategoriju?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Ne pitaj me ponovno" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Zrcalni poslužitelji:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Datoteka:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Odaberi mapu" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Mapa:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maksimalno veza:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Pokreni" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_auza" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Prijava" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Korisnik:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Lozinka:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Datoteka kolačića:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Odaberi datoteku kolačića" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Korisnički agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Ograničenje _pokušaja:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "pokušaja" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Odgoda _pokušaja:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekundi" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maks brzinja slanja:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maks brzina preuzimanja" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Prihvati vremenske oznake" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Datoteka" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Uvoz tekstne datoteke (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Uvoz HTML datoteke (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Izvoz tekstne datoteke (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Otvori kategoriju..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Spremi kategoriju kao..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Spremi _sve postavke" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Uredi" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Nadgledanje _međuspremnika" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Primijeni nedavne postavke preuzimanja" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Prilagođeno" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Zapamti postavke" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Pomoć" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Postavke..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Pogled" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Alatna traka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Statusna traka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sažetak" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Stavke _sažetka" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Naziv" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Mapa" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Poruka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Stupci _preuzimanja" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Završeno" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Veličina" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Posto '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Pokrenuto" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Preostalo" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Brzina" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Brzina slanja" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Poslano" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Omjer" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Pokušaj ponovno" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Dodano" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategorija" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nova kategorija..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Obriši kategoriju" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Preuzimanje" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Otvori _sadržajnu mapu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Prisili pokretanje" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Premjesti u" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Visok" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normalan" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Nizak" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Potražite pomoć online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentacija" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Forum podrške" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Prijavite povratnu informaciju" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Prijavite grešku" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Prečaci tipkovnice" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Provjerite ažuriranja" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Postavke" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Nemoguće pokretanje zadane aplikacije za datoteku '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Ova mapa ne postoji." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Općenito" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Napredno" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Postavke kategorije" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Zadano za novo preuzimanje 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Zadano 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "bezimeno" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pauzirano" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Slanje" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Obrisano" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Na čekanju" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktivno" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Sva stanja" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Naziv" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Veličina" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Pokrenuto" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Završeno" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Kvantiteta" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Ne koristi" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Zadano" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Računalo:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Ulaz:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Pon" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Uto" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Sri" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Čet" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pet" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sub" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Ned" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Omogući raspored" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Isključi" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- zaustavi sve zadatke" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normalno" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- pokreni zadatak normalno" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Sve" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nepoznato" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Označi prema filteru" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Označi URL-ove prema računalu I vrsti datoteke." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Računalo" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Vrsta datoteke." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Osnovna hipertekst preporuka" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Označi _sve" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Označi _ništa" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Označi prema filteru..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "npr." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Od:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Na:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "znamenka:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "O_d:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "velika-mala slova" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Bez zamjenskih(*) znakova u URL unosu." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL nije valjan." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Nema znakova u 'Od' ili 'Na' unosu." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Pregled" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Korisničko sučelje" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Raspored" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Dodatak" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Ostalo" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Omogući nadgledanje međuspremnika" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tihi način" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "_Nadgledaj međuspremnik za određene vrste datoteka:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Razdvoji vrste datoteka sa znakom '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Možete koristiti uobičajene izraze ovdje." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Potvrda" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Prikaži dijalog potvrde pri izlazu" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Potvrdi pri brisanju datoteka" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Traka sustava" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Uvijek prikaži ikonu trake sustava" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Smanji u traku sustava pri pokretanju" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Smanji u traku sustava pri zatvaranju prozora" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Korisit Ubuntu App Indikator " #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Omogući odspojeni način pri pokretanju" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Obavijest pokretanja preuzimanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Zvuk završetka preuzimanja" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minuta" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Postavke naredbenog redka" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Koristi '--quiet' kao zadano" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Pokreni aria2 pri pokretanju" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Zatvori aria2 na izlazu" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Putanja" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenti" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Datoteka" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Mapa" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Stavka" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Vrijednost" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopiraj _sve" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Prikaži prozor" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Odspojen naćin" uget-2.2.2/po/cs.po0000664000175000017500000013346113470304402010774 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Alois Nešpor , 2014 # Radoslav Klein , 2017 # ToMáš Marný, 2013 # ToMáš_Marný, 2013 # wastingdouglas , 2011 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: ToMáš Marný\n" "Language-Team: Czech (http://www.transifex.com/uget/uget/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Password Manager Daemon: uget\n\nPři pokusu o SSH připojení k %s došlo k problému s ověřením klíče, protože klíč nebyl nalezen ve známém a důvěryhodném seznamu známých hostitelů.\n\nChcete tohoto připojení označit jako důvěryhodné pro toto i budoucí připojení přidáním tohoto %s klíče do seznamu známých hostitelů?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Všechny kategorie" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Připojování..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Přenášení..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Opakovat" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Stahování dokončeno" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Dokončeno" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Možno pokračovat" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Není možné pokračovat" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Výstupní soubor nemohl být přejmenován." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Není možné se připojit na hosta." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Složka nemohla být vytvořena" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Soubor nemohl být vytvořen (špatné jméno souboru nebo soubor již existuje)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Soubor nemohl být otevřen." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nepodařilo se vytvořit vlákno." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Chybný zdroj (velikost souboru je jiná)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Nedostatek prostředků (plný disk nebo nedostatek paměti)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Žádný výstupní soubor." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Chybí nastavení výstupu." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Příliš mnoho opakování." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nepodporované schéma (protokol)" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nepodporovaný soubor." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "post soubor nenalezen." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "cookie soubor nenalezen." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Toto video bylo odstraněno." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Při získávání informací o videu došlo k chybě." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Při získávání webové stránky videa došlo k chybě." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "V URL YouTube nebylo nalezeno video_id." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: vyskytla se neznámá chyba." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: vypršel časový limit" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: zdroj nebyl nalezen." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 chyba v zadaném počtu 'zdroj nebyl nalezen'. Podívejte se na volbu --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: rychlost byla příliš pomalá." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: nastal problém se sítí" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: nedokončené stahování." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr " Nedostatek zdrojů či prostředků" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: velikost jednoho dílu je rozdílná než v kontrolním souboru." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 stáhla stejný soubor." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 stáhla stejný info hash torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: soubor již existuje. Podívjte se na volbu --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: nelze otevřít existující soubor." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: nelze vytvořit nový soubor." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: nastala chyba I/O souboru." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: rozlišení jména selhalo." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: nelze parsovat Metalink dokument." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP příkaz selhal." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP hlavička je chybná nebo neočekávaná." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Příliš mnoho přesměrování." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: selhala HTTP autorizace." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: nelze parsovat soubor (obvykle .torrent soubor)" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: soubor torrentu je poškozený nebo v něm chybí potřebné informace." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI je chybný." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: byl zadán špatná nebo nerozpoznatelná volba, případně špatný argument volby" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: vzdálený server neodpovídá na žádost." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: nelze parsovat JSON-RPC." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Žádná odezva. Je aria2 vypnuta?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid byl odstraněn." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Nepodařilo se získat mediální odkaz." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Žádná odpovídající média." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Správce stahování" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Tomáš Marný, Alois Nešpor" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Zakladatel uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Projektový manažer uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "úkoly" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nové ze schránky" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nové stahování" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Schránka" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Příkazová řádka" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Vyskytla se chyba" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Vyskytla se chyba během stahování." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Stahování začalo" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Začíná se stahovat fronta." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Stahování dokončeno" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Všechna stahovaní fronty byla dokončena." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Stav" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorie" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Vytvořit nové stahování" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nové _stahování..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nová _kategorie..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Nové _hromadné ze schránky..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nová hromadná _URL sekvence..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nový torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nový metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Uložit veškeré nastavení" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Spustit vybrané stahování" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pozastavit vybrané stahování" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Nastavit vlastnosti vybraného stahování" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Posunout vybrané stahování nahoru" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Posunout vybrané stahování dolů" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Posunout vybrané stahování na vrchol" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Posunout vybrané stahování na spod" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nová kategorie" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopírovat - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Vlastnosti kategorie" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Vlastnosti stahování" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nový torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nový metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Otevřít torrent soubor" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent soubor (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Otevřít soubor metalinku" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Nepodařilo se uložit soubor kategorií." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Nepodařilo se otevřít soubor kategorií." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Uložit soubor kategorií" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Otevřít soubor kategorií" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON soubor (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Odkaz " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Obrázek " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Textový soubor" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importovat URL z HTML souboru" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML soubor (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importovat URL z textového souboru" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Prostý text" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exportovat URL do textového souboru" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL sekvence hromadně" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Ve schránce nebyla nalezena žádná URL adresa." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Všechny URL existují." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Schránka hromadně" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nový" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Chyba" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Zpráva" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Vybráno %d položek" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Upozornění uživatelům uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Sbíráme dary k financování budoucích verzí uGet, prosíme klikněte" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ZDE" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "vyplňte prosím tento krátký uživatelský průzkum o uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "klikněte sem a zahajte průzkum" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Název kategorie:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktivní _stahování:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacita dokončeného:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacita koše:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Odpovídající podmínky URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Odpovídající _hosté:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Odpovídající _schémata:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Odpovídající _typy:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Skutečně skončit?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Opravdu chcete skončit?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Skutečně smazat soubory?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Opravdu chcete soubory smazat?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Skutečně smazat kategorii?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Opravdu chcete smazat kategorii?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Neptat se znovu" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Zrcadla:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Soubor:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Vybrat složku" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Složka:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Referrer:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maximálních připojení:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Běžící" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "Pozast_aveno" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Přihlášení" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Uživatel:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Heslo:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Soubor cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Vyberte soubor cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Publikovat soubor:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Vyberte publikovaný soubor" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Uživatelský klient:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Limit opakování:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "počet" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Zpož_dění opakování:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekund" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Max. rychlost odesílání:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Max. rychlost stahování:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Načíst časové razítko" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Soubor" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Dávková stahování" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Hromadně ze _schránky..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Hromadně _URL sekvence..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importovat _textový soubor (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importovat _HTML soubor (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportovat _textový soubor (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Otevřít kategorii..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Uložit kategorii jako..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Uložit _veškeré nastavení" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Offline režim" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Upravit" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Monitor schránky" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Schránka pracuje tiše" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Příkazový řádek pracuje tiše" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Přeskočit existující URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Použít nastavení posledního stahování" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Dokončení _automatických akcí" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Zakázat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernovat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Uspat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Vypnout" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Restartovat" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Vlastní" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Zapamatovat nastavení" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Nápověda" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Nastavení..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Zobrazit" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Panel nástrojů" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Stavový řádek" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Shrnutí" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Shrnutí _položek" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Název" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Složka" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Zpráva" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Slou_pec stahování" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Dokončeno" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Velikost" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Čas běhu" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Zbývá" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Rychlost" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Rychl. odes." #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Odesláno" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Poměr" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Opakování" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Přidáno" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Dokončeno" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategorie" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nová kategorie..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Smazat kategorii" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Stahování" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Smazat položku" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Smazat položku a _soubor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Otevřít _cílovou složku" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Vynutit start" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Přesunout do" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorita" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Vysoká" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normální" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Nízká" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Získat pomoc online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentace" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Fórum s podporou" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Odeslat zpětnou vazbu" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Nahlásit chybu" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Zkontrolovat aktualizace" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Nastavení" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Není možné spustit výchozí aplikaci pro soubor %s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Tato složka neexistuje." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI existuje" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Toto URI existuje, chcete opravdu pokračovat?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Hlavní" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Pokročilé" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Nastavení kategorie" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Výchozí pro nové stahování 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Výchozí 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "bezejmenný" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pozastaveno" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Odesílání" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Kompletní" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "V koši" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Ve frontě" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktivní" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Všechny stavy" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Název" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Kompletní" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Velikost" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Čas běhu" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Zbývá" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Počet" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Nepoužít" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Výchozí" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Argumenty socketu:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Po" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Út" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "St" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Čt" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pá" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "So" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Ne" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Aktivovat plánovač" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Vypnout" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- zastavit všechny úkoly" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normální" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- spustit úkoly normálně" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Vše" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nic" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Označit podle filtru" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Označit URL podle hosta a připony souboru." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Toto resetuje všechna označená URL." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Přípona souboru." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Základ hypertextových odkazů" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Ozn_ačit vše" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Neoznačit _nic" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Označit podle filtru..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "například" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Od:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Do:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "číslice:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "O_d:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "citlivé na velikost písmen" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Žádné wildcard(*) znaky v URL adrese." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL není platné." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Žádné znaky v položkách 'Od' nebo 'Do'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Náhled" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Uživatelské rozhraní" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Šířka pásma" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Plánovač" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Zásuvný modul" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Webová stránka médií" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Ostatní" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Zapnout monitor schránky" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tichý režim" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Výchozí index kategorií" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Přidat do Nth kategorie, pokud není žádná odpovídající kategorie." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Sledovat URL adresy médií na webových stránkách " #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorovat schránku pro stanovené typy souboru:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Rozdělte typy znakem '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Můžete použít regulární výrazy." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Potvrzení" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Zobrazit potvrzovací dialog při ukončení" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Potvrdit při mazání souborů" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Systémová lišta" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Vždy zobrazit ikonu v oznamovací oblasti" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Při startu minimalizovat do oznamovací oblasti" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Při zavření okna minimalizovat do lišty" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Použít Ubuntu App indikátor" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Při startu aktivovat offline režim" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Signalizace startu stahování" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Zvuk po dokončení stahování" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Zobrazovat velké ikony" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "To bude mít vliv na všechny zásuvné moduly." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Globální limit rychlosti" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Max. rychlost odesílání" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Max. rychlost stahování" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Dokončení automatických akcí" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Vlastní příkaz:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Vlastní příkaz, když se vyskytne chyba:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Automatické uložení" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minut" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Nastavení příkazové řádky" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Ve výchozím nastavení použít '--quiet'" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Zásuvný modul odpovídající zadání:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Volby zásuvného modulu Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC autorizační tajný token" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Globální limit rychlosti pouze pro Aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Spustit aria2 při startu" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Vypnout aria2 po ukončení" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Spustit aria2 na lokálním zařízení" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Cesta" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenty" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Po úpravě musíte uGet restartovat." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Režim přizpůsobení médií:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Odpovídající podmínky" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Kvalita:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Typ:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Soubor" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Složka" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Položka" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Hodnota" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopírov_at vše" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Zobrazit okno" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Offline režim" uget-2.2.2/po/vi.po0000664000175000017500000013211313470304402010776 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tran Thai Hoa , 2015 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Vietnamese (http://www.transifex.com/uget/uget/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Danh mục" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Đang kết nối..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Đang truyền dữ liệu..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Thử lại" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Tải về hoàn tất" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Đã xong" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Có thể phục hồi lại" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Không thể phục hồi lại" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Không thể đổi tên tập tin đầu ra." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "không thể kết nối đến máy chủ." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Không thể tạo thư mục." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Không thể tạo thư mục (tên tập tin không hợp lệ hoặc tập tin không tồn tại)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Không thể mở tập tin." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Không thể tạo tiến trình" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Nguồn không chính xác(dung lượng tệp khác nhau)" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Nguồn tài nguyên bị giới hạn (ổ đĩa không đủ dung lượng hoặc không đủ bộ nhớ)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Không có tập tin đầu ra." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Không có thiết lập dành cho việc xuất dữ liệu." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Quá nhiều lần cố gắng tải lại." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Giản đồ không được hỗ trợ (giao thức)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Tập tin không được hỗ trợ" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: Lỗi không xác định" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: Qúa thời gian" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: Nguồn không tồn tại" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: Tốc độ qúa chậm" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: Mạng có vấn đề" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: Không hoàn thành tải" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Vượt qúa tài nguyên" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 đang tải tệp tương tự" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Quá nhiều lần chuyển hướng." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP xác thực thất bại" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: tệp torrent bị lỗi hoặc thiếu thông tin" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI qúa tệ" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Không có phản hồi. Aria2 sẽ tắt?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Trình quản lý" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Dự án Vetati" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "các tác vụ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Tạo phần tải về mới từ bộ nhớ ảo" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Tạo một phần tải về mới" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Bộ nhớ ảo" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Chế độ dòng lệnh" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Xảy ra lỗi" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Lỗi trong khi tải" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Đang bắt đầu tải về" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Đang bắt đầu tải về đối tượng trong danh sách đợi." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Tiến Trình Tải Về Đã Hoàn Tất" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Tiến trình tải về của toàn bộ các đối tượng trong danh sách đợi đã được hoàn tất." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Trạng thái" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Phân loại" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Tạo một phần tải về mới" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Tạo phần tải _về mới..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Tạo _phân loại mới..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Truyền dữ liệu mới _từ bộ nhớ ảo..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Tạo chuỗi đường dẫn liên tiếp _mới..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Tạo torrent mới..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Tạo mới metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Lưu toàn bộ thiết lập" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Chỉnh các các phần tải về đã chọn có thể chạy được" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Chỉnh các các phần tải về đã chọn có thể tạm dừng được" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Chỉnh thuộc tính các các phần tải về đã chọn" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Di chuyển các phần tải về đã chọn lên trên" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Di chuyển các phần tải về đã chọn xuống dưới" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Di chuyển các phần tải về đã chọn lên trên cùng" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Di chuyển các phần tải về đã chọn xuống dưới cùng" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Phân loại mới" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Sao chép -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Thuộc tính của phân loại" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Thuộc tính tải về" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Tạo torrent mới" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Tạo mới metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Mở tập tin torrent" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Mở tập tin metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Liên kết" #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Hình ảnh" #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Tập tin Văn bản" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Nhập đường dẫn liên kết từ tập tin HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Nhập đường dẫn liên kết từ tập tin văn bản" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Chuỗi đường dẫn liên tiếp" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Không tìm thấy chuỗi đường dẫn liên tiếp trong bộ nhớ ảo." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Chuyển dữ liệu từ bộ nhớ ảo sang" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Mới" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Xảy ra lỗi" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Thông báo" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Đã chọn %d đối tượng" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Xin người dùng lưu ý:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "chúng tôi hiện đang nhận sự ủng hộ tài chính để có thể phát triển dự án hơn nữa, hãy click vào" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "TẠI ĐÂY" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "hãy điền vào bảng khảo sát sau đây" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "hãy click vào đây để tham gia khảo sát" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Tên _phân loại:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Các _phần tải về đang được thực thi:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Mức độ hoàn thành:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Công suất tái chế:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Bạn muốn thoát?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Bạn muốn thoát hoàn toàn khỏi chương trình?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Bạn có muốn thực sự xóa những tập tin này?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Bạn có thực sự muốn xóa những tập tin này hay không?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Bạn muốn xóa mục này?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Bạn muốn xóa mục này?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Không yêu cầu lần nữa" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Phần phụ:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Tập tin:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Chọn thư mục" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Thư mục:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Phần tham chiếu:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Kết nối tối đa:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Có thể chạy được" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "Tạ_m ngưng" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Đăng nhập" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Người dùng:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Mật khẩu:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Các tập tin cookie:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Chọn tập tin Cookie" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Tập tin post:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Chọn tập tin post" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Người đại diện:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Giới hạn số lần thử lại:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "số lầ" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Độ trễ khi _thử lại:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "giây" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Tốc độ tải lên tối đa:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/giây" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Tốc độ tải về tối đa:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Lưu lại dấu thời gian" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Tập tin" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Tải về liên tiếp" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Chuyển liên tiếp dữ liệu từ bộ nhớ ảo sang" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Chuỗi đường dẫn liên tiếp..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Nhập dữ liệu từ tập tin văn bản (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_Nhập dữ liệu từ tập tin HTML (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Xuất dữ liệu sang tập tin dạng văn bản (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Chế độ không kết nối" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Chỉnh sửa" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Quản lý bộ _nhớ ảo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Áp dụng các thiết lập tải về gần đây" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Tắt" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Khởi động lại" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Mặc định" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Lưu cài đặt" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Dịch bởi Vetati" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Thiết lập..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Chế độ hiển thị" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Thanh công cụ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Thanh trạng thái" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Tóm tắt:" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Tóm tắt _các đối tượng" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Tên" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Thư mục" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_Đường dẫn liên kết" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Thông báo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Cột hiển thị tải _về" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Hoàn tất" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Kích thước" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Phần trăm '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Đã trôi qua" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Còn lại" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Tốc độ" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Tốc độ tải lên" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Đã tải lên" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Tỉ lệ" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Thử lại" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "_Được thêm vào" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "_Đã hoàn tất vào" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Phân loại" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Tạo phân loại mới..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Xóa phân loại" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Tải về" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Buộc phải bắt đầu tải" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Chuyển vào" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Mức độ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "Cao" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "Chuẩn" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "Thấp" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Nhận trợ giúp trực tuyến" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Tài liệu hướng dẫn" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Diễn đàn hỗ trợ" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Gửi phản hồi" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Báo cáo lỗi" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Phím tắt" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Kiểm tra cập nhật" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Thiết lập" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Không thể khởi chạy ứng dụng mặc định dành cho việc mở tập tin '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Thư mục này không tồn tại." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI đã tồn tại" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "URI này đã tồn tại, bạn có muốn tiếp tục?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Tổng quan" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Nâng cao" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Thiết lập phân loại" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Mặc định cho phần tải về 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Mặc định 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "Chưa đặt tên" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Tạm dừng" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Đang gửi" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Đã xong" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Thùng rác" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Đang đợi" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Đang hoạt động" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Mọi trạng thái" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Tên" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Hoàn tất" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Kích thước" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Đã trôi qua" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Còn lại" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Số lượng" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy :" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Không sử dụng" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Mặc định" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Máy chủ:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Cổng kết nối:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket :" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Đối số mã mạng:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Phần tử :" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "T2" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "T3" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "T4" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "T5" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "T6" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "T7" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "CN" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Bật phần thời khóa biểu tải" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Tắt" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- dừng lại tất cả các tác vụ" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Bình thường" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "-chạy tác vụ bình thường" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Tất cả" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Không có gì" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Đánh dấu dựa vào phần lọc dữ liệu" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Đánh dấu các đường dẫn liên kết bằng máy chủ và đinh dạng tên tập tin." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Phần này sẽ cài đặt lại toàn bộ phần đánh dấu của các đường dẫn liên kết." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Máy chủ" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Định dạng tập tin." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "Đường dẫn liên kết" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Dựa trên phần tham chiếu văn bản siêu liên kết" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Đánh dấu _tất cả" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Không đánh _dấu phần nào" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Đánh dấu dựa vào phần lọc dữ liệu..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "Ví dụ:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Từ:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "_Đến:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "chữ số:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "T_ừ :" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "phân biệt chữ hoa-thường" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Không có ký tự (*) trong mục nhập URL." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Đường dẫn liên kết không hợp lệ." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Không có ký tự trong mục 'Từ' hoặc 'Đến'." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Xem sơ lược" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Giao diện người dùng" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Thời khóa biểu" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Tiện ích" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Các phần khác" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Có thể dùng clipboard" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Chế độ im lặng" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Ngăn cách các loại bằng ký tự '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Bạn có thể sử dụng biểu thức thông thường ở đây." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Xác nhận khi xóa các tập tin" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Khay hệ thống" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Luôn hiển thị biểu tượng ở khay hệ thống" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Thu nhỏ xuống khay hệ thống" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Ẩn tới khay hệ thống khi đóng" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Bật chế độ offline khi khởi động" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Thông báo khi bắt đầu tải" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Phát âm thanh thông báo khi phần tải về đã được hoàn tất" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Gửi đi tối đa" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Tải về tối đa" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Tự động lưu" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Khoảng thời gian:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "phút" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Thiết lập chế độ dòng lệnh" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Sử dụng dòng lệnh '--quiet' theo mặc định" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Cài đặt Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Chạy aria3 khi khởi động" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Tắt aria2 khi thoát" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Chạy aria2 mặc định" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Đường dẫn" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Đối số" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Bạn phải khởi động lại Uget sau khi cài đặt lại nó." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Tập tin" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Thư mục" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Đối tượng" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Giá trị" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Sao chép _tất cả" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Hiện cửa sổ" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "Chế Độ _không có kết nối internet" uget-2.2.2/po/de.po0000664000175000017500000013504213470304402010754 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Michael Tunnell , 2013 # Tobias Bannert , 2016-2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: German (http://www.transifex.com/uget/uget/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Passwortverwaltungsdienst: uget\n\nBeim Versuch, eine SSH-Verbindung zu %s aufzubauen gab es ein Problem beim Überprüfen des Rechnerschlüssels gegen die bekannte und vertrauenswürdige Hosts-Datei, da der Rechnerschlüssel nicht gefunden wurde.\n\nMöchten Sie diese Verbindung als vertrauenswürdig für diese und zukünftige Verbindungen behandeln, indem Sie den Rechnerschlüssel von %s zu der bekannten Hosts-Datei hinzufügen?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Alle Kategorien" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Verbindungsaufbau …" #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Übertragung läuft …" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Wiederholen" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Übertragung vollständig" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Fertiggestellt" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Fortsetzbar" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nicht fortsetzbar" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Ausgabedatei kann nicht umbenannt werden." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "Verbindung zum Anbieter kann nicht hergestellt werden." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Ordner kann nicht erstellt werden." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Datei kann nicht erstellt werden (unzulässiger Dateiname oder Datei vorhanden)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Datei kann nicht geöffnet werden." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Strang kann nicht erstellt werden." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Unzulässige Quelle (unterschiedliche Dateigröße)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Kein Speicherplatz verfügbar (Festplatte voll oder Speicher belegt.)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Keine Ausgabedatei angegeben." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Keine Ausgabeeinstellung." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Zu viele Versuche." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nicht unterstütztes Schema (Protokoll)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nicht unterstütztes Dateiformat." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "Veröffentlichungsdatei nicht gefunden." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "Profildatei nicht gefunden." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Dieses Video wurde entfernt." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Es ist ein Fehler beim Erhalt der Videoinformation aufgetreten." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Es ist ein Fehler beim Erhalt der Videointernetseite aufgetreten." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "In der YouTube-Adresse wurde keine Videokennung (video_id) gefunden." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: unbekannter Fehler aufgetreten." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: Zeit abgelaufen." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: Quelle wurde nicht gefunden." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 sah die bestimmte Zahl des Fehlers »Quelle nicht gefunden«. Siehe Option --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: Geschwindigkeit war zu langsam." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: Netzwerkproblem aufgetreten." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: Unvollständige Übertragungen." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Kein Speicherplatz verfügbar" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: Teillänge war unterschiedlich zu einer .aria2-Steuerdatei." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 hat die selbe Datei heruntergeladen." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 hat den selben Info-Hash-Torrent heruntergeladen." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: Datei ist bereits vorhanden. Siehe Option --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: Vorhandene Datei kann nicht geöffnet werden." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: Neue Datei konnte nicht erstellt oder vorhandene Datei gekürzt werden." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: Datei-E/A-Fehler ist aufgetreten." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: Namensauflösung ist fehlgeschlagen." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: Metalink-Dokument konnte nicht analysiert werden." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP-Befehl ist fehlgeschlagen." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP-Antwortkopfzeile war fehlerhaft oder unerwartet." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Zu viele Umleitungen." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP-Legitimierung ist fehlgeschlagen." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: Bencoded-Datei (normalerweise .torrent-Datei) konnte nicht analysiert werden." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: Torrent-Datei ist beschädigt oder es fehlen Informationen." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet-Adresse ist fehlerhaft." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: schlechte oder nicht erkannte Option oder unerwartetes Optionsargument angegeben." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: Entfernter Server war nicht in der Lage die Anfrage zu verarbeiten." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: JSON-RPC-Anfrage konnte nicht analysiert werden." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Keine Antwort. Ist aria2 herunterfahren?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: GID wurde entfernt." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Erhalt der Medienverknüpfung ist fehlgeschlagen." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Keine übereinstimmenden Medien." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Übertragungsverwaltung" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Michael Tunnell\nRaphael Groner\nTobias Bannert" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet-Gründer: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet-Projektverwaltung: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "Aufgaben" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Neu aus Zwischenablage" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Neue Übertragung" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Zwischenablage" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Befehlszeile" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Fehler aufgetreten" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Es ist ein Fehler beim Herunterladen aufgetreten." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Übertragung beginnt" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Herunterladewarteschlange wird abgearbeitet" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Übertragung vollständig" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Alle Übertragungen in der Warteschlange wurden fertiggestellt." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorie" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Neue Übertragung erstellen" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "_Neue Übertragung …" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Neue _Kategorie …" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Neue Zwischenablage a_barbeiten …" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Neue _Adressreihenfolge abarbeiten …" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Neuer Torrent …" #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Neuer Metalink …" #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Alle Einstellungen speichern" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Ausgewählte Übertragung ausführen" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Ausgewählte Übertragung anhalten" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Ausgewählten Übertragungseigenschaften einstellen" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Markierte Übertragung hoch schieben" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Markierte Übertragung runter schieben" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Markierte Übertragung zum Anfang schieben" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Markierte Übertragung zum Ende schieben" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Neue Kategorie" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopieren - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategorieeigenschaften" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Übertragungseigenschaften" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Neuer Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Neuer Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Torrent-Datei öffnen" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent-Datei (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Metalink-Datei öffnen" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Speichern der Kategoriedatei ist fehlgeschlagen." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Laden der Kategoriedatei ist fehlgeschlagen." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Kategoriedatei speichern" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Kategoriedatei öffnen" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON-Datei (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Verweis " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Bild " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Textdatei" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Adressen aus HTML-Datei importieren" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML-Datei (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Adressen aus Textdatei importieren" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Einfache Textdatei" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Adressen in Textdatei exportieren" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Adressreihenfolge abarbeiten" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Keine Adressen in Zwischenablage gefunden." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Alle Adressen bestehen." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Zwischenablage abarbeiten" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Neu" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Fehler" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Meldung" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d Einträge markiert" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Achtung uGetters:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Wir betreiben eine Spendenaktion für uGets zukünftige Entwicklung, bitte klicken: " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "HIER" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "bitte diese kurze Benutzerumfrage über uGet ausfüllen." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "Bitte hier klicken, um an der Umfrage teilzunehmen." #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Kategoriename:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "A_ktive Übertragungen:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "A_nzahl Fertiggestellter:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "An_zahl Gelöschter:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Übereinstimmungsbedingungen für Adressen" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Übereinstimmende _Rechner:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Übereinstimmende _Schemen:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Übereinstimmende _Typen:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Wirklich beenden?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Wollen Sie wirklich beenden?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Dateien wirklich löschen?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Wollen Sie die Dateien wirklich löschen?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Kategorie wirklich entfernen?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Sind Sie sicher, dass Sie die Kategorie entfernen wollen?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Nicht noch einmal fragen" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "A_dresse:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Spiegel:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Datei:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Ordner wählen" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Ordner:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "_Referrer:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maximale Verbindungen" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "Ausfüh_ren" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "An_gehalten" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Anmelden" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Benutzer:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Passwort:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Profildatei (Cookie):" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Profildatei (Cookie) auswählen" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Sendedatei:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Sendedatei auswählen" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Benutzerkennung (User Agent):" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Wiederholungen:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "Versuche" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Wie_derholungsverzögerung:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "Sekunden" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Höchste Hochladegeschwindigkeit:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Höchste Herunterladegeschwindigkeit:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Zeitstempel empfangen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Datei" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Übertragungen a_barbeiten" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Zwischenablage abarbeiten …" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Adressreihenfolge abarbeiten …" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Textdatei importieren (.txt) …" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML-Datei importieren (.html) …" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Export in Textdatei (.txt) …" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "Kategorie _öffnen …" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "Kategorie _speichern als …" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Alle _Einstellungen speichern" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Getrennter Modus" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Bearbeiten" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Zwischenablage _überwachen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "_Zwischenablage arbeitet unauffällig" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "_Befehlszeile arbeitet unauffällig" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Vorhandene Adresse überspringen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Letzte Übertragungeinstellungen übernehmen" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Automatische Abschlussaktionen" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Deaktivieren" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Ruhezustand" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Bereitschaft" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Herunterfahren" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Neustarten" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Benutzerdefiniert" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Einstellungen merken" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Hilfe" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Einstellungen …" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Ansicht" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Werkzeugleiste" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "_Statusleiste" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Übersicht" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Übersicht_elemente" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Name" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Ordner" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_Adresse" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Meldung" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Übertragung_spalten" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Vollständig" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Größe" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Prozent »%«" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Vergangen" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Verbleibend" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Geschwindigkeit" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Hochladegeschwindigkeit" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Hochgeladen" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Verhältnis" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Wiederholen" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Hinzugefügt" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Vervollständigt" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategorien" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Neue Kategorie …" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Kategorie löschen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Herunterladen" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Eintrag entfernen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Eintrag _und Datei entfernen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "_Ordner öffnen" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Start erzwingen" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Verschieben nach" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorität" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Hoch" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Klein" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Hilfe im Internet erhalten" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentation" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Unterstützungsforum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Rückmeldung einsenden" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Fehler berichten" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Tastenkombinationen" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Auf Aktualisierungen prüfen" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Einstellungen" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Vorgegebene Anwendung für Datei »%s« kann nicht gestartet werden." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "»%s« - Dieser Ordner ist nicht vorhanden." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "Adresse ist vorhanden" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Diese Adresse ist vorhanden, sind Sie sicher, dass Sie fortfahren wollen?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Allgemein" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Fortgeschritten" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Kategorieeinstellungen" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Vorgabe für neue Übertragung 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Vorgabe 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "unbenannt" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Angehalten" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Wird hochgeladen" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Vollständig" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Gelöscht" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Warteschlange" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktiv" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Alle" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Name" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Vollständig" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Größe" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "Prozent" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Vergangen" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Verbleibend" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "Adresse" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Größe" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Vermittlungsserver (Proxy):" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Keiner" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Vorgabe" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Server:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Anschluss (Port):" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket-Args:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Mo" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Di" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Mi" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Do" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Fr" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sa" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "So" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Planer _einschalten" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Ausschalten" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- alle Aufgaben anhalten" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- Aufgabe normal ausführen" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Alles" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Nichts" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Marieren nach Filter" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Adressen nach Server UND Dateityp markieren." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Markierungen für alle Adressen entfernen." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Server" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Suffix" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "Adresse" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Hypertextreferenzbasis" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr " _Alle markieren" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "_Nichts markieren" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Nach Filter markieren …" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "z.B." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Von:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Bis:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "Stellen:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "V_on:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "Groß-/Kleinschreibung" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Kein Platzhalter (*) in Adresseintrag." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Adresse ist ungültig." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Kein Eintrag in »Von« oder »Zu«." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Vorschau" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Benutzerschnittstelle" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Bandbreite" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Planer" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Modul" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Medienseite" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Andere" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Zwischenablageüberwachung aktivieren" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Ruhemodus" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Vorgegebener Kategorieindex" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Wird zur N-ten Kategorie hinzugefügt, wenn mit keiner Kategorie übereinstimmt." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "Adresse von Medienseite _überwachen" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Zwischenablage auf bestimmte Dateitypen überwachen:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Die Erweiterungen durch ein »|« trennen." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Es können reguläre Ausdrücke verwendet werden." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Bestätigung" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Bestätigungsdialog beim Beenden anzeigen" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Bestätigung beim Löschen von Dateien einholen" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Systemablage" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Immer Systemablagesymbol anzeigen" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Beim Start in Systemablage verkleinern" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Beim Fensterschließen, in Systemablage verkleinern" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Ubuntus App-Anzeige benutzen" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Getrennten Modus beim Start aktivieren" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Benachrichtigung beim Starten der Übertragung" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Ton ausgeben wenn Übertragung fertiggestellt wurde" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Großes Symbol anzeigen" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Das wird alle Module betreffen." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Globale Geschwindigkeitsbegrenzung" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Höchste Hochladegeschwindigkeit" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Höchste Herunterladegeschwindigkeit" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Automatische Abschlussaktionen" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Benutzerdefinierter Befehl:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Benutzerdefinierter Befehl, falls Fehler auftreten:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "Automatisches _Speichern" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "A_bstand:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "Minute(n)" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Befehlszeileneinstellungen" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "»--quiet« als Vorgabe benutzen" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Modulübereinstimmungsreihenfolge:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "aria2-Moduloptionen" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC-Legitimierung geheimer Token" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Globale Geschwindigkeitsbegrenzung nur für aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "aria2 beim Starten a_usführen" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "aria2 beim Beenden _beenden" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "aria2 auf lokalem Gerät starten" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Pfad" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumente" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Sie müssen uGet, nach dem Verändern, neu starten" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Medienübereinstimmungsmodus:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Übereinstimmungsbedingungen" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Qualität:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Typ:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Datei" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Ordner" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Eintrag" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Wert" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Alles _kopieren" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Fenster anzeigen" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Getrennter Modus" uget-2.2.2/po/da.po0000664000175000017500000013151513470304402010751 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Filip Kemuel Dam Bartholdy , 2013,2016 # scootergrisen, 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-10-14 17:10+0000\n" "Last-Translator: scootergrisen\n" "Language-Team: Danish (http://www.transifex.com/uget/uget/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Adgangskodehåndteringsdæmon: uget\n\nVed forsøg på en SSH-forbindelse til %s var der et problem med at verificere dets værtsnøgle mod den kendte og betroede værts fil fordi dens værtsnøgle ikke blev fundet.\n\nVil du gerne behandle denne forbindelse som betroet for denne og fremtidige forbindelser ved at tilføje %ss værtsnøgle til de kendte værts fil?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Alle kategorier" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Opretter forbindelse..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Overfører..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Forsøg" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Download fuldført" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Færdige" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Genoptagelig" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Ikke genoptagelig" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Outputfilen kan ikke omdøbes." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "kunne ikke oprette forbindelse til vært." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Mappe kan ikke oprettes." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Fil kan ikke oprettes (ugyldigt filnavn eller filen findes allerede)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Filen kan ikke åbnes." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Kan ikke oprette tråd." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Forkert kilde (forskellig filstørrelse)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Ikke flere ressourcer (disken er fyldt eller er løbet tør for hukommelse)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Ingen outputfil." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Ingen outputindstilling." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "For mange forsøg." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Ikke-understøttet skema (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Ikke-understøttet fil." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "postfil ikke fundet." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "cookiefil ikke fundet." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Denne video er blevet fjernet." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Der opstod fejl under hentning af videoinfo." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Der opstod fejl under hentning af videoens webside." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Ingen video_id fundet i YouTube-URL." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: der opstod en ukendt fejl." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: fik timeout." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: ressource blev ikke fundet." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 så det angivne antal af fejlen 'ressource ikke fundet'. Se tilvalget --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: hastighed var for langsom." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: der opstod et netværksproblem." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: ufærdige downloads." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Ikke flere ressourcer" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: stykkelængde var ikke som den i .aria2-kontrolfilen." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 downloadede samme fil." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 downloadede samme infohash-torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: filen findes allerede. Se tilvalget --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: kunne ikke åbne eksisterende fil." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: kunne ikke oprette ny fil eller afkorte eksisterende fil." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: der opstod fil-I/O-fejl." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: navneoversættelse mislykkedes." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: kunne ikke fortolke metalink-dokument." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP-kommando mislykkedes." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP-svar-header var ugyldigt eller uventet." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "For mange videresendelser." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP-godkendelse mislykkedes." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: kunne ikke fortolke kodet fil (typisk .torrentfil)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torrentfil var ødelagt eller manglede information." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet-URI var ugyldigt." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: ugyldigt/ikke-genkendt tilvalg blev givet eller uventet tilvalgsargument blev givet." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: fjern-serveren kunnen ikke håndtere anmodningen." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: kunne ikke fortolke JSON-RPC-anmodning." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Intet svar. Er aria2 stoppet?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid blev fjernet." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Kunne ikke hente medielink." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Intet matchet medie." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Downloadhåndtering" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Filip Kemuel (kemuel.dk)\nscootergrisen" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet grundlægger: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet projektmanager: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "opgaver" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Ny fra udklipsholder" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Ny download" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Udklipsholder" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Kommandolinje" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Der opstod fejl" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Der opstod fejl under download." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Download starter" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Starter downloadkø." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Download fuldført" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Alle downloads i køen er fuldførte." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategori" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Opret ny download" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Ny _download..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Ny _kategori..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Ny udklipsholder_batch..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Ny _URL-sekvensbatch..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Ny torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nyt metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Gem alle indstillinger" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Sæt valgte download kørende" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Sæt valgte download på pause" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Sæt egenskaber for valgte download" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Flyt valgte download op" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Flyt valgte download ned" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Flyt valgte download øverst" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Flyt valgte download nederst" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Ny kategori" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopier - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategoriegenskaber" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Downloadegenskaber" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Ny torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nyt metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Åbn torrentfil" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrentfil (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Åbn metalinkfil" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Kunne ikke gemme kategorifil." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Kunne ikke indlæse kategorifil." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Gem kategorifil" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Åbn kategorifil" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON-fil (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Link " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Billede " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Tekstfil" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importér URL'er fra HTML-fil" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML-fil (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importér URL'er fra tekstfil" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Ren tekstfil" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Eksportér URL'er til tekstfil" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL-sekvensbatch" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Ingen URL'er fundet i udklipsholderen." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Alle URL'er findes." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Udklipsholderbatch" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Ny" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Fejl" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Besked" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d elementer valgt" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Hallo uGettere:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "vi kører en donationskampagne for uGets fremtidige udvikling, klik venligst " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "HER" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "udfyld venligst denne hurtige brugerundersøgelse for uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "klik her for at deltage i undersøgelsen" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Kategori_navn:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktive _downloads:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacitet af færdige:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacitet af papirkurv:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI matchende betingelser" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Matchede _værter:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Matchede _skemaer:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Matchede _typer:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Vil du virkelig afslutte?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Er du sikker på, at du vil afslutte?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Vil du virkelig slette filerne?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Er du sikker på, at du vil slette filerne?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vil du virkelig slette kategorien?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Er du sikker på, at du vil slette kategorien?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Spørg mig ikke igen" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Spejle:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Vælg mappe" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Mappe:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Henviser:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maks. forbindelser:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Kørende" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ause" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Login" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Bruger:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Adgangskode:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookiefil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Vælg cookiefil" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Postfil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Vælg postfil" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "User Agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Forsøgsgr_ænse:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "gange" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Forsøgs_forsinkelse:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekunder" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maks. uploadhastighed:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maks. downloadhastighed:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Hent tidsstempel" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fil" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Batchdownloads" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Udklipsholder_batch..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL-sekvensbatch..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Tekstfilimport (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML-filimport (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Eksportér til tekstfil (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Åbn kategori..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Gem kategori som..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Gem _alle indstillinger" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Offlinetilstand" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Rediger" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Overvågning af udklipsholder" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Udklipsholder arbejder stille" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Kommandolinje arbejder stille" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Spring eksisterende URI over" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Anvend seneste downloadindstillinger" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Automatiske handlinger ved fuldførelse" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Deaktivér" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Dvale" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Hvile" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Luk ned" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Genstart" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Tilpasset" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Husk indstilling" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Hjælp" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Indstillinger..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Vis" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Værktøjslinje" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Statuslinje" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Opsummering" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Opsummerings_elementer" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Navn" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Mappe" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Besked" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Download_kolonner" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Fuldført" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Størrelse" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Forløbet" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Tilbage" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Hastighed" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Ophastighed" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Uploadet" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Forhold" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Forsøg" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Tilføjet den" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Fuldført den" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategori" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Ny kategori..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Slet kategori" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Download" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Slet post" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Slet post og _fil" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Åbn _indeholdende mappe" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Gennemtving start" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Flyt til" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Høj" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Lav" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Få hjælp online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentation" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Supportforum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Indsend feedback" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Rapportér en fejl" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Tastaturgenveje" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Søg efter opdateringer" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Indstillinger" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Kan ikke åbne standardprogram for filen '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Denne mappe findes ikke." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI findes" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Denne URI findes. Er du sikker på, at du vil fortsætte?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Generelt" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avanceret" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Kategoriindstillinger" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Standard for ny download 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Standard 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "unavngivet" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Sat på pause" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Uploader" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Fuldført" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Papirkurv" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "I kø" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktive" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Al status" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Navn" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Fuldført" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Størrelse" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Forløbet" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Tilbage" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Mængde" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Brug ikke" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Standard" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Vært:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket args:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Man" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Tirs" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Ons" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Tors" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Fre" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Lør" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Søn" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Aktivér planlægger" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Slå fra" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- stop alle opgaver" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- kør opgaver normalt" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Alle" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Ingen" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Mærk efter filter" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Mærk URL'er efter vært OG filnavnendelse." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Dette vil gendanne alle mærker for URL'er." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Vært" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Filendelse" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Base hypertekst-reference" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Mærk _alle" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Mærk _ingen" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Mærk efter filter..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "f.eks." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Fra:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Til:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "cifre:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "F_ra:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "forskel på store og små bogstaver" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Ingen jokertegn(*) i URL-post." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL'en er ugyldig." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Ingen tegn i 'Fra'- eller 'Til'-post." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Forhåndsvisning" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Brugergrænseflade" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Båndbredde" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Planlægger" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Plugin" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Mediets websted" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Andet" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Aktivér overvågning af udklipsholder" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Stilletilstand" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Standardkategoriindeks" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Tilføjer til Nth kategori hvis ingen kategori matcher." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Overvåg mediewebstedets URL" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Overvåg udklipsholder for angivne filtyper:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Adskil typerne med tegnet '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Her kan du bruge regulære udtryk." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Bekræftelse" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Vis bekræftelsesdialog ved afslutning" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Bekræft ved sletning af filer" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Systembakke" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Vis altid systembakkeikon" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimer til systembakke ved opstart" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Luk til bakke når vindue lukkes" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Brug Ubuntus appindikator" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Aktivér offlinetilstand ved opstart" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Download startsnotifikation" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Lyd når download er færdig" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Vis stort ikon" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Dette påvirker alle plugins." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Global hastighedsbegrænsning" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maks. uploadhastighed" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maks. downloadhastighed" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Automatiske handlinger ved fuldførelse" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Tilpasset kommando:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Tilpasset kommando hvis der opstår fejl:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "Gem _automatisk" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minutter" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Kommandolinjeindstillinger" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Brug '--quiet' som standard" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Plugin som matcher rækkefølge:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Valgmuligheder for aria2-plugin" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC-godkendelse hemmelig token" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Global hastighedsbegrænsning kun for aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Åbn aria2 ved opstart" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Stop aria2 ved afslutning" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Start aria2 på lokal enhed" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Sti" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenter" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Du skal genstarte uGet efter den er blevet ændret." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Matchtilstand for medie:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Matchbetingelser" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Kvalitet:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Type:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fil" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Mappe" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Element" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Værdi" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopiér _alle" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Vis vindue" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Offlinetilstand" uget-2.2.2/po/lt.po0000664000175000017500000013416713470304402011012 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-12-02 22:37+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/uget/uget/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Slaptažodžių tvarkytuvės tarnyba: uget\n\nBandant SSH ryšį su serveriu %s atsirado problemų patvirtinant jo serverio raktą ir lyginant šį raktą su žinomų ir patikimų serverių failu, nes jo serverio raktas nebuvo rastas.\n\nAr norėtumėte šiam ir ateityje užmezgiamiems ryšiams laikyti šį ryšį kaip patikimą, pridedant %s serverio raktą į žinomų serverių failą?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Visos kategorijos" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Jungiamasi..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Persiunčiama..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Bandyti dar kartą" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Atsiuntimas užbaigtas" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Užbaigta" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Pratęsiama" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nepratęsiama" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Išvesties failas negali būti pervadintas." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "nepavyko prisijungti prie serverio." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Aplankas negali būti sukurtas." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Failas negali būti sukurtas (blogas failo pavadinimas arba failas jau yra)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Failas negali būti atvertas." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nepavyko sukurti gijos." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Neteisingas šaltinis (skirtingo failo dydžiai)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Trūksta išteklių (diskas yra pilnas arba baigėsi atmintis)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nėra išvesties failo." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nėra išvesties nustatymo" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Per daug bandymų iš naujo." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nepalaikoma schema (protokolas)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nepalaikomas failas." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "nerastas post failas." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "slapukas nerastas." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Šis vaizdo įrašas buvo pašalintas." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Gaunant vaizdo įrašo informaciją, atsirado klaidų." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Gaunant vaizdo įrašo svetainės informaciją, atsirado klaidų." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "YouTube URL adrese nerasta video_id." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: įvyko nežinoma klaida." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: pasibaigė laikas." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: išteklius nerastas." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 pamatė \"išteklius nerastas\" nurodytą klaidos numerį. Žiūrėkite --max-file-not-found parametrą" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: sparta buvo pernelyg lėta." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: atsirado tinklo problemų." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: neužbaigti atsiuntimai." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Nėra ištekliaus" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: dalies ilgis buvo kitoks nei tas, kuris yra .aria2 valdymo faile." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 atsiuntinėjo tą patį failą." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 siuntėsi tokios pačios informacijos maišos torrent failą." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: failas jau buvo. Žiūrėkite --allow-overwrite parametrą." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: nepavyko atverti esamo failo." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: nepavyko sukurti naujo failo ar apkirpti esamo failo." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: įvyko failo I/O klaida." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: pavadinimo rezoliucija nepavyko." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: nepavyko išnagrinėti Metanuorodos dokumento." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP komanda nepavyko." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP atsakymo antraštė buvo bloga arba netikėta." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Per daug peradresavimų." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP tapatybės nustatymas nepavyko." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: nepavyko išnagrinėti koduoto failo (dažniausiai, .torrent failo)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torrent failas buvo pažeistas ar jame trūko informacijos." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI buvo blogas." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: buvo nurodytas blogas/nepažįstamas parametras ar nurodytas netikėtas parametro argumentas." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: nuotoliniam serveriui nepavyko apdoroti užklausos." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: nepavyko išnagrinėti JSON-RPC užklausos." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Nėra atsakymo. Ar aria2 išjungta?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid buvo pašalinta." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Failed gauti medijos nuorodos." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Nėra atitinkamos medijos." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Atsiuntimų tvarkytuvė" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Moo" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet įkūrėjas: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet projekto vadybininkas: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "užduočių" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Naujas iš iškarpinės" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Naujos atsiuntimas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Iškarpinė" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Komandų eilutė" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Įvyko klaida" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Atsiunčiant, įvyko klaida." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Atsiuntimas pradedamas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Pradedama atsiuntimų eilė." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Atsiuntimas užbaigtas" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Visi atsiuntimai eilėje yra užbaigti." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Būsena" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorija" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Sukurti naują atsiuntimą" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Naujas _atsiuntimas..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nauja _kategorija..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Naujas paketinis atsiuntimas iš _iškarpinės..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Naujas _URL sekos paketinis atsiuntimas..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Naujas torentas..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nauja metanuoroda..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Įrašyti visus nustatymus" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Nustatyti pažymėtus atsiuntimus kaip paleistus" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Nustatyti pažymėtus atsiuntimus kaip pristabdytus" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Nustatyti pažymėtų atsiuntimų savybes" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Pakelti pažymėtą atsiuntimą" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Nuleisti pažymėtą atsiuntimą" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Perkelti pažymėtą atsiuntimą į viršų" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Perkelti pažymėtą atsiuntimą į apačią" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nauja kategorija" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopija - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategorijos savybės" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Atsiuntimo savybės" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Naujas torentas" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nauja metanuoroda" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Atverti Torrent failą" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent failas (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Atverti Metanuorodos failą" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Nepavyko įrašyti kategorijos failo." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Nepavyko įkelti kategorijos failo." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Įrašyti kategorijos failą" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Atverti kategorijos failą" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON failas (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Nuoroda " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Paveikslas " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Tekstinis failas" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importuoti URL adresus iš HTML failo" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML failas (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importuoti URL adresus iš tekstinio failo" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Grynojo teksto failas" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Eksportuoti URL adresus į tekstinį failą" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL sekos paketinis atsiuntimas" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Iškarpinėje nerasta jokių URL." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Visi URL jau buvo." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Paketinis atsiuntimas iš iškarpinės" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Naujas" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Klaida" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Žinutė" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Pažymėta %d elementų" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Dėmėsio uGet naudotojai:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "mes vykdome paaukojimų maratoną, skirtą ateities uGet plėtojimui, prašome spustelėti " #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ČIA" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "prašome užpildyti šią trumpą uGet naudotojų apklausą." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "spustelėkite čia, norėdami sudalyvauti apklausoje" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Kategorijos pavadi_nimas:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktyvių _atsiuntimų:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Užbaigtų talpa:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Šiukšlinės talpa:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI atitikimo sąlygos" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Atitinkantys s_erveriai:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Atitinkančios _schemos:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Atitinkantys _tipai:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Tikrai išeiti?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Ar tikrai norite išeiti?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Tikrai ištrinti failus?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Ar tikrai norite ištrinti failus?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Tikrai ištrinti kategoriją?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Ar tikrai norite ištrinti kategoriją?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Daugiau nebeklausti" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Tinklavietės:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Failas:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Pasirinkite aplanką" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "A_plankas:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Nukreipėjas:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Daugiausia sujungimų:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Paleisti" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ristabdyti" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Prisijungimas" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Naudotojas:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Slaptažodis:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Slapuko failas:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Pasirinkite slapuko failą" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post failas:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Pasirinkite Post failą" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Naudotojo agentas:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Bandymų iš naujo _riba:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "kartų" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Bandymų iš naujo _delsa:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sek." #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Didžiausia išsiuntimo sparta:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Didžiausia atsiuntimo sparta:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Gauti laiko žymą" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Failas" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Paketiniai atsiuntimai" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Paketinis atsiuntimas iš iškarpinės..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL sekos paketinis atsiuntimas..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Tekstinio failo importavimas (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML failo importavimas (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Eksportuoti į tekstinį failą (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Atverti kategoriją..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "Į_rašyti kategoriją kaip..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Įrašyti _visus nustatymus" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Autonominė veiksena" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Taisa" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Iškarpinės _prižiūryklė" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Iškarpinė veikia tyliai" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Komandų eilutė veikia tyliai" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Praleisti esamą URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Taikyti paskiausio atsiuntimo nustatymus" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Automatiniai užbaigimo veiksmai" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Išjungti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Užmigdyti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Pristabdyti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Išjungti" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Paleisti iš naujo" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Pasirinktinai" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Prisiminti nustatymą" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "Ž_inynas" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "Nu_statymai..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Rodinys" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Į_rankių juosta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Būsenos juosta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Santrauka" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Santraukos _elementai" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "Pavadi_nimas" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Aplankas" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Žinutė" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Atsiuntimo s_tulpeliai" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Užbaigta" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Dydis" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procentai \"%\"" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Praėjęs laikas" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Liko" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Sparta" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Išsiuntimo sparta" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Išsiųsta" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Santykis" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Bandyti dar kartą" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Pridėtas" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Užbaigtas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategorija" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nauja kategorija..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Ištrinti kategoriją" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Atsiuntimas" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Ištrinti įrašą" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Ištrinti įrašą ir _failą" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Atverti _vidinį aplanką" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Priverstinai pradėti" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Perkelti į" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Pirmenybė" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Aukšta" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normali" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "Že_ma" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Rodyti žinyną internete" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentacija" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Palaikymo forumas" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Pateikti atsiliepimą" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Pranešti apie klaidą" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Spartieji klavišai" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Tikrinti ar yra atnaujinimų" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Nustatymai" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Nepavyksta paleisti numatytosios programos failui \"%s\"." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "\"%s\" - Šio aplanko nėra." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI jau buvo" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Šis URI jau buvo, ar tikrai norite tęsti?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Bendros" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Išplėstinės" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Kategorijos nustatymai" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Numatytieji naujam atsiuntimui 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Numatytieji 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "be pavadinimo" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pristabdyti" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Išsiunčiama" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Užbaigta" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Šiukšlinėje" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Eilėje" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktyvūs" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Visos būsenos" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Pavadinimas" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Užbaigta" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Dydis" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Praėjęs laikas" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Liko" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Kiekis" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Įgaliotasis serveris:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Nenaudoti" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Numatytasis" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Serveris:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Prievadas:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Lizdas:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Lizdo argumentai:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elementas:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Pir" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Ant" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Tre" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Ket" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pen" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Šeš" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Sek" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Į_jungti planuoklę" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Išjungti" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- stabdyti visas užduotis" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Įprasta" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- vykdyti užduotis įprastai" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Visi" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Joks" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Žymėti pagal filtrą" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Žymėti URL adresus pagal serverį IR failo prievardį." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Tai atstatys visus URL adresų žymėjimus." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Serveris" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Failo prievardis" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Bazinė hiperteksto nuoroda" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Žymėti _visus" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Nuimti žymėjimą _nuo visų" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "Ž_ymėti pagal filtrą..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "pvz.," #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Nuo:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Iki:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "skaitmenys:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "N_uo:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "skiriant raidžių dydį" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL įraše nėra pakaitos simbolio(*)." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL yra neteisingas." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "\"Nuo\" ar \"Iki\" įraše nėra simbolio." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Peržiūra" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Naudotojo sąsaja" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Siuntimo sparta" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Planuoklė" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Įskiepis" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Medijos svetainė" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Kiti" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "Į_jungti iškarpinės prižiūryklę" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tylioji veiksena" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Numatytoji kategorijos rodyklė" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Jei nėra atitinkamos kategorijos, pridedama į N-tą kategorija." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Stebėti medijos svetainių URL" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Iškarpinėje stebėti nurodytus failų tipus:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Atskirkite tipus, naudodami \"|\" simbolį." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Čia galite naudoti reguliariuosius reiškinius." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Patvirtinimas" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Išeinant, rodyti patvirtinimo dialogą" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Ištrinant failus, klausti patvirtinimo" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Sistemos dėklas" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Visada rodyti dėklo piktogramą" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Paleidus programą, suskleisti į sistemos dėklą" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Užvėrus langą, suskleisti į dėklą" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Naudoti Ubuntu programų indikatorių" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Paleidimo metu įjungti autonominę veikseną" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Pranešimas apie pradedamą atsiuntimą" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Užbaigus atsiuntimą, groti garsą" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Rodyti dideles piktogramas" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Tai paveiks visus įskiepius." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Visuotiniai spartos apribojimai" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Didžiausia išsiuntimo sparta" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Didžiausia atsiuntimo sparta" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Automatiniai užbaigimo veiksmai" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Pasirinktinė komanda:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Pasirinktinė komanda, įvykus klaidai:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Automatinis įrašymas" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervalas:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minutės" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Komandų eilutės nustatymai" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Pagal numatymą, naudoti \"--quiet\"" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Įskiepio atitikimo tvarka:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 įskiepio parametrai" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Slaptas RPC prieigos teisių prieigos raktas" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Visuotinis spartos apribojimas, skirtas tik aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "Pa_leidžiant programą, paleisti aria2" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Išeinant iš programos, išjungti aria2" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Paleisti aria2 vietiniame įrenginyje" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Kelias" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumentai" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Juos modifikavę, privalote paleisti uGet iš naujo." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Medijos atitikimo veiksena:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Atitikimo sąlygos" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Kokybė:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Tipas:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Failas" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Aplankas" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Elementas" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Reikšmė" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopijuoti viską" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Rodyti langą" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Autonominė veiksena" uget-2.2.2/po/bn_BD.po0000664000175000017500000013545713470304401011341 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Nazir Ahmed Sabbir , 2015 # Reazul Iqbal , 2015,2017 # Towfique Anam, 2013 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-07-12 20:35+0000\n" "Last-Translator: Reazul Iqbal \n" "Language-Team: Bengali (Bangladesh) (http://www.transifex.com/uget/uget/language/bn_BD/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bn_BD\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "সকল বিভাগ" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "যুক্ত হচ্ছে..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "প্রেরিত হচ্ছে..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "পুনঃচেষ্টা" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "ডাউনলোড সমাপ্ত" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "সমাপ্ত" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "পুনরায় আরম্ভযোগ্য" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "পুনরয়ায় আরম্ভযোগ্য নয়" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "আউটপুট ফাইল পুনরায় নামকরন করা যাবে না।" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "হোস্টের সাথে যুক্ত হতে ব্যর্থ।" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "ফোল্ডার তৈরী করা সম্ভব নয়।" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "ফাইল তৈরী করা সম্ভব নয় (খারাপ ফাইল নাম অথবা ফাইল আছে)।" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "ফাইল খোলা যাবে না।" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "থ্রেড তৈরি করা যায়নি।" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "ভুল উৎস (ভিন্ন আকারের ফাইল)।" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "রিসোর্স নেই (ডিস্ক পূর্ন অথবা পর্যাপ্ত মেমরি নেই)।" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "কোন আউটপুট ফাইল নেই।" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "আউটপুট সেটিং নেই।" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "অনেক বেশী পুনঃচেষ্টা।" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "স্কিম(প্রটোকল) অসমর্থিত। " #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "অসর্মথিত ফাইল।" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "পোস্ট পাওয়া যায়নি।" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "কুকি ফাইল পাওয়া যায়নি।" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "ভিডিওটি সরানো হয়েছে।" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "ভিডিওটির তথ্য আনতে ক্রুটি হয়েছে।" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: একটি অজানা ত্রুটি ঘটেছে।" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: টাইম আউট হয়েছে।" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "অনেক বেশী পুনঃনির্দেশ।" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "ডাউনলোড ম্যানেজার" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "অনুবাদক-ক্রেডিট" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "কাজসমূহ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "ক্লিপবোর্ড থেকে নতুন" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "নতুন ডাউনলোড" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "ক্লিপবোর্ড" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "কমান্ড লাইন" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "ডাউনলোড শুরু হচ্ছে" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "ডাউনলোডের তালিকা চালু" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "ডাউনলোড সমাপ্ত" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "তালিকাকৃত সকল ডাউনলোড সমাপ্ত" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "অবস্থা" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "ক্যাটাগরি" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "নতুন ডাউনলোড তৈরী" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "New _Download..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "New _Category..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "New Clipboard _batch..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "New _URL Sequence batch..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "নতুন টরেন্ট..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "নতুন মেটালিঙ্ক..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "নির্বাচিত ডাউনলোড চালুর উপযোগী হিসেবে সেট করুন" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "নির্বাচিত ডাউনলোড বিরতির জন্য সেট করুন" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "নির্বাচিত ডাউনলোডের বৈশিষ্ট্য দেখানোর জন্য সেট করুন" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "নির্বাচিত ডাউনলোড উপরে তুলুন" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "নির্বাচিত ডাউনলোড নিচে নামান" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "নির্বাচিত ডাউনলোড সবার উপরে তুলুন" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "নির্বাচিত ডাউনলোড সবার নিচে নামান" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "নতুন ক্যাটাগরি" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "কপি" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "ক্যাটাগরি বৈশিষ্ট্য" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "ডাউনলোড বৈশিষ্ট্য" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "নতুন টরেন্ট" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "নতুন মেটালিংক" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "টরেন্ট ফাইল খুলুন" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "মেটালিংক ফাইল খুলুন" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "লিংক " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "ছবি " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "টেক্সট ফাইল" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "HTML ফাইল থেকে URL ইমপোর্ট" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "টেক্সট ফাইল থেকে URL ইমপোর্ট" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "ক্রমানুসারে সাজানো URL " #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "ক্লিপবোর্ডে কোন ইউআরএল পাওয়া যায়নি" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "সাজানো ক্লিপবোর্ড" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "ত্রুটি" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "বার্তা" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d সংখ্যক বস্তু নির্বাচিত" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "uGet ব্যবহারকারীদের দৃষ্টি আকর্ষণ:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "আমরা uGet এর ভবিষ্যৎ ডেভেলপমেন্টের জন্য ডোনেশন চাইছি, অনুগ্রহ করে ক্লিক করুন" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "এখানে" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "অনুগ্রহ করে uGet এর জন্য এই ছোট সার্ভেতে অংশ নিন" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "সার্ভেতে অংশ নিতে এখানে ক্লিক করুন" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Category _name:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Active _downloads:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "সমাপ্তের ধারণক্ষমতা:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "পুনঃব্যবহার ধারণক্ষমতা:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "আসলেই প্রস্থান করবেন?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "আপনি কি নিশ্চিত যে আপনি প্রস্থান করতে চান?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "আসলেই ফাইলগুলো মুছতে চান?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "আপনি কি নিশ্চিত আপনি ফাইলগুলো মুছতে চান?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "মিররসমূহ:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "ফাইল:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "ফোল্ডার নির্বাচন" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Folder:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "রেফারকারী:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Runnable" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ause" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "লগইন" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "ব্যবহারকারী:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "পাসওয়ার্ড:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "কুকি ফাইল:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "কুকি ফাইল সিলেক্ট করুন" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "ফাইল পোস্ট:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "পোস্ট ফাইল নির্বাচন:" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "ইউজার এজেন্ট:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Retry _limit:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "গণনা" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Retry _delay:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "সেকেন্ড" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "সর্বোচ্চ আপলোড গতি:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "কিবাইট/সে" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "সর্বোচ্চ ডাউনলোডের গতি:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "টাইমস্ট্যাম্প তুলে আনুন" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_File" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Batch Downloads" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Clipboard batch..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL Sequence batch..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Text file import (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML file import (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Export to Text file (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Edit" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Clipboard _Monitor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "সাম্প্রতিক ডাউনলোড সেটিং প্রয়োগ" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Help" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Settings..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_View" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Toolbar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "স্ট্যাটাসবার" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Summary" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Summary _Items" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Name" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Folder" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Message" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Download _Columns" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Complete" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Size" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Percent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Elapsed" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Left" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "গতি" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "আপলোড গতি" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "আপলোডেড" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "অনুপাত" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Retry" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "শুরু হয়েছে" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "সমাপ্ত হয়েছে" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Category" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_New Category..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Delete Category" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Download" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "জোরপূর্বক আরম্ভ" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Move To" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "অনলাইনে সাহায্য নিন" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "ডকুমেন্টেশন" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "সাপোর্ট ফোরাম" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "মতামত দিন" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "বাগ রিপোর্ট করুন" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "আপডেট চেক করুন" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "সেটিং" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "'%s' এর জন্য ডিফল্ট এপ্লিকেশন পাওয়া যায়নি" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - এই ফোল্ডারটি নেই" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "সাধারণ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "অগ্রবর্তী" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "ক্যাটাগরি সেটিংস" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "নতুন ডাউনলোড 1 এর জন্য পূর্বনির্ধারিত" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "পূর্বনির্ধারিত 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "নামবিহীন" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "পুনঃচালনা" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "সারিবদ্ধ করা হচ্ছে" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "সক্রিয়" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "নাম" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "সমাপ্ত" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "আকার" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "অতিক্রান্ত হয়েছে" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "বাকি আছে" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "পরিমাণ" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "প্রক্সি:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "ব্যবহৃত হবে না" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "পূর্বনির্ধারিত" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "হোস্ট" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "পোর্ট:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "সকেট:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "সকেট আর্গুমেন্ট:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "উপাদান:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "সোম" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "মঙ্গল" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "বুধ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "বৃহঃ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "শুক্র" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "শনি" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "রবি" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Enable Scheduler" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "বন্ধ করুন" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "-সব কাজ বন্ধ করুন" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "স্বাভাবিক" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "-কাজ স্বাভাবিকভাবে চালান" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "সব" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "কোনটাই না" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "ফিল্টারের মাধ্যমে মার্ক করুন" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URL কে হোস্ট এবং ফাইলনেম দিয়ে মার্ক করুন" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "এটি সকল URL এর মার্ক রিসে্ট করবে।" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "হোস্ট" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "ফাইল এক্সট." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL:" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "মূল হাইপারটেক্সট রেফারেন্স" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Mark _All" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Mark _All" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Mark by filter..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "যেমন:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_From:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "প্রতি:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "সংখ্যা:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "F_rom:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "কেস-সংবেদনশীল" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL এন্ট্রিতে কোন ওয়াইল্ডকার্ড(*) বর্ণ নেই।" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL টি সঠিক নয়" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "'from' বা 'to' এন্ট্রিতে কোন বর্ণ নেই।" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "প্রিভিউ" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "শিডিওলার" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "প্লাগ-ইন" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "অন্যান্য" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Quiet mode" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "টাইপগুলোকে '|' দিয়ে আলাদা করুন" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "এখানে রেগুলার এক্সপ্রেশন ব্যবহার করতে পারেন।" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "ফাইল ডিলিট করার আগে নিশ্চিত করুন" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "সবসময় ট্রে আইকন দেখান" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "স্টার্টআপে ট্রেতে মিনিমাইজ করুন" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "স্টার্টআপে অফলাইন মুড চালু করুন" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "ডাউনলোড শুরু হবার নোটিফিকেশন" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "ডাউনলোড সমাপ্ত হলে শব্দ বাজান" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "মিনিট" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "কমান্ডলাইন সেটিংস" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "'--quiet' পূর্বনির্ধারিতভাবে ব্যবহার করুন" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Launch aria2 on startup" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Shutdown aria2 on exit" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "পথ" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "আর্গুমেন্টসমূহ" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "ফাইল" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "ফোল্ডার" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "বস্তু" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "মান" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copy _All" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "উইন্ডো প্রদর্শন" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Offline Mode" uget-2.2.2/po/ro.po0000664000175000017500000011451113470304402011002 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Nicolae Crefelean, 2017 # Remus-Gabriel Chelu , 2016 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-23 22:34+0000\n" "Last-Translator: Nicolae Crefelean\n" "Language-Team: Romanian (http://www.transifex.com/uget/uget/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Serviciu de gestiune a parolelor: uget\n\nLa încercarea de conectare prin SSH la %s a apărut o problemă la verificarea cheii gazdei cu cea din fișierul local cu gazde cunoscute și de încredere, pentru că această cheie nu a fost găsită.\n\nDoriți să tratați ca sigură conexiunea curentă și cele viitoare, adăugând cheia gazdei %s în fișierul gazdelor cunoscute?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Toate categoriile" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Conectare..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmitere..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Reîncearcă" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Descărcare completă" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Terminat" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Se poate continua" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nu se poate continua" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Fișierul de destinație nu poate fi redenumit." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "conectarea la gazdă nu a reușit." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Directorul nu a putut fi creat." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Fișierul nu a putut fi creat (nume incorect sau fișierul există)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Fișierul nu poate fi deschis." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nu se poate crea firul." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Sursă incorectă (dimensiunea fișierului diferă)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Resurse epuizate (disc plin sau memorie insuficientă)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nu există un fișier destinație." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nu există setări pentru destinație." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Prea multe reîncercări." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "" #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "" #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "" uget-2.2.2/po/uk.po0000664000175000017500000014566513470304402011017 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Oleh, 2014 # Serhij Dubyk , 2011 # Микола Ткач , 2016 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Ukrainian (http://www.transifex.com/uget/uget/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Усі категорії" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "З’єднання…" #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Передача…" #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Спроби" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Завантаження завершено" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Завершено" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Можливе продовження" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Продовження неможливе" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Вихідний файл неможливо перейменувати." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "не вдається під'єднатися до вузла." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Неможливо створити теку." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Файл не може бути створений (невірна назва чи файл існує)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Не вдалося відкрити файл." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Не вдається створити потік." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Невірне джерело (різний розмір файлу)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Бракує ресурсів (диск заповнений чи брак пам’яті)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Відсутній вихідний файл." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Немає вихідних налаштувань." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Забагато спроб." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Непідтримувана схема (протокол)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Непідтримуваний файл." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: сталася невідома помилка." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: час сплив." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: ресурс не знайдено." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 отримала певне число помилок \"ресурс не знайдено\". Дивіться параметр --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: швидкість була замалою." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: виникла проблема з мережею." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: незавершені завантаження." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Немає ресурсів" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: розмір блоку відрізнявся від вказаного у контрольному .aria2-файлі" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 був завантажений один і той самий файл." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 був завантажений один і той самий хеш торенту." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: файл вже існує. Дивіться параметр --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: не вдалося відкрити існуючий файл." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: не вдалося створити новий файл або обнулити існуючий файл." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: сталася помилка читання/запису файлу." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: дозвіл імен не вдався." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: не вдалося проаналізувати Metalink-документ." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP команда не вдалася." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP-заголовок відповіді був зіпсованим або неочікуваним." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Забагато переспрямувань." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "ria2: HTTP-авторизація не вдалася." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: не вдалося проаналізувати закодований файл (зазвичай файл \".torrent\")." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: торент-файл пошкоджений або бракує інформації." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: поганий Magnet URI." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: задано поганий/нерозпізнаний параметр або неочкуваний аргумент до нього" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: віддалений сервер не зміг опрацювати запит." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: не вдалося проаналізувати JSON-RPC запит." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Немає відповіді. Можливо aria2 відімкнена?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid був вилучений." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Керівник звантажень" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Сергій Дубик \nМакс Ляшук \nМикола Ткач " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Засновник uGet: " #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Керівник проєкту uGet: " #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "завдання" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Нове звантаження з буферу обміну" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Нове звантаження" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Буфер обміну" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Командний рядок" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Сталася помилка" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Сталася помилка при завантаженні." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "звантаження запущено" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "запущена черга звантажень." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Звантаження завершено" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Усі файли з черги успішно звантажено." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Статус" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Категорія" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Створити нове звантаження" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Нове _звантаження…" #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Нова _категорія…" #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Нове завантаження з _буферу обміну…" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Новий перелік посилань" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Новий торент..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Нове метапосилання..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Зберегти усі налаштування" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Почати звантаження для вибраних записів" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Призупинити вибрані звантаження" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Встановити ціхи вибраних звантажень" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Перемістити обране звантаження вище" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Перемістити обране звантаження нижче" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Перемістити обране звантаження до початку" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Перемістити обране звантаження у кінець" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Нова категорія" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Копіювати -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Властивості категорії" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Властивості звантаження" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Новий торент" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Нове метапосилання" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Відкрити torrent-файл" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Відкрити файл метапосилань" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Не вдалося зберегти файл категорії." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Не вдалося завантажити файл категорії." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Зберегти файл категорії" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Відкрити файл категорії" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Посилання " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Зображення " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Текстовий файл" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Імпортувати URL-адреси з HTML-файлу" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Імпортувати URL-адреси з текстового файлу" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Експорт URL-адрес у текстовий файл" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Перелік посилань" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "У буфері обміну не знайдено URL-адрес." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Усі URL-адреси вже існують." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "З буферу обміну" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Нова" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Помилка" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Повідомлення" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Обрано записів: %d" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Користувачі UGet, зверніть увагу:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "ми запустили Donation Drive для подальшої розробки uGet, будь ласка, клацніть" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ТУТ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "будь ласка, пройдіть швидке опитування користувачів uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "натисніть тут, аби пройти опитування" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Назва категорії:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Активні з_вантаження:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Кількість завершених:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Кількість вилучених:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "Умови розпізнавання URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Розпізнавати _хости:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Розпізнавати _схеми:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Розпізнавати _типи:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Справді вийти?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Ви справді бажаєте вийти?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Справді волієте вилучити файли?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Ви впевнені, що бажаєте вилучити файли?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Справді вилучити категорію?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Ви впевнені, що волієте вилучити категорію?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Не питати знову" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Дзеркала:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Виберіть теку" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Тека:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Посилання на сторінку:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Максимальне число з’єднань:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Запуск" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "_Призупинення" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Вхід" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Користувач:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Пароль:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Файл-куки:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Виберіть файл з куками" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Відвантажуваний файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Виберіть Post-файл" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Клієнт користувача:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Межа кількости спроб:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "раз" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Затримка між спробами:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунд" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Максимальна швидкість відвантаження:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/с" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Максимальна швидкість завантаження:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Отримувати часову мітку" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Файл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Пакункове завантаження" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_З буферу обміну" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Перелік посилань" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Текстовий файл імпорту (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML-файл імпорту (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Експортувати до текстового файлу (.txt)" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Відкрити категорію..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Зберегти категорію як..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Зберегти _усі налаштування" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Режим офлайн" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Редагування" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Стежити за _буфером обміну" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Буфер обміну у автоматичному режимі" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Командний рядок у автоматичному режимі" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Пропускати існуючі URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "_Дії після завершення" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Відімкнено" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Гібернація" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Режим очікування" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Завершення роботи" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Перезавантаження" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Користувацьке" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Запам’ятати налаштування" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Довідка" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Налаштування…" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Перегляд" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Панель знарядь" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Рядок стану" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Зведення" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Поля _зведення" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Назва" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Тека" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Повідомлення" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Стовпці переліку звантажень" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Завершено" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Розмір" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "Відсоток '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Пройшло часу" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Залишилось часу" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Швидкість" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Швидкість завантаження" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Відвантажено" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Відношення" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Cпроби" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Додано в" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Завершено в" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Категорія" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Створити категорію…" #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "Ви_лучити категорію" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Звантаження" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Вилучити запис" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Вилучити запис і _файл" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Відкрити _каталог, що містить" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Примусовий запуск" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Перемістити до" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Пріоритет" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Високий" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Звичайний" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Низький" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Отримати допомогу онлайн" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Документація" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Форум підтримки" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Відіслати відгук" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Сповістити про недолік" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Скорочення клавіш" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Перевірити наявність оновлень" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Налаштування" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Не вдається запустити типову проґраму для файлу „%s“" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' – цієї теки не існує." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI вже існує" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Цей URI вже існує, Ви впевнені, що бажаєте продовжити?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Загальні" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Додаткові" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Налаштування категорії" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Типово для нового завантаження 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Типове 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "неназване" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Призупинено" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Вивантаження" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Завершено" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Вилучені" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "У черзі" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Активно" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Усі стани" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Назва" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Завершено" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Розмір" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Минуло" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Залишилося" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Кількість" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Проксі:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Не використовувати" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Типово" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Сайт:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Сокет:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Аргументи сокета:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Елемент:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Пон" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Вів" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Сер" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Чет" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "П’ят" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Суб" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Нед" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Увімкнути планувальник" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Вимкнути" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- зупинити усі завдання" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Нормальний" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- запустити завдання у звичайному режимі" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Усі" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Жодного" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "позначення за фільтром" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Відзначити URL-адреси за сайтом ТА розширенням файлу." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Це скине усі позначення URL-адрес." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Сайт" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Розширення файлу" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "База гіпертекстових посилань" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Позначити _усі" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "_Зняти позначки" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "Від_фільтрувати…" #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "Наприклад:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Від:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "До:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "цифри:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_Від:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "з урахуванням регістру" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Не використовувати символ підстановки (*) в URL-адресі." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Невірна URL." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Немає символів у входженні „Від“ чи „До“." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Попередній перегляд" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Користувацький інтерфейс" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Пропускна здатність" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Планувальник" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Доповнення" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Інше" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Увімкнути моніторинг буферу обміну" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_У автоматичному режимі" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Індекс типової категорії" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Долучення до N-ої категорії, якщо категорія не розпізнана." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Стежити за ціма типами файлів у буфері обміну:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Відокремлювати типи символом „|“." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Тут Ви можете використовувати регулярні вирази." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Підтвердження" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Показувати вікно підтвердження при виході" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Питати схвалення при вилученні файлів" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Системна таця" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Завжди показувати піктограму у треї" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Ховати до системної таці при запуску" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Приховувати у тацю при закриванні вікна" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Використовувати індикатор застосунків Ubuntu" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Задіяти автономний режим при запуску" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Повідомлення при запуску звантаження" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Звук при завершенні звантаження" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Вони впливають на усі втулки." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Глобальні обмеження швидкості" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Максимальна швидкість вивантаження" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Максимальна швидкість завантаження" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Дії після завершення" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Користувацька команда:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Користувацька команда при виникненні помилки:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Автозбереження" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Інтервал:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "хвилини" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Налаштування командного рядка" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Типово використовувати '--quiet'" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Порядок розпізнавання втулок:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Параметри втулки aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "Секретний токен RPC-авторизації" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Глобальні обмеження швидкості лише для aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Запускати aria2 під час завантаження" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Закривати aria2 при виході" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Запускати aria2 на локальному пристрої" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Шлях" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Аргументи" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Ви повинні перезавантажити uGet після внесення змін." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Файл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Тека" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Запис" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Значення" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Копіювати _усі" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Показати вікно" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Автономний режим" uget-2.2.2/po/bg.po0000664000175000017500000013216613470304401010757 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Atanas Kovachki , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Bulgarian (http://www.transifex.com/uget/uget/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Всички категории" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Свързване..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Предаване..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Отново" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Изтеглянето приключи" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Завършено" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Възобновено" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Не е възобновено" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Изходния файл не може да се преименува." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "не може да се свърже с хоста." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Папката не може да бъде създадена." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Файла не може да бъде създаден (лошо име на файл или файла съществува)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Файла не може да бъде отворен." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Няма ресурси (диска е препълнен или няма достатъчно памет)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Няма изходен файл." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Няма изходящи настройки." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Твърде много повторни опити." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Неподдържана схема (протокол)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Неподдържан файл." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Твърде много пренасочвания." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Даунлоуд мениджър" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Атанас Ковачки " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "задачи" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Нов от клипборда" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Ново изтегляне" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Клипборд" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Команден ред" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Изтеглянето стартира" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Стартиране на чакащо изтегляне." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Изтеглянето завърши" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Всички чакащи сваляния, са завършени." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Статус" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Категория" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Създай ново изтегляне" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Ново _изтегляне..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Нова _категория..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Нов _от клипборда" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Нова последователност от _връзки..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Нов торент..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Нов металинк..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Съхрани всички настройки" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Установи избраното изтегляне на изпълнение" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Установи избраното изтегляне на пауза" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Настройки на избраните изтегляния" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Премести избраното изтегляне нагоре" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Премести избраното изтегляне надолу" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Премести избраното изтегляне най-отгоре" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Премести избраното изтегляне най-отдолу" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Нова категория" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Копирай - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Свойства на категорията" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Свойства на изтеглянето" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Нов торент" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Нов металинк" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Отвори торент файл" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Отвори металинк файл" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Връзка " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Изображение " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Текстов файл" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Импорт на връзки от HTML файл" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Импорт на връзки от текстов файл" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Последователност на връзките" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Няма открити връзки в клипборда." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "От клипборда" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Грешка" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Съобщение" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Избрани %d елемента" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Внимание, потребители на uGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "ние пуснахме Donation Drive за бъдещото развитие на uGet, моля, кликнете" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ТУК" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "моля, попълните потребителската анкетата за uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "кликнете тук, за да попълните анкетата" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Име на категорията:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Активни _изтегляния:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Количество изтегляния:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Количество изтрити:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Наистина ли искате да излезете?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Наистина ли искате да излезете?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Наистина ли да изтриете файловете?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Наистина ли искате да изтриете файловете?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Огледала:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Изберете папка" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Папка:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Източник на прехода:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Стартирай" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "П_ауза" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Вход" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Потребител:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Парола:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Файл с бисквитките:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Изберете файл с бисквитките" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Изпращащ файл:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Изберете файл за изпращане" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Потребител:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_Число на повторенията:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "пъти" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Забавяне на _повторенията:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "секунди" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Max скорост на качване:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "кб/с" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Max скорост на изтегляне:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Получавай времевия отпечатък" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Файл" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Пакетно изтегляне" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "От _клипборда..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Последователност на _връзки..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Импортирай _текстов файл (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Импортирай _HTML файл (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Експортирай в текстов файл (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Редактиране" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "_Следи за клипборда" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Приложи настройките от последното изтегляне" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Помощ" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Настройки..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Преглед" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Лента с _инструменти" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Лента за състоянието" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Подробности" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "_Показвай в подробностите" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Име" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Папка" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_Връзка" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Съобщение" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "_Колони за изтеглянето" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Завършено" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Размер" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "Про_цент '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Изминало" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Остава" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Скорост" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Скорост на качване" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Качено" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Рейтинг" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Повтори" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Добавено на" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Завършено на" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Категория" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Нова категория..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Изтрий категорията" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Изтегляне" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Бързо стартиране" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "П_ремести в" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Приоритет" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Получете помощ онлайн" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Документация" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Форум за поддръжка" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Оставете коментар" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Съобщете за грешка" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Проверете за актуализации" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Настройки" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Не може да се стартира стандартното приложение за файла '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - папката не съществува." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Главни" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Разширени" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Настройки на категорията" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Стандартно за ново изтегляне 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Стандартно 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "неименуван" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "На пауза" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Изтрити" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Чакащи" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Активни" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Име" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Завършено" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Размер" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Измина" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Остава" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Количество" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Прокси:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Не използвай" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Стандартно" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Хост:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Порт:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Сокет:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Сокет аргументи:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Елемент:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Пон" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Вто" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Сря" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Чет" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Пет" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Съб" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Нед" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Включи планировчика" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Изключи" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- спри всички задачи" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Нормално" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- стартирай нормално задачата" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Всички" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Нищо" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Маркирай по филтър" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Маркирай връзките по хост и разширение на файла." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Това ще възстанови всички маркирани връзки." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Хост" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Разширение на файла" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "Връзка" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "База от връзки" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Маркирай _всички" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Отмаркирай _всички" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Маркирай по филтър..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "Например:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "О_т:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "До:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "цифри:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "_От:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "малки и главни букви" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Няма символа в шаблона(*) във връзката." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Връзката не е валидна." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "В полетата 'От' или 'До' няма нищо." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Преглед" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Потребителски интерфейс" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Планировчик" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Плъгини" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Други" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Тих режим" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Разделете видове, използвайки символа \"|\"." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Можете да използвате регулярни изрази тук." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Потвърждение при изтриване на файлове" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Винаги показвай иконката в трея" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Минимизирай в трея при стартиране" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Включи тихия режим при стартиране" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Известие при стартиране на изгегляне" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Звуково известие при завършване на изтеглянето" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Интервал:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "минути" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Настройки на командния ред" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Използвай '--quiet' стандартно" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Пускай aria2 при стартиране" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Изключвай aria2 при изход" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Път" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Аргументи" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Файл" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Папка" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Елемент" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Значение" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Копирай _всички" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Покажи прозореца" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Офлайн режим" uget-2.2.2/po/hu.po0000664000175000017500000013222513470304402011000 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Balzamon, 2016-2018 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2018-02-06 10:03+0000\n" "Last-Translator: Balzamon\n" "Language-Team: Hungarian (http://www.transifex.com/uget/uget/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Összes kategória" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Kapcsolódás..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Átvitel..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Újra" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "A letöltés kész." #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Kész" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Folytatható" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nem folytatható" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "A kimeneti fájl nem nevezhető át." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "kapcsolódás a kiszolgálóhoz sikertelen" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "A mappa nem hozható létre." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "A fájl nem hozható létre (hibás fájlnév vagy a fájl létezik)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "A fájl nem nyitható meg." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nem lehet létrehozni a letöltési szálat." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Hibás forrás (eltérő fájl méret)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Az forrás nem érhető el (a lemez vagy a memória megtelt)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Nincs kimeneti fájl." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nincs kimeneti beállításl." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Túl sok újrapróbálkozás." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nem támogatott rendszer (protokol)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nem támogatott fájl." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "post fájl nem található" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "A cookie fájl nem található." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "A videót törölték." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Hiba történt a video info beszerzésekor." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Hiba történt a videó weboldalának betöltésekor." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: ismeretlen hiba történt." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: időtúllépési hiba." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: a forrás nem található." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 a forrás nem létezik hibát észlelt. Lásd --max-file-not-found opció" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: az átviteli sebesség túl kicsi" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: hálózati hiba." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: befejezetlen letöltés." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Az erőforrások elfogytak." #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: a szelet hossza eltér az .aria2 kontroll fájlban megadottétól." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 letöltötte már ezt a fájlt." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 letöltötte már ugyanezt a torrent szelet info-t." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: A fájl már létezik. Lásd --allow-overwrite opció." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: Nem nyitható meg ugyanaz a fájl." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: az új fájl nem hozható létre vagy nem írható felül létező fájl." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: fájl írás/olvasási hiba." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: a névfeloldás meghiúsult." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: nem elemezhető Metalink dokumentum." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: az FTP parancs végrehajtása meghiúsult." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: nem várt vagy hibás HTTP válasz fejléc" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Túl sok átirányítás." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP jogosultsági hiba." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: nem elemezhető kódolt fájl(.torrent file)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: a torrent fájl hibás vagy hiányzó információ" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet URI hibás" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: hibás/ismeretlen opció" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: a távoli szerver nem elérhető a kérés feldolgozásához" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: nem elemezhető JSON-RPC kérés" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Nincs válasz. Az aria2 kilépett?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: a csoportazonosító eltávolítva." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "A media link nem nyitható meg." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Letöltéskezelő" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Fordítók listája" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet alapító:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet projekt menedzser:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "feladatok" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Új vágólapról" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Új letöltés" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Vágólap" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Parancssor" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Hiba történt" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Hiba történt a letöltéskor." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Letöltés indítása" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Letöltési sor indítása." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Letöltés kész" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Minden sorban álló letöltés befejeződött." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Állapot" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategória" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Új letöltés létrehozása" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Új _letöltés..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Új _Kategória..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Új kötegelt letöltés _vágólapról..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Új _letöltési sor URL..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Új torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Új metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Összes beállítás mentése" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Kiválasztott letöltés indítása" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Kiválasztott letöltés megállítása" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Kiválasztott letöltés tulajdonságai" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Rangsor növelés" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Rangsor csökkentés" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Rangsor legmagasabb" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Rangsor legalacsonyabb" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Új kategória" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Másolás -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategória beállítások" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Letöltési beállítások" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Új torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Új metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Torrent fájl megnyitása" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent fájl (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Metalink fájl megnyitása" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "A kategória fájl mentése nem sikerült." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "A kategória fájl betöltése nem sikerült." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Kategória fájl mentése" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Kategória fájl megnyitása" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON file (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Link " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Kép " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Szöveg fájl" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Hivatkozás import HTML fájlból" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML file (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Hivatkozás import vágólapról" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "A hivatkozások exportálása szövegfájlba" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Letöltési sor URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nincs hivatkozás a vágólapon" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Már az összes URL létezik." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Köteg vágólapról" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Új" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Hiba" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Üzenet" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Kiválasztott %d elemek" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Figyelmeztetés uGet használóknak:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Itt támogathatod a jövőbeni fejlesztéseket." #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ITT" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "Kérlek töltsd ki ezt a felmérést az Ugetről." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "klikkelj ide a felméréshez" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Kategória _név:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktív _letöltések:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Befejezett" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Töröltek:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI egyező feltételek" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Egyező _host-ok:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Egyező _sémák:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Egyező _típusok:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Biztosan kilép?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Tényleg kilépsz?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Tényleg törlöd a fájlokat?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Tényleg törlöd a fájlokat?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Tényleg törlöd a kategóriát?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Biztos, hogy törölni akarod a kategóriát?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Ne kérdezd meg újra" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Tükrök:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fájl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Mappa választás" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Mappa:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Hivatkozó:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maximális kapcsolatok száma:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Indítás" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "Szün_et" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Belépés" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Felhasználó:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Jelszó:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookie fájl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Cookie fájl kiválasztás" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post fájl:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Post fájl kiválasztása" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Felhasználói ügynök:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Újracsatlakozások _korlátozása" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "db" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Késleltetett _próbálkozás:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "másodpercek" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maximális feltöltési sebesség:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maximális letöltés sebesség:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Időbélyeg kinyerése" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Fájl" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Kötegelt letöltés" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Kötegelt letöltés vágólapról..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_Letöltési sor URL-ből..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Szövegfájl import (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML fájl import (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportálás szövegfájlba (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Kategória megnyitása..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Kategória mentése mint.." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Összes _beállítás mentése" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Kapcsolat nélküli mód" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Szerkesztés" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Vágólap _figyelő" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "A vágólap háttérben fut" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "A parancssor a háttérben fut" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Létező URI átugrása" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Alkalmazd a legújabb letöltési beállításokat" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Az automatikus műveletek _befejezése" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Elutasít" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Hibernálás" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Alvó állapot" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Leállít" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Újraindít" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Egyéni" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Beállítások megjegyzése" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Segítség" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Beállítások..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Nézet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Eszköztár" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Állapotjelző" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Összegzés" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Elemek _tulajdonságai" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Név" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Mappa" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Üzenet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Letöltési _oszlopok" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Teljes" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Méret" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Százalék '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Eltelt idő" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Hátralévő" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Sebesség" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Sebesség növelés" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Feltöltés" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Arány" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Újra" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Hozzáadott" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Befejezett" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategória" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Új kategória..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Kategória törlése" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Letöltés" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Bejegyzés törlése" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "A hivatkozás és a fájl törlése" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Letöltési _mappa megnyitása" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Kényszerített indítás" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Áthelyez" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Elsőbbség" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Magas" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normál" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Alacsony" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Online segítségnyújtás" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Leírások" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Támogatási fórum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Visszajelzés küldése" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Hibajelentés küldése" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Billentyűkombinációk" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Frissítések keresése" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Beállítások" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Az alapértelmezett alkalmazás nem futtatható a '%s' fájlhoz." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - A mappa nem létezik." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI már létezik" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Az URI már létezik, biztos hogy folytatod?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Általános" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Haladó" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Kategória beállítások" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Alapértelmezett letöltés 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Alapértelmezett 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "névtelen" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Megállt" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Feltöltés" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Kész" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Törölt" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Várólista" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktív" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Összes állapot" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Név" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Kész" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Méret" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Eltelt idő" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Hátralévő" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Mennyiség" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Ne használd" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Alapértelmezett" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Kommunikációs végpont:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Elem:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Hét" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Ked" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Sze" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Csü" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pén" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Szo" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Vas" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Ütemező engedélyezése" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Kikapcsolás" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- minden folyamat leállítása" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normál" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- folyamat futtatása normál módban" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Összes" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Egyik sem" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Kijelölés szűrővel" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URL-ek megjelölése a kiszolgáló által ÉS fájlnév kiterjesztés." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Az összes URL kijelölés megszüntetése" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Szerver" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Fájl kiterj." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Alap hypertext hivatkozás" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Összes _kijelölése" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Egyik _sem kijelölése" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Kijelölés szűrővel..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "pl" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Innen:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "To:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "számjegyek:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "F_rom:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "nagybetű-érzékeny" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Nincs joker(*) karakter az URL bejegyzés" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "A hivatkozás hibás." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Nincs karakter a 'From' vagy a 'To' bejegyzésben." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Előnézet" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Felhasználói felület" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Sávszélesség" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Ütemező" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Beépülő" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Egyebek" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Vágólap figyelés engedélyezése" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Néma üzemmód" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Alapértelmezett kategória index" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Hozzáadás az N-dik kategóriához, ha nincs egyező kategória." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Vágólap figyelés megadott fájltípusok után:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Típusok elválasztása '|' karakterrel" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Reguláris kifejezés használható." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Megerősítés" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Mutasd a megerősítés ablakot kilépéskor." #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Megerősítés fájlok törlésekor" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Rendszertálca" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Mindig mutassa a tray ikont" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Indítás minimódban a tálcán" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Tedd tálcára az ablak bezárásakor" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Használd az Ubuntu alkalmazás indikátort" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Offline mód engedélyezése induláskor" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Értesítés a letöltés megkezdésekor" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Hangjelzés a letöltés végén" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Nagy ikon" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Minden plug-in-ra vonatkozik." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Globális sebesség korlátozás" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maximális feltöltési sebesség:" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maximális letöltés sebesség:" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Az automatikus műveletek befejezése" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Egyedi parancs" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Hiba esetén egyedi parancs futtatása" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Automatikus mentés" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervallum:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "percek" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Parancssori beállítások" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Használd a '--csendes módot' alapértelmezetten" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Plug-in egyezőségi sorrend:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 beépülők beállításai" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC jogosultsági titkosító eszköz" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Globális letöltési sebesség korlátozás csak az aria2-nek" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Aria2 futtatása indításkor" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Aria2 leállítása kilépéskor" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Futtasd az aria2 a helyi meghajtón" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Útvonal" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Paraméterek" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Az uGet újraindítása szükséges a módosítások érvényesítéséhez." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Egyező feltételek" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Minőség:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Típus:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fájl" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Mappa" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Elem" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Érték" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Összes _másolás" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Mutasd az ablakot" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Kapcsolat nélküli mód" uget-2.2.2/po/sv.po0000664000175000017500000013231013470304402011007 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Patrik Nilsson , 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-16 10:31+0000\n" "Last-Translator: Patrik Nilsson \n" "Language-Team: Swedish (http://www.transifex.com/uget/uget/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "Demon för lösenordshanterare: uget\n\nUnder försöket att upprätta en SSH anslutning till %s uppstod det ett problem med verifieringen av dess värdnyckel emot den kända och betrodda värd filen, eftersom dess värdnyckel inte hittades.\n\nVill du behandla den här anslutningen som betrodda för denna och framtida anslutningar genom att lägga till %s's värdnyckel till den kända värdfilen?" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "All kategorin" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Ansluter..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Överför..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Försök igen" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Nedladdning slutförd" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Slutförd" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Kan återupptas" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Kan ej återupptas" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Output-fil kan inte döpas om." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "kunde inte ansluta till värd." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Mappen kan inte skapas." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Filen kan inte skapas (ogiltigt filnamn eller filen existerar redan)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Filen kan inte öppnas." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Kunde inte skapa tråd." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Felaktig källa (skiljaktig filstorlek)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Slut på resurser (disken är full eller slut på arbetsminne)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Ingen output-fil." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Ingen output inställning" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "För många försök." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Protokollet stöds ej." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Filen stöds ej." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "post-filen hittades inte." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "kakfilen hittades inte." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "Den här videon har tagits bort." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Fel uppstod under hämtningen av video info." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "Fell uppstod under hämtningen av video webbsida." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Inget video_id hittades i URL till YouTube." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: ett okänt fel inträffade." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: timeout inträffade." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: resursen hittades inte." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "aria2 såg det angivna antalet 'resursen hittades inte' fel. Se alternativet --max-file-not-found." #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: hastigheten var för låg." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: ett nätverksproblem uppstod." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: oavslutade nedladdningar." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "Slut på resurser" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: bit längd var annorlunda än en i .aria2 kontroll filen." #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 hämtade samma fil." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 hämtade samma info hash torrent." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: filen existerade redan. Se --allow-overwrite alternativet." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: kunde inte öppna den befintliga filen." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: kunde inte skapa ny fil eller ändra befintlig fil." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: fil I/O fel inträffade." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: namn uppslagning misslyckades." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aira2: kunde inte tolka Metalink dokumentet." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP-kommandot misslyckades." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aira2: HTTP-svarshuvud var felaktig eller oväntat." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "För många omdirigeringar." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP autentisering misslyckades." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: kunde inte tolka bencoded fil (vanligtvis .torrent fil)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aira2: torrent filen var korrupt eller saknade information." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aira2: Magnetlänk URI var felaktig." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aira2: felaktig/oigenkännligt alternativ angavs eller oväntat alternativ argument angivet." #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: fjärrservern kunde inte hantera förfrågan." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: kunde inte tolka JSON-RPC förfrågan." #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Inget svar. Är aria2 nedstängt?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: gid togs bort." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Misslyckade att hämta media-länk." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "Inget matchat media." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Nedladdningshanterare" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Patrik Nilsson " #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet Grundare:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet Projektledare:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "uppgifter" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Ny från urklipp" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Ny nedladdning" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Urklipp" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "Kommandorad" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Fel uppstod" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Fel uppstod under nedladdning." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Nedladdning startar" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Startar nedladdnings kö." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Nedladdning slutförd" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Alla nedladdningar i kön har slutförts." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategorier" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Skapa ny nedladdning" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Ny _nedladdning..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Ny _kategori..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Ny _sats från urklipp..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Ny _URL sekvenssats..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Ny torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Ny metalänk..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Spara alla inställningar" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Kör markerad nedladdning" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Pausa markerad nedladdning" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Ställ in den markerade nedladdningens egenskaper" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Flytta markerad nedladdning upp" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Flytta markerad nedladdning ner" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Flytta markerad nedladdning till toppen" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Flytta markerad nedladdning till botten" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Ny kategori" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopiera -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Kategori egenskaper" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Nedladdnings egenskaper" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Ny torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Ny metalänk" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Öppna torrent-fil" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Torrent fil (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Öppna metalänk-fil" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Det gick inte att spara kategori filen." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Det gick inte att läsa in kategori filen." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Spara kategori fil" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Öppna kategori fil" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "JSON fil (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Länk " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Bild " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Textfil" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importera URL:er från HTML-fil" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "HTML fil (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importera URL:er från textfil" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Vanlig textfil" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Exportera URL:er till text fil" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "URL sekvenssats" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Inga URL:er hittades i urklipp." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Alla URL:er har existerat." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Urklippssats " #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Ny" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Fel" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Meddelande" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Markerade %d objekt" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Observera! uGet användare:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "vi har en donations insamling för uGets framtida utveckling, vänligen klicka" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "HÄR" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "vänligen fyll i den här snabba användarundersökningen för uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "klicka här för att ta undersökningen" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Kategori _namn:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktiva _nedladdningar:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Kapacitet för slutförda:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Kapacitet för borttagna:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI matchande förhållanden" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "Matchade _värdar:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "Matchade _scheman:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "Matchade _typer:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Vill du avsluta?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Är du säker på att du vill avsluta?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Vill du ta bort filerna?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Är du säker på att du vill ta bort filerna?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Vill du ta bort kategorin?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Är du säker på att du vill radera kategorin?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Fråga mig inte igen" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_URI:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Speglar:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Fil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Välj mapp" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Mapp:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Hänvisare:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Max anslutningar:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Körbar" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "_Pausa" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Inloggning" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Användare:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Lösenord:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Cookie-fil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Välj en Cookie-fil" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post-fil:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Välj en post-fil" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "Användaragent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Gräns för återförsök:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "antal" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Fördröjning mellan _återförsök:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekunder" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Max uppladdningshastighet:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Max nedladdningshastighet:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "Hämta tidsstämpel" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Arkiv" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Satsvisa nedladdningar" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Ur_klippssats..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL sekvenssats..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Import av _textfil (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Import av _HTML-fil (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Exportera till textfil (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Öppna kategori..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Spara kategori som..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Spara _alla inställningar" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Offlineläge" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Redigera" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Urklipps_övervakare" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "Urklipp arbetar tyst" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "Kommandorad arbetar tyst" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Hoppa över befintlig URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Tillämpa senaste nedladdnings inställningar" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "Slutförande _auto-åtgärder" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Inaktivera" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Vila" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Viloläge" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Stäng av" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Starta om" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Anpassad" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Kom ihåg inställning" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Hjälp" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Inställningar..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Visa" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Verktygsfält" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Statusrad" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Sammanfattning" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Sammanfattning av _objekt" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Namn" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Mapp" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Meddelande" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Nedladdnings _kolumner" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Slutförd" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Storlek" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Förlopp" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Kvar" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Hastighet" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Upp hastighet" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Uppladdat" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Ratio" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Försök" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Lades till" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Slutförd den" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategori" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Ny kategori..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Ta bort kategori" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Nedladdning" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Ta bort inlägg" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Ta bort inlägg och _fil" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Öppna _innehållande mapp" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Tvinga uppstart" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Flytta till" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Prioritet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Hög" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normal" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Låg" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Få hjälp online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentation" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Support forum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Skicka feedback" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Rapportera ett fel" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Kortkommandon" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Sök efter uppdateringar" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Inställningar" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Kan inte öppna standardprogram för fil '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Den här mappen finns inte." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI har existerat" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Denna URI hade existerat, är du säker på att fortsätta?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Allmänt" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Avancerat" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Kategori inställningar" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Standard för ny nedladdning 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Standard 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "namnlös" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Pausade" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Uppladdat" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Slutförda" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Borttagna" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "I kö" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktiva" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Alla status" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Namn" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Slutförd" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Storlek" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Förlopp" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Kvar" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Kvantitet" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Använd ej" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Standard" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Värd:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket argument:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Mon" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Tis" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Ons" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Tor" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Fre" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Lör" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Sön" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "Aktivera _schemaläggare" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Stäng av" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- stoppa alla uppgifter" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normal" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- kör uppgifter som vanligt" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Alla" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Ingen" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Markera efter filter" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Markera URL:er efter värd OCH filändelse." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Detta kommer att återställa alla URL:ers markeringar." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Värd" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Filändelse" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Grundreferens för hypertext" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Markera _alla" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Markera _ingen" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Markera efter filter..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "ex." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Från:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Till:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "siffror:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "F_rån:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "Skillnad mellan små/större bokstäver" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Inga asterisk(*) tecken i URL:en." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL:en är inte giltig" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Inga tecken i 'Från' eller 'Till' fälten." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Förhandsvisning" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Användargränssnitt" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Bandbredd" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Schemaläggare" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Insticksmodul" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "Media webbplats" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Övriga" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Aktivera urklippsövervakare" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Tyst läge" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Standard kategori index" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "Lägger till i Nth kategori om ingen matchade kategori." #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Övervaka URL till media webbplats" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Övervaka urklipp efter specificerade filtyper:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Separera typerna med '|' tecknet." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Du kan använda reguljära uttryck här." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Bekräftelse" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Visa bekräftelsedialog vid avslut" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Bekräfta när du tar bort filer" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Systemfältet" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Visa alltid en ikon i systemfältet" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimera till systemfält vid uppstart" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Stäng till systemfält vid stängning" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "Använd Ubuntu's app indikator" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Aktivera offline läge vid uppstart" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Notifiera när en nedladdning påbörjas" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Spela en ton när nedladdning är slutförd" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Visa stor ikon" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "Dessa kommer att påverka alla insticksmoduler." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Global hastighetsbegränsning" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Max uppladdningshastighet" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Max nedladdningshastighet" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "Slutförande auto-åtgärder" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Anpassat kommando:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Anpassat kommando om fel inträffade:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Auto-spara" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Intervall:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minuter" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Kommandorad inställningar" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Använd '--quiet' som standard" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "Insticksmoduler i matchande ordning:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Alternativ för aria2 insticksmodul" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "RPC hemligt autentiserings token" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Endast global hastighetsbegränsning för aria2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Starta aria2 vid uppstart" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Stäng aria2 vid nedstängning" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Starta aria2 på lokal enhet" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Sökväg" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argument" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Du måste starta om uGet efter att ha modifierat det." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "Media matchningsläge:" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "Match förhållanden:" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Kvalitet:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Typ:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Fil" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Mapp" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Objekt" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Värde" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopiera _alla" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Visa fönster" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Offline-läge" uget-2.2.2/po/pl.po0000664000175000017500000013076313470304402011004 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Artur Frącek , 2013 # div off , 2016-2017 # fazi.3294, 2014 # Krzysztof Kokot , 2016 # Miś Uszatek , 2012 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-01-01 13:42+0000\n" "Last-Translator: div off \n" "Language-Team: Polish (http://www.transifex.com/uget/uget/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "Wszystkie kategorie" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "Łączenie..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "Transmisja..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "Powtórzeń" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "Pobieranie ukończone" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "Ukończono" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "Wznawialny" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "Nie wznawialny" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "Plik wyjściowy nie może być zmieniony." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "nie można połączyć się z hostem." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "Folder nie może zostać utworzony." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "Plik nie może zostać utworzony (zła nazwa pliku lub plik istnieje)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "Plik nie może być otwarty." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "Nie można utworzyć wątku" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "Nieprawidłowe źródło (inny rozmiar pliku)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "Obecne zasoby (pełny dysk lub zabrakło pamięci)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "Brak pliku wyjściowego." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "Nie ustawiono wyjścia." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "Zbyt wiele prób." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "Nieobsługiwany schemat (protokół)." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "Nieobsługiwany plik." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "Nie znaleziono pliku postu." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "Nie znaleziono pliku cookie." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "To wideo zostało usunięte." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "Wystąpił błąd podczas pobierania informacji o wideo." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "Nie znaleziono video_id w adresie URL z YouTube'a" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: wystąpił nieznany błąd." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: przekroczono czas oczekiwania." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: nie znaleziono zasobu." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: szybkość połączenia była za wolna." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: wystąpił błąd sieciowy." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: niedokończone pobierania." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 ściągała ten sam plik." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: plik już istnieje. Zobacz opcję --allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: nie można otworzyć istniejącego pliku." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: nie można utworzyć nowego pliku lub usunąć istniejącego." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: wystąpił błąd wejścia/wyjścia w pliku." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: rozpoznawanie nazw nie powiodło się." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: zawiodło polecenie FTP." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: odpowiedź nagłówka HTTP była zła lub niespodziewana." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "Za dużo przekierowań." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: zawiodła autoryzacja HTTP." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: plik torrentu był uszkodzony lub brakowało w nim informacji." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: serwer zdalny nie był w stanie obsłużyć żądania." #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "Nie ma odpowiedzi. Czy aria2 jest wyłączona?" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: usunięto gid." #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "Nie udało się pobrać linku do mediów." #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "Menedżer Pobierania" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "Piotr Ozarowski, 2005-2006.\nMiś Uszatek, 2012" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "Twórca uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "Menadżer projektu uGet" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "zadania" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "Nowy ze schowka" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "Nowe Pobierania" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "Schowek" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "linia poleceń" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "Wystąpił błąd." #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "Wystąpił błąd podczas pobierania." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "Rozpoczęto Pobieranie" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "Uruchomienie kolejki pobierania." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "Pobieranie Ukończone" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "Wszystkie kolejki pobierania zostały ukończone." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "Status" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "Kategoria" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "Utwórz nowe pobieranie" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "Nowe _Pobieranie..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "Nowa _Kategoria..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "Wklej nową grupę ze schowka" #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "Nowa grupa sekwencji adresów URL" #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "Nowy Torrent..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "Nowy Metalink..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "Zapisz wszystkie ustawienia." #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "Wznowienie wybranego pobierania " #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "Wstrzymanie wybranego pobierania" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "Ustaw właściwości wybranego pobierania" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "Przenieś zaznaczone pobieranie wyżej" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "Przenieś zaznaczone pobieranie niżej" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "Przenieś zaznaczone pobieranie na górę" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "Przenieś zaznaczone pobieranie na dół" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "Nowa Kategoria" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "Kopiuj -" #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "Właściwości Kategorii" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "Właściwości Pobierania " #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "Nowy Torrent" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "Nowy Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "Otwórz Plik Torrent " #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "Plik torrent (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "Otwórz Plik Metalink" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "Nie udało się zapisać pliku kategorii." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "Nie udało się załadować pliku kategorii." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "Zapisz plik categorii" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "Otwórz plik kategorii" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "Plik JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "Odnośniki " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "Obrazki " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "Plik tekstowy" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "Importuj adresy z pliku HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "Plik HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "Importuj adresy z pliku tekstowego" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "Plik tekstowy" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "Eksportuj adresy URL do pliku tekstowego." #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "Sekwencyjna grupa adresów URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "Nie znaleziono adresów w schowku." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "Wszystkie adresy URL już istniały." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "Wklej grupę ze schowka" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "Nowy" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "Błąd" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "Komunikaty" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "Wybrano %d pozycje " #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "Uwaga użytkownicy UGet:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "Zbieramy dotacje na sfinansowanie przyszłych wersji uGet, proszę kliknij" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "TUTAJ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "proszę wypełnij tę krótką ankietę dla użytkowników uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "kliknij tutaj aby wypełnić ankietę" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "_Nazwa kategorii:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Aktywnych połączeń:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "Pojemność Ukończonych" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "Pojemność Kosza" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "Naprawdę wyjść?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "Czy na pewno chcesz zamknąć?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "Naprawdę usunąć pliki?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "Czy na pewno chcesz usunąć pliki?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "Na pewno usunąć kategorię?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "Jesteś pewny, że chcesz usunąć kategorię?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "Nie pytaj mnie ponownie" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "Obrazy Lustrzane:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "Plik:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "Wybierz Folder" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Folder:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "Odsyłacz:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "_Maksymalna liczba połączeń" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Wznów" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_auza" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "Logowanie" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "Użytkownik:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "Hasło:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "Plik ciasteczka:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "Wybierz Plik Ciasteczka" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Prześlij pliki:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "Wybierz Plik do Wysłania" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "User agent:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Limit _Ponowień:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "Ilość" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Ponów z _opóźnieniem:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "sekund" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "Maksymalna prędkość wysyłania:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "Maksymalna prędkość pobierania:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "znacznik czasu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_Plik" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "Pobierz Grupę" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "Wklej grupę ze schowka" #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "Sekwencyjna grupa adresów URL" #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "Importuj z pliku tekstowego (.txt)" #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "Importuj z pliku HTML (.html)" #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "Eksportuj do pliku tekstowego (.txt)" #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "_Otwórz kategorię..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "_Zapisz kategorię jako..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "Zapisz _wszystkie ustawienia" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "Tryb offline" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Edycja" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Monitorowanie _Schowka" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "Pomiń istniejące adresy URI" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "Zastosuj ostatnie ustawienia pobierania" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_Wyłącz" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "Zahibernuj" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "Uśpij" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "Zamknij" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "Uruchom ponownie" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "Własne" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "Zapamiętaj ustawienia" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Pomoc" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Ustawienia..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_Widok" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "Pasek narzędzi" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "Pasek stanu" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Podsumowanie" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Pozycje Podsumowania" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Nazwa" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Folder" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_Adres" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Wiadomość" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Kolumny Pobierania" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Ukończono" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Rozmiar " #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Procent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Upłynęło" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Pozostało" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "Szybkość" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "Prędkość wysyłania" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "Wysłane" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "Stosunek" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Ponów" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "Dodano" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "Ukończono " #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Kategoria" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_Nowa Kategoria..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Usuń kategorię" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Pobierz" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "_Usuń Wpis" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "Usuń Wpis i _Plik" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "Otwóż _folder zawierający plik" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "Wymuś Start" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Przenieś Do" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "Priorytet" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_Wysoki" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "_Normalny" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "_Niski" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "Pomoc Online" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "Dokumentacja" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "Forum" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "Wyślij Twoją Opinię" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "Zgłoś Błąd" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "Skróty klawiaturowe" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "Aktualizacja" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "Ustawienia" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "Nie można uruchomić domyślnej aplikacji dla pliku '%s'." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - Ten folder nie istnieje." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI już istniał" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "Ten adres URI już istniał, jesteś pewien, że chcesz kontynuować?" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "Ogólny" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "Zaawansowany" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "Ustawienia kategorii" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "Domyślne nowe pobranie 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "Domyślny 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "bez nazwy" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "Zatrzymano" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "Przesyłanie" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "Ukończono" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "Kosz" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "Kolejka" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "Aktywne" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "Wszystkie" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "Nazwa" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "Ukończono" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "Rozmiar" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "Upłynęło" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "Pozostało" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "URI" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "Wielkość" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "Proxy:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "Nie używaj" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "Domyślny" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "Host:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "Port:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Gniazdo:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Argumenty gniazda:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "Pon" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "Wt" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "Śro" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "Czw" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "Pt" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "Sob" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "Niedz" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Włącz Harmonogram" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "Wyłącz" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- zatrzymaj wszystkie zadania" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "Normalny" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- uruchom zadanie normalnie" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "Wszystko" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "Brak" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "Zaznacz przez filtr" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "Zaznacz adres przez host i rozszerzenie pliku." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "Spowoduje to zresetowanie wszystkich zaznaczonych adresów." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "Host" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "Plik Zewn." #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "Adres" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "Baza odwołań hipertekstu" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Zaznacz _Wszystko" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Brak _Zaznaczenia" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Zaznacz przez filtr..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "np." #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_Od:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "Do:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "cyfrowy:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "O_d" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "wielkość liter" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "Brak symbolu(*) wieloznacznego w zapisie adresu." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "Adres URL jest nieprawidłowy." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "Brak znaków w pozycji 'Z' lub 'Do'" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "Podgląd" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "Interfejs Użytkownika" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "Przepustowość" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "Harmonogram" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "Wtyczki" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "Inne" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "_Włącz monitor schowka" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Cichy tryb" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "Domyślny indeks kategorii" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "Monitorować schowek dla określonych typów plików:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "Oddziel typy przez znak '|'." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "Możesz użyć wyrażeń regularnych tutaj." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "Potwierdzenie" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "Wyświetl dialog potwierdzenia przy wyjściu" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "Potwierdź przy usuwaniu plików" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "Zasobnik systemowy" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "Zawsze pokazuj ikonę na pasku zadań" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "Minimalizuj do zasobnika na starcie" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "Zminimalizuj do zasobnika systemowego po zamknięciu okna" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "Włącz tryb offline na starcie" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "Włącz powiadomienia pobierania" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "Dźwięk, gdy pobieranie zostanie ukończone" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "Wyświetl dużą ikonę" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "Ogólne ograniczenia szybkości" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "Maksymalna prędkość wgrywania" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "Maksymalna prędkość pobierania" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "Własne polecenie" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "Własne polecenie jeżeli wystąpi błąd" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "_Autozapis" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Odstęp:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "minut" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "Ustawienia Wiersza Poleceń" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "Użyj '--quiet' domyślnie" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Opcje dodatku Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Ogólne ograniczenia szybkości tylko dla arii2" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Uruchom aria2 na starcie" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Zamknij aria2 przy wyjściu" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "Uruchom aria2 na urządzeniu lokalnym" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "Ścieżka" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Argumenty" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "Musisz uruchomić ponownie uGet po modyfikacji tego." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "Jakość:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "Typ:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "Plik" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "Folder" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "Pozycja" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "Wartość" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Kopiuj _Wszystko" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "Pokaż okno" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Tryb offline" uget-2.2.2/po/zh_TW.po0000664000175000017500000012013713470304402011416 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # chhuang , 2014 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-06 15:22+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: chhuang \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/uget/uget/language/" "zh_TW/)\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../uget/UgetApp.c:109 msgid "All Category" msgstr "全分類" #. UGET_EVENT_NORMAL_CUSTOM #: ../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "連線中..." #. UGET_EVENT_NORMAL_CONNECT #: ../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "傳輸中..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../uget/UgetEvent.c:60 ../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "重試" #. UGET_EVENT_NORMAL_RETRY, #: ../uget/UgetEvent.c:61 msgid "Download completed" msgstr "下載完成" #. UGET_EVENT_NORMAL_COMPLETE, #: ../uget/UgetEvent.c:62 ../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "已結束" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../uget/UgetEvent.c:64 msgid "Resumable" msgstr "可續傳" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../uget/UgetEvent.c:65 ../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "無法續傳" #. UGET_EVENT_WARNING_CUSTOM #: ../uget/UgetEvent.c:73 ../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "輸出檔無法改名。" #. UGET_EVENT_ERROR_CUSTOM #: ../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "無法連接到主機。" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../uget/UgetEvent.c:82 ../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "資料夾無法建立" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "檔案無法建立 (檔名錯誤或檔案已經存在)。" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "檔案無法開啟。" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "無法建立執行緒。" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "不正確的來源 (檔案大小不同)" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "系統資源不足 (儲存空間或記憶體不足)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../uget/UgetEvent.c:88 msgid "No output file." msgstr "沒有指定輸出檔案。" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../uget/UgetEvent.c:89 msgid "No output setting." msgstr "沒有輸出的設定。" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "重試太多次。" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "不支援的通訊協定。" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "不支援的檔案。" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: 發生未知的錯誤。" #: ../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "aria2: 發生超時。" #: ../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: 找不到資源。" #: ../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specified number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" "aria2 發現'找不到資源'的錯誤達到指定的數量。請看參數 --max-file-not-found" #: ../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: 數度太慢。" #: ../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: 發生網絡問題。" #: ../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: 未結束的下載。" #. _("Not Resumable"), #: ../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "資源用盡" #. _(), #: ../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: 片段長度和 .aria2 控制文件所紀錄的不同。" #. 11 - 20 #: ../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "aria2 已經下載過相同的檔案。" #: ../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "aria2 正在下載相同的 Torrent。" #: ../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2 文件已經存在。請看參數 --allow-overwrite" #. _("Output file can't be renamed."), #: ../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: 無法開啟已經存在的檔案." #: ../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: 無法創建新的文件或截斷現有文件。" #: ../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: 發生文件讀寫錯誤。" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: 名稱解析失敗。" #: ../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: 無法解析的 Metalink 檔案。" #. 21 - 30 #: ../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: FTP 命令失敗。" #: ../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: HTTP 回應開頭部分損壞或預期以外的。" #: ../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "重新導向太多次." #: ../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: HTTP 授權失敗。" #: ../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: 無法解析編碼文件(通常是 .torrent 文件)" #: ../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: torrent文件被損壞或丟失信息。" #: ../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: Magnet 的 URI 已損壞。" #: ../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: 收到損壞/無法識別的選項或意外的選項參數。" #: ../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: 遠程服務器無法處理請求。" #: ../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: 無發分析 JSON-RPC 請求。" #: ../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "沒有回應。 aria2 是否關閉?" #. debug #: ../uget/UgetPluginAria2.c:650 msgid "aria2: gid was removed." msgstr "aria2: gid 已被删除。" #: ../uget/UgetPluginMedia.c:498 msgid "Failed to get media link." msgstr "" #: ../uget/UgetPluginMedia.c:514 msgid "No matched media." msgstr "" #: ../uget/UgetPluginMega.c:176 msgid "Can't handle this MEGA URL." msgstr "" #: ../uget/UgetPluginMega.c:203 msgid "Can't get download URL." msgstr "" #: ../uget/UgetPluginMega.c:653 msgid "decrypting file..." msgstr "" #: ../uget/UgetPluginMega.c:745 msgid "decryption completed" msgstr "" #: ../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "下載管理程式" #: ../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "繁體中文 (zh_TW) - 黃正雄" #: ../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "uGet 創立者: " #: ../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "uGet 項目經理: " #. "↓" #. "↑" #: ../ui-gtk/UgtkApp-timeout.c:262 ../ui-gtk/UgtkTrayIcon.c:240 msgid "tasks" msgstr "任務" #: ../ui-gtk/UgtkApp-timeout.c:398 msgid "New from Clipboard" msgstr "從剪貼簿新增" #: ../ui-gtk/UgtkApp-timeout.c:400 ../ui-gtk/UgtkApp.c:912 msgid "New Download" msgstr "新增下載" #: ../ui-gtk/UgtkApp-timeout.c:424 ../ui-gtk/UgtkApp.c:1684 #: ../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "剪貼簿" #: ../ui-gtk/UgtkApp-timeout.c:426 msgid "Command line" msgstr "命令列" #: ../ui-gtk/UgtkApp-timeout.c:779 msgid "Error Occurred" msgstr "發生錯誤" #: ../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred during downloading." msgstr "下載期間發生錯誤。" #: ../ui-gtk/UgtkApp-timeout.c:781 msgid "Download Starting" msgstr "開始下載" #: ../ui-gtk/UgtkApp-timeout.c:782 msgid "Starting download queue." msgstr "開始下載佇列" #: ../ui-gtk/UgtkApp-timeout.c:783 msgid "Download Completed" msgstr "下載完成" #: ../ui-gtk/UgtkApp-timeout.c:784 msgid "All queuing downloads have been completed." msgstr "所有排隊中的檔案下載完成." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../ui-gtk/UgtkApp-ui.c:193 ../ui-gtk/UgtkDownloadForm.c:224 #: ../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "狀態" #. Summary Items - Category #. Download Columns - Category #: ../ui-gtk/UgtkApp-ui.c:195 ../ui-gtk/UgtkMenubar-ui.c:318 #: ../ui-gtk/UgtkMenubar-ui.c:346 ../ui-gtk/UgtkMenubar-ui.c:431 #: ../ui-gtk/UgtkNodeDialog.c:418 ../ui-gtk/UgtkNodeView.c:932 #: ../ui-gtk/UgtkNodeView.c:1020 ../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "分類" #: ../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "建立新的下載" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../ui-gtk/UgtkApp-ui.c:289 ../ui-gtk/UgtkMenubar-ui.c:58 #: ../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "新增下載(_D)..." #. New Category #: ../ui-gtk/UgtkApp-ui.c:300 ../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "新增分類(_C)..." #. New Clipboard batch #: ../ui-gtk/UgtkApp-ui.c:310 ../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "新增剪貼簿批次下載(_B)..." #. New URL Sequence batch #: ../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "新增 _URL 序列下載..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, gtk_separator_menu_item_new() ); #. New Torrent #: ../ui-gtk/UgtkApp-ui.c:335 ../ui-gtk/UgtkMenubar-ui.c:81 #: ../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "新增 Torrent..." #. New Metalink #: ../ui-gtk/UgtkApp-ui.c:342 ../ui-gtk/UgtkMenubar-ui.c:87 #: ../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "新增 Metalink..." #: ../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "儲存全部設定" #: ../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "選擇的項目設定為可運行的" #: ../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "選擇的項目設定為暫停" #: ../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "設定選擇的項目的內容" #: ../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "選擇的項目向上移" #: ../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "選擇的項目向下移" #: ../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "選擇的項目向上移到頂" #: ../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "選擇的項目向下移到底" #: ../ui-gtk/UgtkApp.c:881 msgid "New Category" msgstr "新增分類" #: ../ui-gtk/UgtkApp.c:891 msgid "Copy - " msgstr "複製 - " #: ../ui-gtk/UgtkApp.c:1047 msgid "Category Properties" msgstr "分類內容" #: ../ui-gtk/UgtkApp.c:1061 msgid "Download Properties" msgstr "下載內容" #: ../ui-gtk/UgtkApp.c:1302 msgid "New Torrent" msgstr "新增 Torrent" #: ../ui-gtk/UgtkApp.c:1318 msgid "New Metalink" msgstr "新增 Metalink" #: ../ui-gtk/UgtkApp.c:1327 msgid "Open Torrent file" msgstr "開啟 Torrent 檔案" #: ../ui-gtk/UgtkApp.c:1330 msgid "Torrent file (*.torrent)" msgstr "" #: ../ui-gtk/UgtkApp.c:1343 msgid "Open Metalink file" msgstr "開啟 Metalink 檔案" #: ../ui-gtk/UgtkApp.c:1383 msgid "Failed to save category file." msgstr "分類檔案儲存失敗。" #: ../ui-gtk/UgtkApp.c:1403 msgid "Failed to load category file." msgstr "分類檔案載入失敗。" #: ../ui-gtk/UgtkApp.c:1414 msgid "Save Category file" msgstr "儲存分類檔案" #: ../ui-gtk/UgtkApp.c:1432 msgid "Open Category file" msgstr "開啟分類檔案" #: ../ui-gtk/UgtkApp.c:1435 msgid "JSON file (*.json)" msgstr "" #. add link #: ../ui-gtk/UgtkApp.c:1491 msgid "Link " msgstr "連結 " #. add image #: ../ui-gtk/UgtkApp.c:1496 msgid "Image " msgstr "影像 " #: ../ui-gtk/UgtkApp.c:1541 msgid "Text File" msgstr "文字檔案" #: ../ui-gtk/UgtkApp.c:1588 msgid "Import URLs from HTML file" msgstr "從 HTML 檔案匯入網址" #: ../ui-gtk/UgtkApp.c:1591 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../ui-gtk/UgtkApp.c:1603 msgid "Import URLs from text file" msgstr "從文字檔案匯入網址" #: ../ui-gtk/UgtkApp.c:1606 msgid "Plain text file" msgstr "" #: ../ui-gtk/UgtkApp.c:1618 msgid "Export URLs to text file" msgstr "匯出網址到文字檔案" #: ../ui-gtk/UgtkApp.c:1637 msgid "URL Sequence batch" msgstr "URL 序列下載" #: ../ui-gtk/UgtkApp.c:1663 msgid "No URLs found in clipboard." msgstr "剪貼簿裡面沒有網址。" #: ../ui-gtk/UgtkApp.c:1672 msgid "All URLs had existed." msgstr "全部的 URL 都已經存在。" #: ../ui-gtk/UgtkApp.c:1677 msgid "Clipboard batch" msgstr "剪貼簿批次下載" #: ../ui-gtk/UgtkApp.c:1766 msgid "New" msgstr "新增" #: ../ui-gtk/UgtkApp.c:1807 ../ui-gtk/UgtkMenubar.c:460 #: ../ui-gtk/UgtkMenubar.c:492 ../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "錯誤" #: ../ui-gtk/UgtkApp.c:1815 ../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "訊息" #: ../ui-gtk/UgtkApp.c:1931 #, c-format msgid "Selected %d items" msgstr "已選擇 %d 個項目" #: ../ui-gtk/UgtkBanner.c:145 ../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "關注 uGetters:" #: ../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "我們正在進行uGet未來發展的募捐,請按" #: ../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "這裡" #: ../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "請填寫快速用戶調查。" #: ../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "按這裡參加調查" #: ../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "分類名稱(_N):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "啟動下載數量(_D):" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "'已結束'的容量:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "'回收區'的容量:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "URI 配對條件" #: ../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "配對主機(_H):" #: ../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "配對協議(_S):" #: ../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "配對檔案類型(_T):" #: ../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "真的要離開?" #: ../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "你確定要離開?" #: ../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "真的要刪除文件?" #: ../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "你確定要刪除檔案?" #: ../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "真的要刪除分類?" #: ../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "你確定要刪除分類?" #: ../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "下次別問我" #. URL - label #: ../ui-gtk/UgtkDownloadForm.c:111 ../ui-gtk/UgtkSequence.c:235 msgid "_URI:" msgstr "網址(_U)" #. Mirrors - label #: ../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "鏡像:" #: ../ui-gtk/UgtkDownloadForm.c:141 msgid "Leave blank to use default filename ..." msgstr "保持空白以使用預設檔名 ..." #. File - label #: ../ui-gtk/UgtkDownloadForm.c:146 ../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "檔案:" #: ../ui-gtk/UgtkDownloadForm.c:166 ../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "選擇資料夾" #. Folder - label #: ../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "資料夾(_F):" #. Referrer - label #: ../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "參照位址:" #. "Max Connections:" - title label #: ../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "最大連線數(_M)" #: ../ui-gtk/UgtkDownloadForm.c:230 ../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "可運行(_R)" #: ../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "暫停(_A)" #. ---------------------------------------------------- #. frame for login #: ../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "登入" #. User - label #. user label & entry #: ../ui-gtk/UgtkDownloadForm.c:252 ../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "使用者:" #. Password - label #. password label & entry #: ../ui-gtk/UgtkDownloadForm.c:268 ../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "密碼:" #. label - cookie file #: ../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "cookie 資料檔" #: ../ui-gtk/UgtkDownloadForm.c:310 ../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "選擇 cookie 資料檔" #. label - post file #: ../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "Post 檔案:" #: ../ui-gtk/UgtkDownloadForm.c:336 ../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "選檡 Post 檔案" #. label - user agent #: ../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "用戶代理:" #. Retry limit - label #: ../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "重試限制(_L):" #. counts - label #: ../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "次" #. Retry delay - label #: ../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "重試延遲(_D):" #. seconds - label #: ../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "秒" #. label - Max upload speed #: ../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "最大上傳速度" #. label - "KiB/s" #: ../ui-gtk/UgtkDownloadForm.c:418 ../ui-gtk/UgtkDownloadForm.c:436 #: ../ui-gtk/UgtkSettingForm.c:311 ../ui-gtk/UgtkSettingForm.c:323 #: ../ui-gtk/UgtkSettingForm.c:612 ../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "KiB/s" #. label - Max download speed #: ../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "最大下載速度" #. Retrieve timestamp #: ../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "取回時間戳記" #: ../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "檔案(_F)" #. Batch Downloads --- start --- #: ../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "批次下載(_B)" #. Batch downloads - Clipboard batch #: ../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "剪貼簿批次下載(_C)..." #. Batch downloads - URL Sequence batch #: ../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL 序列下載..." #. Batch downloads - Text file import (.txt) #: ../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "匯入文字檔(_T)..." #. Batch downloads - HTML file import (.html) #: ../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "匯入HTML檔(_H)..." #. Batch downloads - Export to Text file (.txt) #: ../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "匯出文字檔(_E)..." #. Open Category #: ../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "開啟分類檔案(_O)..." #. Save Category #: ../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "另存分類為(_S)..." #. Save All #: ../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "儲存全部設定(_A)" #. Offline mode #: ../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "離線模式" #: ../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "編輯(_E)" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. Settings shortcut #: ../ui-gtk/UgtkMenubar-ui.c:215 ../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "監視剪貼簿(_M)" #: ../ui-gtk/UgtkMenubar-ui.c:219 ../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "剪貼簿静静地工作" #: ../ui-gtk/UgtkMenubar-ui.c:223 ../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "命令列静静地工作" #: ../ui-gtk/UgtkMenubar-ui.c:227 ../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "跳過已有的URI" #: ../ui-gtk/UgtkMenubar-ui.c:231 ../ui-gtk/UgtkSettingForm.c:223 #: ../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "套用上一次的下載設定" #. --- Completion Auto-Actions --- start --- #: ../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "完成自動操作(_A)" #. Completion Auto-Actions - Disable #: ../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "禁用(_D)" #: ../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "休眠" #: ../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "暫停" #: ../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "關機" #: ../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "重新開機" #: ../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "自訂" #. Completion Auto-Actions - Remember #: ../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "記住設定" #. Completion Auto-Actions - Help #: ../ui-gtk/UgtkMenubar-ui.c:279 ../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "說明(_H)" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../ui-gtk/UgtkMenubar-ui.c:285 ../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "設定(_S)..." #: ../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "檢視(_V)" #: ../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "工具列(_T)" #: ../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "狀態列" #: ../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "摘要(_S)" #. Summary Items --- start --- #: ../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "摘要項目(_I)" #. Summary Items - Name #: ../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "名稱(_N)" #. Summary Items - Folder #: ../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "資料夾(_F)" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../ui-gtk/UgtkMenubar-ui.c:356 ../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "網址(_U)" #. Summary Items - Message #: ../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "訊息(_M)" #: ../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "下載欄位(_C)" #. Download Columns - Complete #: ../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "完成(_C)" #. Download Columns - Total #: ../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "大小(_S)" #. Download Columns - Percent (%) #: ../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "百分比 '%' (_P)" #. Download Columns - Elapsed #: ../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "經過時間(_E)" #. Download Columns - Left #: ../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "剩餘時間(_L)" #. Download Columns - Speed #: ../ui-gtk/UgtkMenubar-ui.c:406 ../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "速度" #. Download Columns - Up Speed #: ../ui-gtk/UgtkMenubar-ui.c:411 ../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "上傳速度" #. Download Columns - Uploaded #: ../ui-gtk/UgtkMenubar-ui.c:416 ../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "上傳大小" #. Download Columns - Ratio #: ../ui-gtk/UgtkMenubar-ui.c:421 ../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "分享比" #. Download Columns - Retry #: ../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "重試(_R)" #. Download Columns - Added On #: ../ui-gtk/UgtkMenubar-ui.c:441 ../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "加入時間" #. Download Columns - Completed On #: ../ui-gtk/UgtkMenubar-ui.c:446 ../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "完成時間" #: ../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "分類(_C)" #. New Category #: ../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "新增分類(_N)..." #. Delete Category #: ../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "刪除分類(_D)" #: ../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "下載(_D)" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, accel_group); #: ../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "刪除資料(_D)" #: ../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "刪除檔案和資料(_F)" #: ../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "開啟所在的資料夾(_C)" #: ../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "強制開始" #. Move to --- start --- #: ../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "搬移到(_M)" #. Priority --- start --- #: ../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "優先權" #: ../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "高(_H)" #: ../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "一般(_N)" #: ../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "低(_L)" #. Get Help Online #: ../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "取得線上協助" #. Documentation #: ../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "文件" #. Support Forum #: ../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "支援論坦" #. Submit Feedback #: ../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "提交反饋" #. Report a Bug #: ../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "回報錯誤" #. Keyboard Shortcuts #: ../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "快捷鍵" #. Check for Updates #: ../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "檢查更新" #: ../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "設定" #: ../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "無法啟動檔案 '%s' 的預設應用程式." #: ../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - 這個資料夾不存在." #. title #: ../ui-gtk/UgtkNodeDialog.c:219 ../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "URI已經存在" #: ../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "這個URI已經存在,你確定要繼續嗎?" #: ../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "一般設定" #: ../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "進階設定" #: ../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "分類設定" #: ../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "新增下載的預設值 1" #: ../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "預設值 2" #: ../ui-gtk/UgtkNodeView.c:143 ../ui-gtk/UgtkNodeView.c:608 #: ../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "未命名" #: ../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "暫停" #: ../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "上傳中" #: ../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "已完成" #: ../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "回收區" #: ../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "排隊中" #: ../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "活躍的" #: ../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "全狀態" #: ../ui-gtk/UgtkNodeView.c:773 ../ui-gtk/UgtkSettingDialog.c:101 #: ../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "名稱" #: ../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "完成" #: ../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "大小" #: ../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "經過時間" #: ../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "剩餘時間" #: ../ui-gtk/UgtkNodeView.c:946 ../ui-gtk/UgtkSettingForm.c:584 #: ../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "網址" #: ../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "數量" #. proxy type label & combo box #: ../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "代理伺服器:" #: ../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "不使用" #: ../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "預設" #. host label & entry #: ../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "主機:" #. port label & entry #: ../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "埠號:" #: ../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "Socket:" #: ../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "Socket args:" #: ../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "Element:" #: ../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "一" #: ../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "二" #: ../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "三" #: ../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "四" #: ../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "五" #: ../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "六" #: ../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "日" #: ../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "啟用排程器(_E)" #. Turn off - label #: ../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "關閉" #. Turn off - help label #: ../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- 停止所有任務" #. Normal - label #: ../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "一般" #. Normal - help label #: ../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- 正常運行" #: ../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "全部" #: ../ui-gtk/UgtkSelector.c:259 ../ui-gtk/UgtkSequence.c:59 msgid "None" msgstr "清除" #: ../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "條件標記" #: ../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "用主機名稱和副檔名來標記網址." #: ../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "這個功能會重新設定所有的標記." #. filter view ----------------------- #. left side #: ../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "主機名稱" #. right side (filename extension) #: ../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "副檔名" #: ../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "網址" #: ../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "基本超文本引用" #. select all #: ../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "標記全部(_A)" #. select none #: ../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "清除標記(_N)" #. select by filter #: ../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "條件標記(_M)" #: ../ui-gtk/UgtkSequence.c:61 msgid "Num" msgstr "" #: ../ui-gtk/UgtkSequence.c:63 msgid "Char" msgstr "" #. Label - To #: ../ui-gtk/UgtkSequence.c:89 msgid "To:" msgstr "到:" #. label - digits #: ../ui-gtk/UgtkSequence.c:104 msgid "digits:" msgstr "位數:" #. label - case-sensitive #: ../ui-gtk/UgtkSequence.c:128 msgid "case-sensitive" msgstr "大小寫不同" #. e.g. #: ../ui-gtk/UgtkSequence.c:246 msgid "e.g." msgstr "範例" #: ../ui-gtk/UgtkSequence.c:295 msgid "URI is not valid." msgstr "不合法的網址." #: ../ui-gtk/UgtkSequence.c:303 msgid "No wildcard(*) character in URI entry." msgstr "網址項目裡沒有萬用字元(*)." #: ../ui-gtk/UgtkSequence.c:311 msgid "No character in 'From' or 'To' entry." msgstr "'從'或'到'的項目裡沒有資料." #: ../ui-gtk/UgtkSequence.c:393 msgid "Preview" msgstr "預覽" #: ../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "用戶界面" #: ../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "頻寬" #: ../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "排程器" #: ../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "外掛程式" #: ../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "媒體網站" #: ../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "其他" #. Monitor button #: ../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "監視剪貼簿(_E)" #. quiet mode #: ../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "安靜模式(_Q)" #: ../ui-gtk/UgtkSettingForm.c:72 ../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "預設分類索引" #: ../ui-gtk/UgtkSettingForm.c:84 ../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "添加到第N個分類,如果沒有匹配的類別。" #. media or storage website #: ../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of website" msgstr "監視網站的 URL" #: ../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "監視剪貼簿裡指定的檔案類型:" #: ../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "用 '|' 字元分隔檔案類型." #: ../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "這裡可以使用正規表達式." #: ../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "確認" #. Confirmation check buttons #: ../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "關閉時確認" #: ../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "刪除檔案時確認" #: ../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "系統列" #. System Tray check buttons #: ../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "永遠顯示系統列圖示" #: ../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "啟動時縮小到系統列" #: ../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "關閉視窗時縮小到系統列" #: ../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "使用Ubuntu的 App Indicator" #: ../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "啟動時進入離線模式" #: ../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "開始下載時通知" #: ../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "下載完成時發出聲音" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "顯示大圖示" #: ../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "這些將影響到所有的外掛程式。" #. Global speed limit #: ../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "全體速度限制" #: ../ui-gtk/UgtkSettingForm.c:309 ../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "最大上傳速度" #: ../ui-gtk/UgtkSettingForm.c:321 ../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "最大下載速度" #: ../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "完成自動操作" #: ../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "自定命令:" #: ../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occurred:" msgstr "如果發生錯誤時自定命令:" #: ../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "自動存檔(_A)" #. auto save interval label #: ../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "間隔(_I):" #. auto save interval unit label #: ../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "分鐘" #. Commandline Settings #: ../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "命令列設定" #. --quiet #: ../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "預設使用 '--quiet' 參數" #: ../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "外掛程式匹配順序:" #: ../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "Aria2 外掛程式選項" #: ../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "遠程呼叫授權密碼" #. ------------------------------------------------------------------------ #. Speed Limits #: ../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "Aria2 全域速度限制" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "啟動時執行 aria2" #. shutdown #: ../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "離開時關閉 aria2" #. ------------------------------------------------------------------------ #. Local options #: ../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "本地設備執行 aria2" #: ../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "路徑" #: ../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "參數" #. Arguments - hint #: ../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "修改'參數'之後必須重新啟動 uGet。" #: ../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "媒體配對模式:" #: ../ui-gtk/UgtkSettingForm.c:788 msgid "Don't match" msgstr "不配對" #: ../ui-gtk/UgtkSettingForm.c:790 msgid "Match 1 condition" msgstr "符合1個配對條件" #: ../ui-gtk/UgtkSettingForm.c:792 msgid "Match 2 condition" msgstr "符合2個配對條件" #: ../ui-gtk/UgtkSettingForm.c:794 msgid "Near quality" msgstr "近似品質" #: ../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "配對條件" #. Quality #: ../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "品質:" #. Type #: ../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "格式:" #: ../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "檔案" #: ../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "目錄" #: ../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "項目" #: ../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "值" #. Copy All #: ../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "複製全部(_A)" #. Show window #: ../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "顯示視窗" #. Offline mode #: ../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "離線模式(_O)" #~ msgid "_From:" #~ msgstr "從(_F):" #~ msgid "F_rom:" #~ msgstr "從(_R):" uget-2.2.2/po/or_IN.po0000664000175000017500000013552013470304402011373 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2016-11-09 16:16+0000\n" "Last-Translator: Michael Tunnell \n" "Language-Team: Oriya (India) (http://www.transifex.com/uget/uget/language/or_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: or_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "ସଂଯୋଗ କରୁଛି......" #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "ପ୍ରେରଣ କରାଯାଉଛି..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "ପୁନଃ-ଚେଷ୍ଟା କରନ୍ତୁ" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "ଆହରଣ ସମାପ୍ତ ହେଲା" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "ସମାପ୍ତ" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "ପୁନଃ-ଆରମ୍ଭଯୋଗ୍ୟ" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "ପୁନଃ-ଆରମ୍ଭଯୋଗ୍ୟ ନୁହେଁ" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "ନିର୍ଗମ ଫାଇଲର ପୁନଃ-ନାମକରଣ କରି ହେବ ନାହିଁ" #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "ହୋଷ୍ଟ ସହିତ ଯୋଗାଯୋଗ କରାଯାଇ ପାରୁନାହିଁ" #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "ଫୋଲ୍ଡର ତିଆରି କରିହେବନାହିଁ" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "ଫାଇଲ ତିଆରି କରି ହେବନାହିଁ (ଖରାପ ନାମ ଅଥବା ଏହି ନାମରେ ଫାଇଲ ଆଗରୁ ଉପଲବ୍ଧ)" #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "ଫାଇଲ ଖୋଲି ହେଉନାହିଁ" #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "" #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "" #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "ସମ୍ବଳର ଅଭାବ (ଡିସ୍କ ଭର୍ତି ଅଥବା ସ୍ମୃତିର ଅଭାବ)" #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "ନିର୍ଗମ ଫାଇଲ ନାହିଁ" #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "ନିର୍ଗମ ବିନ୍ୟାସ ନାହିଁ" #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "ମାତ୍ରାଧିକ ପୁନଃ-ଚେଷ୍ଟା" #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "ଅସମର୍ଥିତ ଯୋଜନା (ଅଧିନିୟମ)" #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "ଅସମର୍ଥିତ ଫାଇଲ" #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "" #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "" #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "" #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "" #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "" #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "" #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "" #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "ମାତ୍ରାଧିକ ପୁନଃ-ନିର୍ଦ୍ଦେଶନା" #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "ଆହରଣ ପରିଚାଳକ" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "ଅନୁବାଦକ-କ୍ରେଡିଟ" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "କାର୍ଯ୍ୟସବୁ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "କ୍ଲିପ୍-ବୋର୍ଡ୍ ରୁ ନୂଆ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "ନୂଆ ଆହରଣ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "କ୍ଲିପ୍-ବୋର୍ଡ୍" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "କମାଣ୍ଡ ଲାଇନ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "" #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "ଆହରଣ ଆରମ୍ଭ ହେଉଛି" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "ଆହରଣ ଶୃଙ୍ଖଳା ଆରମ୍ଭ ହେଉଛି" #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "ଆହରଣ ସମାପ୍ତ ହେଲା" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "ସମସ୍ତ ଶୃଙ୍ଖଳାବଦ୍ଧ ଆହରଣ ସମାପ୍ତ ହେଲା" #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "ସ୍ଥିତି" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "ବିଭାଗ" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "ନୂଆ ଆହରଣ ତିଆରି କରନ୍ତୁ" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "New _Download..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "New _Category..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "New Clipboard _batch..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "New _URL Sequence batch..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "ନୂଆ ଟରେଣ୍ଟ..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "ନୂଆ ମେଟାଲିଙ୍କ..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "ଚୟନୀତ ଆହରଣକୁ ଚଳନକ୍ଷମ ହିସାବରେ ସେଟ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "ଚୟନୀତ ଆହରଣ ବିରତି ପାଇଁ ସେଟ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "ଚୟନୀତ ଆହରଣର ଗୁଣ-ଧର୍ମ ସ୍ଥିର କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "ଚୟନୀତ ଆହରଣକୁ ଉପରକୁ ସ୍ଥାନାନ୍ତରିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "ଚୟନୀତ ଆହରଣକୁ ତଳକୁ ସ୍ଥାନାନ୍ତରିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "ଚୟନୀତ ଆହରଣକୁ ସବୁଠାରୁ ଉପରକୁ ସ୍ଥାନାନ୍ତରିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "ଚୟନୀତ ଆହରଣକୁ ସବୁଠାରୁ ତଳକୁ ସ୍ଥାନାନ୍ତରିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "ନୂଆ ବିଭାଗ" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "ନକଲ କରନ୍ତୁ - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "ବିଭାଗ ବୈଶିଷ୍ଟ୍ୟ" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "ଆହରଣ ଗୁଣ-ଧର୍ମ" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "ନୂଆ ଟରେଣ୍ଟ" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "ନୂଆ ମେଟାଲିଙ୍କ" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "ଟରେଣ୍ଟ ଫାଇଲ ଖୋଲନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "ମେଟାଲିଙ୍କ ଫାଇଲ ଖୋଲନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr "" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "ଲିଙ୍କ " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "ଛବି " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "ଟେକ୍ସଟ ଫାଇଲ" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "HTML ଫାଇଲରୁ URL ଆମଦାନୀ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "ଟେକ୍ସଟ ଫାଇଲରୁ URL ଆମଦାନୀ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "କ୍ରମାନୁସାରେ ସଜ୍ଜିତ URL" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "କ୍ଲିପ୍-ବୋର୍ଡ୍ ରେ କୌଣସି URL ମିଳିଲା ନାହିଁ" #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "କ୍ଲିପ୍-ବୋର୍ଡ୍ ବ୍ୟାଚ" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "ତ୍ରୁଟି" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "ବାର୍ତା" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "ଚୟନୀତ %d ଟି ବସ୍ତୁ" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "uGet ବ୍ୟବହାରକାରୀ, ଧ୍ୟାନ ଦିଅନ୍ତୁ" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "uGetର ଆଗାମୀ ଭବିଷ୍ୟତ ଓ ଉନ୍ନତି ପାଇଁ ଆମେ ଏକ ଆର୍ଥିକ ସାହାଯ୍ୟ କାର୍ଯ୍ୟକ୍ରମ ଚଳାଇଛୁ । ଦୟାକରି କ୍ଲିକ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "ଏଠାରେ" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "ଦୟାକରି ଏହି uGet ପାଇଁ ଏହି ପ୍ରଶ୍ନୋତ୍ତର ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "ପ୍ରଶ୍ନୋତ୍ତର କାର୍ଯ୍ୟକ୍ରମରେ ଭାଗ ନେବାପାଇଁ ଏଠାରେ କ୍ଲିକ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "Category _name:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "Active _downloads:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "ସମାପ୍ତିର କ୍ଷମତା:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "ପୁନଃ-ବ୍ୟବହାର କ୍ଷମତା:" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "ସତରେ ପ୍ରସ୍ଥାନ କରିବେ ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "ଆପଣ ନିଶ୍ଚିତ କି ଆପଣ ପ୍ରସ୍ଥାନ କରିବାକୁ ଚାହାନ୍ତି" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "ସତରେ ଫାଇଲଗୁଡିକ ଅପସାରଣ କରିବାକୁ ଚାହାନ୍ତି ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "ଆପଣ ଏହି ଫାଇଲସବୁ ଅପସାରଣ କରିବାକୁ ନିଶ୍ଚିତ କି ?" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "ମିରର ସବୁ:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "ଫାଇଲ:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "ଫୋଲ୍ଡର ବାଛନ୍ତୁ" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "_Folder:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "ପ୍ରେଷକ:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "_Runnable" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "P_ause" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "ଲଗ୍-ଇନ୍" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "ଉପଭୋକ୍ତା:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "ପ୍ରବେଶ ସଂକେତ:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "କୂକି ଫାଇଲ:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "କୁକୀ ଫାଇଲ ବାଛନ୍ତୁ:" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "ପୋଷ୍ଟ ଫାଇଲ:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "ପୋଷ୍ଟ ଫାଇଲ ବାଛନ୍ତୁ" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "ଇଉଜର ଏଜେଣ୍ଟ:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "Retry _limit:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "ଗଣନା" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "Retry _delay:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "ସେକେଣ୍ଡ" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "ସର୍ବାଧିକ ଅପଲୋଡ ବେଗ:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "କି.ବାଇଟ ସେକେଣ୍ଡପିଛା" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "ସର୍ବାଧିକ ଆହରଣ ବେଗ:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "ଟାଇମଷ୍ଟାମ୍ପ ନେଇ ଆସନ୍ତୁ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_File" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "_Batch Downloads" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "_Clipboard batch..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "_URL Sequence batch..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "_Text file import (.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "_HTML file import (.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_Export to Text file (.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "" #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "" #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_Edit" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "Clipboard _Monitor" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "ସାମ୍ପ୍ରତିକ ଆହରଣ ବିନ୍ୟାସଗୁଡ଼ିକ ପ୍ରୟୋଗ କରନ୍ତୁ" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "_Help" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "_Settings..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "_View" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "_Toolbar" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "ସ୍ଥିତି-ସୂଚିକା" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "_Summary" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "Summary _Items" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "_Name" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "_Folder" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "_URL" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "_Message" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "Download _Columns" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "_Complete" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "_Size" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "_Percent '%'" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "_Elapsed" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "_Left" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "ବେଗ" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "ଅପ ବେଗ" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "ଅପଲୋଡ ହୋଇଛି" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "ଅନୁପାତ" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "_Retry" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "ଆରମ୍ଭ ସମୟ" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "ସମାପ୍ତି ସମୟ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_Category" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "_New Category..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "_Delete Category" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "_Download" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "ବଳପୂର୍ବକ ଆରମ୍ଭ କରନ୍ତୁ" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "_Move To" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "ଅନଲାଇନ ସାହାଯ୍ୟ ନିଅନ୍ତୁ" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "ନଥିପତ୍ର" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "ସହାୟତା କେନ୍ଦ୍ର" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "ମତାମତ ଦିଅନ୍ତୁ" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "ତ୍ରୁଟି ବିଷୟରେ ସୂଚନା ଦିଅନ୍ତୁ" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "ଅଦ୍ୟତନ ଖୋଜନ୍ତୁ" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "ବିନ୍ୟାସ" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr " '%s' ଫାଇଲ ପାଇଁ ପୂର୍ବନିର୍ଦ୍ଧାରିତ ପ୍ରୟୋଗ ଆରମ୍ଭ ହୋଇପାରୁନି" #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "'%s' - ଏହି ଫୋଲ୍ଡରଟି ଉପଲବ୍ଧ ନାହିଁ" #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "ସାଧାରଣ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "ଉନ୍ନତ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "ବିଭାଗ ବିନ୍ୟାସ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "ନୂତନ ଆହରଣ ୧ ପାଇଁ ପୂର୍ବନିର୍ଦ୍ଧାରିତ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ୨" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "ଅନାମଧେୟ" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "ପୁନଃ-ବ୍ୟବହୃତ" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "ଧାଡି" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "ସକ୍ରିୟ" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "ନାମ" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "ସମାପ୍ତ" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "ଆକାର" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "ଅତିକ୍ରାନ୍ତ ହୋଇଛି" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "ବାମ" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "ପରିମାଣ" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "ପ୍ରକ୍ସି:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "ବ୍ୟବହାର କରନ୍ତୁନାହିଁ" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "ହୋଷ୍ଟ:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "ପୋର୍ଟ:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "ସକେଟ୍:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "ସକେଟ୍ ଆର୍ଗୁମେଣ୍ଟ:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "ଉପାଦାନ:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "ସୋମ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "ମଙ୍ଗଳ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "ବୁଧ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "ଗୁରୁ" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "ଶୁକ୍ର" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "ଶନି" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "ରବି" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "_Enable Scheduler" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "ବନ୍ଦ କରନ୍ତୁ" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- ସମସ୍ତ କାର୍ଯ୍ୟ ବନ୍ଦ କରନ୍ତୁ" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "ସ୍ଵାଭାବିକ" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- run task normally" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "ସମସ୍ତ" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "କୌଣସିଟି ନୁହେଁ" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "ପରିସ୍ରବଣ ହିସାବରେ ଚିହ୍ନିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "URLଗୁଡିକୁ ହୋଷ୍ଟ ଏବଂ ଫାଇଲ ଏକ୍ସଟେନସନ ହିସାବରେ ଚିହ୍ନିତ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "ଏହା ସବୁ URLର ମାର୍କଗୁଡିକୁ ପୁନଃ-ସ୍ଥାପନ କରିଦେବ" #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "ହୋଷ୍ଟ" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "ଫାଇଲ ଏକ୍ସ୍ଟ" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "URL" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "ମୂଳ ହାଇପର୍ଟେକ୍ସ୍ଟ ରେଫରେନ୍ସ" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "Mark _All" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "Mark _None" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_Mark by filter..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "ଯେପରିକି:" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_From:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "ପ୍ରତି:" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "ସଂଖ୍ୟା:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "F_rom:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "କେସ୍-ସଂବେଦନଶୀଳ" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "URL ରେ କୌଣସି ୱାଇଲ୍ଡକାର୍ଡ(*) ବର୍ଣ ଉପସ୍ଥିତ ନାହିଁ" #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "URL ବୈଧ ନୁହେଁ" #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "'From' ଅଥବା 'To' ସ୍ଥାନରେ କିଛି ଅକ୍ଷର ଉପସ୍ଥିତ ନାହିଁ" #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "ପ୍ରାକ୍-ଦର୍ଶନ" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "ନିର୍ଘଣ୍ଟକ" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "ପ୍ଲଗ୍-ଇନ୍" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "ଅନ୍ୟାନ୍ୟ" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "_Quiet mode" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "ପ୍ରକାର ଗୁଡିକୁ '|' ଦ୍ଵାରା ଅଲଗା କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "ଏଠାରେ ଆପଣ ଚିରାଚରିତ ଏକ୍ସପ୍ରେସନ ବ୍ୟବହାର କରିପାରନ୍ତି" #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "ଫାଇଲ ଅପସାରଣ କଲାବେଳେ ସୂଚିତ କରାନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "ଟ୍ରେ ଚିତ୍ରସଂକେତ ସବୁବେଳେ ଦେଖାନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "କମ୍ପୁଟର ଚାଲୁହେବା ମାତ୍ରେ ଟ୍ରେ ରେ ମିନିମାଇଜ କରିଦିଅନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "କମ୍ପୁଟର ଚାଲୁହେବା ମାତ୍ରେ ଅଫଲାଇନ ଧାରା ଚାଲୁ କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "ଆହରଣ ଆରମ୍ଭ ହେବାର ବିଜ୍ଞପ୍ତି" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "ଆହରଣ ସମାପ୍ତ ହେଲେ ଏକ ଧ୍ୱନି ଶୁଣାନ୍ତୁ" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "" #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "_Interval:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "ମିନିଟ" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "କମାଣ୍ଡ-ଲାଇନ ବିନ୍ୟାସ" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "'--quiet' ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ ଭାବେ ବ୍ୟବହାର କରନ୍ତୁ" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "_Launch aria2 on startup" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "_Shutdown aria2 on exit" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "ପଥ" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "Arguments" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "ଫାଇଲ" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "ଫୋଲ୍ଡର" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "ବସ୍ତୁ" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "ମୂଲ୍ୟ" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "Copy _All" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "ୱିଣ୍ଡୋ ଦେଖାନ୍ତୁ" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "_Offline Mode" uget-2.2.2/po/ar.po0000664000175000017500000014125213470304401010765 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # ABDULSALAM Arromaih , 2016 # ahmad , 2013 # Benamara Mohamed , 2015 # Hayder Majid , 2016 # Ibrahim Saed , 2014 # Omar Anwar , 2017 msgid "" msgstr "" "Project-Id-Version: uGet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 03:10+0800\n" "PO-Revision-Date: 2017-09-22 23:51+0000\n" "Last-Translator: Omar Anwar \n" "Language-Team: Arabic (http://www.transifex.com/uget/uget/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: ../../po/../uget/pwmd.c:32 #, c-format msgid "" "Password Manager Daemon: uget\n" "\n" "While attempting an SSH connection to %s there was a problem verifying it's hostkey against the known and trusted hosts file because it's hostkey was not found.\n" "\n" "Would you like to treat this connection as trusted for this and future connections by adding %s's hostkey to the known hosts file?" msgstr "خادم مدير كلمات السر:uget\n\nأثناء محاولة عمل أتصال SSH مع %s , حصل خطأ بالتحقق من مفاتيح الإستضافة الخاصة به مع ملف الإستضافات الموثوقة بسبب عدم العثور عليها في هذا الملف .\n\nهل ترغب بمعالجة هذا الخطأ في الاتصال بجعله موثوق الأن و في الإتصالات المستقبلية عن طريق إضافة مفاتيح إستضافة %s's إلي ملف الإستضافات المعروفة ؟" #: ../../po/../uget/UgetApp.c:103 msgid "All Category" msgstr "كل الفئات" #. UGET_EVENT_NORMAL_CUSTOM #: ../../po/../uget/UgetEvent.c:58 msgid "Connecting..." msgstr "يتّصل..." #. UGET_EVENT_NORMAL_CONNECT #: ../../po/../uget/UgetEvent.c:59 msgid "Transmitting..." msgstr "يحيل..." #. UGET_EVENT_NORMAL_TRANSMIT, #: ../../po/../uget/UgetEvent.c:60 ../../po/../ui-gtk/UgtkNodeView.c:917 msgid "Retry" msgstr "الإعادة" #. UGET_EVENT_NORMAL_RETRY, #: ../../po/../uget/UgetEvent.c:61 msgid "Download completed" msgstr "اكتمل التنزيل" #. UGET_EVENT_NORMAL_COMPLETE, #: ../../po/../uget/UgetEvent.c:62 ../../po/../ui-gtk/UgtkNodeView.c:644 msgid "Finished" msgstr "انتهى" #. UGET_EVENT_NORMAL_FINISH, #. resumable #: ../../po/../uget/UgetEvent.c:64 msgid "Resumable" msgstr "قابل للإستئناف" #. UGET_EVENT_NORMAL_RESUMABLE, #: ../../po/../uget/UgetEvent.c:65 ../../po/../uget/UgetPluginAria2.c:287 msgid "Not Resumable" msgstr "غير قابل للإستئناف" #. UGET_EVENT_WARNING_CUSTOM #: ../../po/../uget/UgetEvent.c:73 ../../po/../uget/UgetPluginAria2.c:294 msgid "Output file can't be renamed." msgstr "تعذّرت تسمية الملف المُخرج." #. UGET_EVENT_ERROR_CUSTOM #: ../../po/../uget/UgetEvent.c:81 msgid "couldn't connect to host." msgstr "تعذّر الإتصال بالمضيف." #. UGET_EVENT_ERROR_CONNECT_FAILED #: ../../po/../uget/UgetEvent.c:82 ../../po/../uget/UgetPluginAria2.c:298 msgid "Folder can't be created." msgstr "تعذّر إنشاء المجلد." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:83 msgid "File can't be created (bad filename or file exist)." msgstr "تعذّر إنشاء الملف (اسم الملف سيء أو موجود مسبقًا)." #. UGET_EVENT_ERROR_FILE_CREATE_FAILED #: ../../po/../uget/UgetEvent.c:84 msgid "File can't be opened." msgstr "تعذّر فتح الملف." #. UGET_EVENT_ERROR_FILE_OPEN_FAILED #: ../../po/../uget/UgetEvent.c:85 msgid "Unable to create thread." msgstr "تعذّر إنشاء خيط." #. UGET_EVENT_ERROR_THREAD_CREATE_FAILED, #: ../../po/../uget/UgetEvent.c:86 msgid "Incorrect source (different file size)." msgstr "مصدر غير صحيح (حجم الملفّ مختلف)." #. UGET_EVENT_ERROR_INCORRECT_SOURCE, #: ../../po/../uget/UgetEvent.c:87 msgid "Out of resource (disk full or run out of memory)." msgstr "نفذت الموارد (القرص ممتلئ أو نفذت الذاكرة)." #. UGET_EVENT_ERROR_OUT_OF_RESOURCE #: ../../po/../uget/UgetEvent.c:88 msgid "No output file." msgstr "لا ملف مُخرج." #. UGET_EVENT_ERROR_NO_OUTPUT_FILE #: ../../po/../uget/UgetEvent.c:89 msgid "No output setting." msgstr "لا إعدادات مُخرجة." #. UGET_EVENT_ERROR_NO_OUTPUT_SETTING #: ../../po/../uget/UgetEvent.c:90 msgid "Too many retries." msgstr "الكثير من الإعادات." #. UGET_EVENT_ERROR_TOO_MANY_RETRIES #: ../../po/../uget/UgetEvent.c:91 msgid "Unsupported scheme (protocol)." msgstr "مخطّط (بروتوكول) غير مدعوم." #. UGET_EVENT_ERROR_UNSUPPORTED_SCHEME #: ../../po/../uget/UgetEvent.c:92 msgid "Unsupported file." msgstr "ملف غير مدعوم." #. UGET_EVENT_ERROR_UNSUPPORTED_FILE #: ../../po/../uget/UgetEvent.c:93 msgid "post file not found." msgstr "الملف الملصق غير موجود." #. UGET_EVENT_ERROR_POST_FILE_NOT_FOUND #: ../../po/../uget/UgetEvent.c:94 msgid "cookie file not found." msgstr "ملف الكوكيز غير موجود." #: ../../po/../uget/UgetMedia-youtube.c:275 msgid "This video has been removed." msgstr "تم حذف هذا الفيديو." #: ../../po/../uget/UgetMedia-youtube.c:288 msgid "Error occurred during getting video info." msgstr "حصل خطأ اثناء الحصول على معلومات الفيديو." #: ../../po/../uget/UgetMedia-youtube.c:534 msgid "Error occurred during getting video web page." msgstr "حصل خطأ اثناء الحصول على صفحة الويب للفيديو." #: ../../po/../uget/UgetMedia-youtube.c:606 msgid "No video_id found in URL of YouTube." msgstr "لا يوجد تعريف للفيديو في رابط اليوتيوب." #. 1 - 10 #: ../../po/../uget/UgetPluginAria2.c:280 msgid "aria2: an unknown error occurred." msgstr "aria2: حدث خطأ مجهول." #: ../../po/../uget/UgetPluginAria2.c:281 msgid "aria2: time out occurred." msgstr "الوضع2: إنتهت المهلة." #: ../../po/../uget/UgetPluginAria2.c:282 msgid "aria2: resource was not found." msgstr "aria2: لم يُعثر على المورد." #: ../../po/../uget/UgetPluginAria2.c:283 msgid "" "aria2 saw the specfied number of 'resource not found' error. See --max-file-" "not-found option" msgstr "شاهد aria2 عدد من اخطاء 'المصدر غير موجود' . انظر الى خيارات --max-file-not-found" #: ../../po/../uget/UgetPluginAria2.c:284 msgid "aria2: speed was too slow." msgstr "aria2: كانت السرعة بطيئة جدًّا." #: ../../po/../uget/UgetPluginAria2.c:285 msgid "aria2: network problem occurred." msgstr "aria2: حدثت مشكلة شبكيّة." #: ../../po/../uget/UgetPluginAria2.c:286 msgid "aria2: unfinished downloads." msgstr "aria2: تنزيلات غير منتهية." #. _("Not Resumable"), #: ../../po/../uget/UgetPluginAria2.c:288 msgid "Out of resource" msgstr "نفذت الموارد" #. _(), #: ../../po/../uget/UgetPluginAria2.c:289 msgid "aria2: piece length was different from one in .aria2 control file." msgstr "aria2: طول القطعة مختلف عن احدى الموجودات . ملف تحكم aria2" #. 11 - 20 #: ../../po/../uget/UgetPluginAria2.c:291 msgid "aria2 was downloading same file." msgstr "كان aria2 ينزّل نفس الملف." #: ../../po/../uget/UgetPluginAria2.c:292 msgid "aria2 was downloading same info hash torrent." msgstr "كان aria2 ينزّل نفس معلومات تلبيدة السيل." #: ../../po/../uget/UgetPluginAria2.c:293 msgid "aria2: file already existed. See --allow-overwrite option." msgstr "aria2: الملف موجود بالفعل. طالع خيار ‎--allow-overwrite." #. _("Output file can't be renamed."), #: ../../po/../uget/UgetPluginAria2.c:295 msgid "aria2: could not open existing file." msgstr "aria2: ﻻ يمكن فتح ملف موجود." #: ../../po/../uget/UgetPluginAria2.c:296 msgid "aria2: could not create new file or truncate existing file." msgstr "aria2: لا يمكن إنشاء ملف جديد أو اقتطاع ملف موجود." #: ../../po/../uget/UgetPluginAria2.c:297 msgid "aria2: file I/O error occurred." msgstr "aria2: حدث خطأ دَخْل/خَرْج الملفات." #. UGET_EVENT_ERROR_FOLDER_CREATE_FAILED #: ../../po/../uget/UgetPluginAria2.c:299 msgid "aria2: name resolution failed." msgstr "aria2: فشل تحليل الأسم." #: ../../po/../uget/UgetPluginAria2.c:300 msgid "aria2: could not parse Metalink document." msgstr "aria2: تعذّر تحليل مستند ميتالِنك." #. 21 - 30 #: ../../po/../uget/UgetPluginAria2.c:302 msgid "aria2: FTP command failed." msgstr "aria2: فشل أمر FTP." #: ../../po/../uget/UgetPluginAria2.c:303 msgid "aria2: HTTP response header was bad or unexpected." msgstr "aria2: ردّ HTTP سيّئ أو غير متوقّع." #: ../../po/../uget/UgetPluginAria2.c:304 msgid "Too many redirections." msgstr "إعادات توجيه كثيرة." #: ../../po/../uget/UgetPluginAria2.c:305 msgid "aria2: HTTP authorization failed." msgstr "aria2: فشل إستيثاق HTTP." #: ../../po/../uget/UgetPluginAria2.c:306 msgid "aria2: could not parse bencoded file(usually .torrent file)." msgstr "aria2: لا يمكن تحليل ملف bencoded(عادة ملف .torrent)." #: ../../po/../uget/UgetPluginAria2.c:307 msgid "aria2: torrent file was corrupted or missing information." msgstr "aria2: ملف الترونت معطوب أو معلوماته ناقصة." #: ../../po/../uget/UgetPluginAria2.c:308 msgid "aria2: Magnet URI was bad." msgstr "aria2: معرّف URI الممغنط سيّئ." #: ../../po/../uget/UgetPluginAria2.c:309 msgid "" "aria2: bad/unrecognized option was given or unexpected option argument was " "given." msgstr "aria2: تم اعطاء خيار سيء/غير معروف او تم اعطاء عنصر غير مقبول" #: ../../po/../uget/UgetPluginAria2.c:310 msgid "aria2: remote server was unable to handle the request." msgstr "aria2: لم يتمكن خادوم التحكم من الحصول على الطلب" #: ../../po/../uget/UgetPluginAria2.c:311 msgid "aria2: could not parse JSON-RPC request." msgstr "aria2: لا يمكن تحليل طلب JSON-RPC" #: ../../po/../uget/UgetPluginAria2.c:314 msgid "No response. Is aria2 shutdown?" msgstr "لا استجابة. هل aria2 مطفأ؟" #. debug #: ../../po/../uget/UgetPluginAria2.c:641 msgid "aria2: gid was removed." msgstr "aria2: تم حذف gid " #: ../../po/../uget/UgetPluginMedia.c:489 msgid "Failed to get media link." msgstr "فشل في الحصول على رابط الوسائط" #: ../../po/../uget/UgetPluginMedia.c:505 msgid "No matched media." msgstr "لا يوجد وسائط متطابقة." #: ../../po/../ui-gtk/UgtkAboutDialog.c:46 msgid "Download Manager" msgstr "مدير تنزيلات" #: ../../po/../ui-gtk/UgtkAboutDialog.c:48 msgid "translator-credits" msgstr "صفا الفليج\t" #: ../../po/../ui-gtk/UgtkAboutDialog.c:80 msgid "uGet Founder: " msgstr "مؤسّس uGet:" #: ../../po/../ui-gtk/UgtkAboutDialog.c:81 msgid "uGet Project Manager: " msgstr "مدير مشروع uGet:" #: ../../po/../ui-gtk/UgtkApp-timeout.c:263 #: ../../po/../ui-gtk/UgtkTrayIcon.c:239 msgid "tasks" msgstr "من المهام" #: ../../po/../ui-gtk/UgtkApp-timeout.c:399 msgid "New from Clipboard" msgstr "جديد من الحافظة" #: ../../po/../ui-gtk/UgtkApp-timeout.c:401 ../../po/../ui-gtk/UgtkApp.c:915 msgid "New Download" msgstr "تنزيل جديد" #: ../../po/../ui-gtk/UgtkApp-timeout.c:425 ../../po/../ui-gtk/UgtkApp.c:1679 #: ../../po/../ui-gtk/UgtkSettingDialog.c:119 msgid "Clipboard" msgstr "الحافظة" #: ../../po/../ui-gtk/UgtkApp-timeout.c:427 msgid "Command line" msgstr "سطر الأوامر" #: ../../po/../ui-gtk/UgtkApp-timeout.c:780 msgid "Error Occurred" msgstr "حدث خطأ" #: ../../po/../ui-gtk/UgtkApp-timeout.c:781 msgid "Error Occurred during downloading." msgstr "حدث خطأ أثناء التنزيل." #: ../../po/../ui-gtk/UgtkApp-timeout.c:782 msgid "Download Starting" msgstr "يبدأ التنزيل" #: ../../po/../ui-gtk/UgtkApp-timeout.c:783 msgid "Starting download queue." msgstr "يبدأ طابور التنزيل." #: ../../po/../ui-gtk/UgtkApp-timeout.c:784 msgid "Download Completed" msgstr "اكتمل التنزيل" #: ../../po/../ui-gtk/UgtkApp-timeout.c:785 msgid "All queuing downloads have been completed." msgstr "جميع التنزيلات المصطفّة اكتملت." #. ---------------------------------------------------- #. frame for Status (start mode) #: ../../po/../ui-gtk/UgtkApp-ui.c:193 #: ../../po/../ui-gtk/UgtkDownloadForm.c:224 #: ../../po/../ui-gtk/UgtkNodeView.c:1040 msgid "Status" msgstr "الحالة" #. Summary Items - Category #. Download Columns - Category #: ../../po/../ui-gtk/UgtkApp-ui.c:195 ../../po/../ui-gtk/UgtkMenubar-ui.c:318 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:346 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:431 #: ../../po/../ui-gtk/UgtkNodeDialog.c:418 #: ../../po/../ui-gtk/UgtkNodeView.c:932 #: ../../po/../ui-gtk/UgtkNodeView.c:1020 ../../po/../ui-gtk/UgtkSummary.c:131 msgid "Category" msgstr "الفئة" #: ../../po/../ui-gtk/UgtkApp-ui.c:279 msgid "Create new download" msgstr "أنشئ تنزيل جديد" #. New Download (accelerators) #. gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); #. New Download #: ../../po/../ui-gtk/UgtkApp-ui.c:289 ../../po/../ui-gtk/UgtkMenubar-ui.c:58 #: ../../po/../ui-gtk/UgtkTrayIcon.c:59 msgid "New _Download..." msgstr "تن_زيل جديد..." #. New Category #: ../../po/../ui-gtk/UgtkApp-ui.c:300 ../../po/../ui-gtk/UgtkMenubar-ui.c:69 msgid "New _Category..." msgstr "_فئة جديدة..." #. New Clipboard batch #: ../../po/../ui-gtk/UgtkApp-ui.c:310 ../../po/../ui-gtk/UgtkTrayIcon.c:70 msgid "New Clipboard _batch..." msgstr "دف_عة جديدة من الحافظة..." #. New URL Sequence batch #: ../../po/../ui-gtk/UgtkApp-ui.c:321 msgid "New _URL Sequence batch..." msgstr "دفعة و_صلات متسلسلة جديدة..." #. New Torrent #. separator #. gtk_menu_shell_append ((GtkMenuShell*)submenu, #. gtk_separator_menu_item_new() ); #. New Torrent #: ../../po/../ui-gtk/UgtkApp-ui.c:335 ../../po/../ui-gtk/UgtkMenubar-ui.c:81 #: ../../po/../ui-gtk/UgtkTrayIcon.c:83 msgid "New Torrent..." msgstr "تورنت جديد..." #. New Metalink #: ../../po/../ui-gtk/UgtkApp-ui.c:342 ../../po/../ui-gtk/UgtkMenubar-ui.c:87 #: ../../po/../ui-gtk/UgtkTrayIcon.c:90 msgid "New Metalink..." msgstr "ميتالِنك جديد..." #: ../../po/../ui-gtk/UgtkApp-ui.c:356 msgid "Save all settings" msgstr "احفظ كلّ الإعدادات" #: ../../po/../ui-gtk/UgtkApp-ui.c:369 msgid "Set selected download runnable" msgstr "عيّن التنزيلات المحدّدة إلى قابلية التشغيل" #: ../../po/../ui-gtk/UgtkApp-ui.c:379 msgid "Set selected download to pause" msgstr "عيّن التنزيلات المحدّدة إلى الإلباث" #: ../../po/../ui-gtk/UgtkApp-ui.c:389 msgid "Set selected download properties" msgstr "عيّن خصائص التنزيلات المحدّدة" #: ../../po/../ui-gtk/UgtkApp-ui.c:402 msgid "Move selected download up" msgstr "انقل التنزيل المحدّد لأعلى" #: ../../po/../ui-gtk/UgtkApp-ui.c:412 msgid "Move selected download down" msgstr "انقل التنزيل المحدّد لأسفل" #: ../../po/../ui-gtk/UgtkApp-ui.c:422 msgid "Move selected download to top" msgstr "انقل التنزيل المحدّد للأعلى" #: ../../po/../ui-gtk/UgtkApp-ui.c:432 msgid "Move selected download to bottom" msgstr "انقل التنزيل المحدّد للأسفل" #: ../../po/../ui-gtk/UgtkApp.c:883 msgid "New Category" msgstr "فئة جديدة" #: ../../po/../ui-gtk/UgtkApp.c:894 msgid "Copy - " msgstr "نسخة - " #: ../../po/../ui-gtk/UgtkApp.c:1049 msgid "Category Properties" msgstr "خصائص الفئة" #: ../../po/../ui-gtk/UgtkApp.c:1063 msgid "Download Properties" msgstr "خصائص التنزيل" #: ../../po/../ui-gtk/UgtkApp.c:1296 msgid "New Torrent" msgstr "تورنت جديد" #: ../../po/../ui-gtk/UgtkApp.c:1312 msgid "New Metalink" msgstr "ميتالِنك جديد" #: ../../po/../ui-gtk/UgtkApp.c:1321 msgid "Open Torrent file" msgstr "افتح ملف تورنت" #: ../../po/../ui-gtk/UgtkApp.c:1324 msgid "Torrent file (*.torrent)" msgstr "ملف تورنت (*.torrent)" #: ../../po/../ui-gtk/UgtkApp.c:1337 msgid "Open Metalink file" msgstr "افتح ملف ميتالِنك" #: ../../po/../ui-gtk/UgtkApp.c:1377 msgid "Failed to save category file." msgstr "فشل حفظ ملف الفئة." #: ../../po/../ui-gtk/UgtkApp.c:1397 msgid "Failed to load category file." msgstr "فشل تحميل ملف الفئة." #: ../../po/../ui-gtk/UgtkApp.c:1408 msgid "Save Category file" msgstr "احفظ ملف الفئة" #: ../../po/../ui-gtk/UgtkApp.c:1426 msgid "Open Category file" msgstr "افتح ملف فئة" #: ../../po/../ui-gtk/UgtkApp.c:1429 msgid "JSON file (*.json)" msgstr " ملف JSON (*.json)" #. add link #: ../../po/../ui-gtk/UgtkApp.c:1485 msgid "Link " msgstr "رابط " #. add image #: ../../po/../ui-gtk/UgtkApp.c:1490 msgid "Image " msgstr "صورة " #: ../../po/../ui-gtk/UgtkApp.c:1535 msgid "Text File" msgstr "ملف نصّي" #: ../../po/../ui-gtk/UgtkApp.c:1582 msgid "Import URLs from HTML file" msgstr "استورد وصلات من ملف HTML" #: ../../po/../ui-gtk/UgtkApp.c:1585 msgid "HTML file (*.htm, *.html)" msgstr "ملف HTML (*.htm, *.html)" #: ../../po/../ui-gtk/UgtkApp.c:1597 msgid "Import URLs from text file" msgstr "استورد وصلات من ملف نصّي" #: ../../po/../ui-gtk/UgtkApp.c:1600 msgid "Plain text file" msgstr "ملف نصي بسيط" #: ../../po/../ui-gtk/UgtkApp.c:1612 msgid "Export URLs to text file" msgstr "صدّر العناوين إلى ملف نصّيّ" #: ../../po/../ui-gtk/UgtkApp.c:1631 msgid "URL Sequence batch" msgstr "دفعة وصلات متسلسلة" #: ../../po/../ui-gtk/UgtkApp.c:1658 msgid "No URLs found in clipboard." msgstr "لا توجد وصلات في الحافظة." #: ../../po/../ui-gtk/UgtkApp.c:1667 msgid "All URLs had existed." msgstr "كلّ العناوين موجودة." #: ../../po/../ui-gtk/UgtkApp.c:1672 msgid "Clipboard batch" msgstr "دفعة من الحافظة" #: ../../po/../ui-gtk/UgtkApp.c:1762 msgid "New" msgstr "جديد" #: ../../po/../ui-gtk/UgtkApp.c:1803 ../../po/../ui-gtk/UgtkMenubar.c:460 #: ../../po/../ui-gtk/UgtkMenubar.c:492 ../../po/../ui-gtk/UgtkNodeView.c:640 msgid "Error" msgstr "خطأ" #: ../../po/../ui-gtk/UgtkApp.c:1811 ../../po/../ui-gtk/UgtkSummary.c:176 msgid "Message" msgstr "رسالة" #: ../../po/../ui-gtk/UgtkApp.c:1927 #, c-format msgid "Selected %d items" msgstr "%d من العناصر محدّدة" #: ../../po/../ui-gtk/UgtkBanner.c:145 ../../po/../ui-gtk/UgtkBanner.c:165 msgid "Attention uGetters:" msgstr "مستخدمي uGet انتبهوا:" #: ../../po/../ui-gtk/UgtkBanner.c:148 msgid "" "we are running a Donation Drive for uGet's Future Development, please click " msgstr "نقومُ بحملة تبرع لتطوير uGet المستقبلي، فضلًا انقر" #: ../../po/../ui-gtk/UgtkBanner.c:151 msgid "HERE" msgstr "هنا" #: ../../po/../ui-gtk/UgtkBanner.c:168 msgid "please fill out this quick User Survey for uGet." msgstr "فضلًا املأ هذه الدراسة السريعة لِـ uGet." #: ../../po/../ui-gtk/UgtkBanner.c:171 msgid "click here to take survey" msgstr "انقر هنا لأخذ الدراسة" #: ../../po/../ui-gtk/UgtkCategoryForm.c:62 msgid "Category _name:" msgstr "ا_سم الفئة:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:82 msgid "Active _downloads:" msgstr "التن_زيلات النشطة:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:92 msgid "Capacity of Finished:" msgstr "سعة المنتهية:" #. gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); #: ../../po/../ui-gtk/UgtkCategoryForm.c:102 msgid "Capacity of Recycled:" msgstr "سعة المحذوفة" #. ------------------------------------------------------------------------ #. URI Matching conditions #: ../../po/../ui-gtk/UgtkCategoryForm.c:111 msgid "URI Matching conditions" msgstr "الشروط مطابقة URI" #: ../../po/../ui-gtk/UgtkCategoryForm.c:118 msgid "Matched _Hosts:" msgstr "الاستضافات_المطابقة:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:129 msgid "Matched _Schemes:" msgstr "الرسوم_المطابقة:" #: ../../po/../ui-gtk/UgtkCategoryForm.c:140 msgid "Matched _Types:" msgstr "الأنواع_المطابقة:" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:64 msgid "Really Quit?" msgstr "أأخرج بالفعل؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:65 msgid "Are you sure you want to quit?" msgstr "أتريد حقًّا الخروج؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:69 msgid "Really delete files?" msgstr "أأحذف الملفات؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:70 msgid "Are you sure you want to delete files?" msgstr "أتريد حقًّا حذف الملفات؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:74 msgid "Really delete category?" msgstr "أأحذف الفئة؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:75 msgid "Are you sure you want to delete category?" msgstr "أمتأكّد من حذف الفئة؟" #: ../../po/../ui-gtk/UgtkConfirmDialog.c:109 msgid "Don't ask me again" msgstr "لا تسألني ثانيةً" #. URL - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:111 #: ../../po/../ui-gtk/UgtkSequence.c:63 msgid "_URI:" msgstr "_الرابط:" #. Mirrors - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:130 msgid "Mirrors:" msgstr "المرايا:" #. File - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:146 #: ../../po/../ui-gtk/UgtkProxyForm.c:393 msgid "File:" msgstr "الملف:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:166 #: ../../po/../ui-gtk/UgtkDownloadForm.c:897 msgid "Select Folder" msgstr "اختر مجلدًا" #. Folder - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:174 msgid "_Folder:" msgstr "ال_مجلد:" #. Referrer - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:189 msgid "Referrer:" msgstr "المُرجِع:" #. "Max Connections:" - title label #: ../../po/../ui-gtk/UgtkDownloadForm.c:212 msgid "_Max Connections:" msgstr "أ_قصى عدد اتصالات:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:230 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:574 msgid "_Runnable" msgstr "قابل للتش_غيل" #: ../../po/../ui-gtk/UgtkDownloadForm.c:232 msgid "P_ause" msgstr "ألب_ث" #. ---------------------------------------------------- #. frame for login #: ../../po/../ui-gtk/UgtkDownloadForm.c:238 msgid "Login" msgstr "لِج" #. User - label #. user label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:252 #: ../../po/../ui-gtk/UgtkProxyForm.c:149 msgid "User:" msgstr "اسم المستخدم:" #. Password - label #. password label & entry #: ../../po/../ui-gtk/UgtkDownloadForm.c:268 #: ../../po/../ui-gtk/UgtkProxyForm.c:160 msgid "Password:" msgstr "كلمة السر:" #. label - cookie file #: ../../po/../ui-gtk/UgtkDownloadForm.c:293 msgid "Cookie file:" msgstr "ملف الكعكات:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:310 #: ../../po/../ui-gtk/UgtkDownloadForm.c:953 msgid "Select Cookie File" msgstr "اختر ملف الكعكات" #. label - post file #: ../../po/../ui-gtk/UgtkDownloadForm.c:319 msgid "Post file:" msgstr "الملف البريدي:" #: ../../po/../ui-gtk/UgtkDownloadForm.c:336 #: ../../po/../ui-gtk/UgtkDownloadForm.c:1009 msgid "Select Post File" msgstr "اختر ملفًا بريديًّا" #. label - user agent #: ../../po/../ui-gtk/UgtkDownloadForm.c:346 msgid "User Agent:" msgstr "وكيل المستخدم:" #. Retry limit - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:362 msgid "Retry _limit:" msgstr "_حدود الإعادة:" #. counts - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:377 msgid "counts" msgstr "مرة" #. Retry delay - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:384 msgid "Retry _delay:" msgstr "م_هلة الإعادة:" #. seconds - label #: ../../po/../ui-gtk/UgtkDownloadForm.c:399 msgid "seconds" msgstr "ثانية" #. label - Max upload speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:406 msgid "Max upload speed:" msgstr "أقصى حد للرفع:" #. label - "KiB/s" #: ../../po/../ui-gtk/UgtkDownloadForm.c:418 #: ../../po/../ui-gtk/UgtkDownloadForm.c:436 #: ../../po/../ui-gtk/UgtkSettingForm.c:311 #: ../../po/../ui-gtk/UgtkSettingForm.c:323 #: ../../po/../ui-gtk/UgtkSettingForm.c:612 #: ../../po/../ui-gtk/UgtkSettingForm.c:624 msgid "KiB/s" msgstr "ك.بايت/ث" #. label - Max download speed #: ../../po/../ui-gtk/UgtkDownloadForm.c:424 msgid "Max download speed:" msgstr "أقصى حد للتنزيل:" #. Retrieve timestamp #: ../../po/../ui-gtk/UgtkDownloadForm.c:442 msgid "Retrieve timestamp" msgstr "استردّ الختم الزمني" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:51 msgid "_File" msgstr "_ملف" #. Batch Downloads --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:94 msgid "_Batch Downloads" msgstr "د_فعة تنزيلات" #. Batch downloads - Clipboard batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:100 msgid "_Clipboard batch..." msgstr "دفعة من الحاف_ظة..." #. Batch downloads - URL Sequence batch #: ../../po/../ui-gtk/UgtkMenubar-ui.c:110 msgid "_URL Sequence batch..." msgstr "دفعة و_صلات متسلسلة..." #. Batch downloads - Text file import (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:120 msgid "_Text file import (.txt)..." msgstr "استورد ملف _نصّي (‎.txt)..." #. Batch downloads - HTML file import (.html) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:130 msgid "_HTML file import (.html)..." msgstr "است_ورد ملف HTML‏ (‎.html)..." #. Batch downloads - Export to Text file (.txt) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:142 msgid "_Export to Text file (.txt)..." msgstr "_صدر إلى ملف نصّي (‎.txt)..." #. Open Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:156 msgid "_Open category..." msgstr "ا_فتح فئة..." #. Save Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:167 msgid "_Save category as..." msgstr "ا_حفظ الفئة كـ..." #. Save All #: ../../po/../ui-gtk/UgtkMenubar-ui.c:178 msgid "Save _all settings" msgstr "احفظ _كلّ الإعدادات" #. Offline mode #: ../../po/../ui-gtk/UgtkMenubar-ui.c:192 msgid "Offline Mode" msgstr "وضع عدم الاتصال" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:210 msgid "_Edit" msgstr "_حرّر" #. menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() #. ); #. Settings shortcut #: ../../po/../ui-gtk/UgtkMenubar-ui.c:215 #: ../../po/../ui-gtk/UgtkTrayIcon.c:99 msgid "Clipboard _Monitor" msgstr "را_قب الحافظة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:219 #: ../../po/../ui-gtk/UgtkTrayIcon.c:103 msgid "Clipboard works quietly" msgstr "الحافظة تعمل بهدوء" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:107 msgid "Command-line works quietly" msgstr "عمل سطر الاوامر بصورة هادئة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:227 #: ../../po/../ui-gtk/UgtkTrayIcon.c:111 msgid "Skip existing URI" msgstr "تجاهل الرابط الموجود" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:231 #: ../../po/../ui-gtk/UgtkSettingForm.c:223 #: ../../po/../ui-gtk/UgtkTrayIcon.c:115 msgid "Apply recent download settings" msgstr "طبّق إعدادات التنزيل الأخيرة" #. --- Completion Auto-Actions --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:238 msgid "Completion _Auto-Actions" msgstr "إنهاء _التطبيقات-التلقائية" #. Completion Auto-Actions - Disable #: ../../po/../ui-gtk/UgtkMenubar-ui.c:244 msgid "_Disable" msgstr "_عطّل" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:249 msgid "Hibernate" msgstr "أسبِت" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:254 msgid "Suspend" msgstr "علّق" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:259 msgid "Shutdown" msgstr "أطفئ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:264 msgid "Reboot" msgstr "أعد الإقلاع" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:269 msgid "Custom" msgstr "مخصّص" #. Completion Auto-Actions - Remember #: ../../po/../ui-gtk/UgtkMenubar-ui.c:275 msgid "Remember setting" msgstr "احفظ الإعداد" #. Completion Auto-Actions - Help #: ../../po/../ui-gtk/UgtkMenubar-ui.c:279 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:682 msgid "_Help" msgstr "م_ساعدة" #. --- Completion Auto-Actions --- end --- #. menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); #. Settings #: ../../po/../ui-gtk/UgtkMenubar-ui.c:285 #: ../../po/../ui-gtk/UgtkTrayIcon.c:122 msgid "_Settings..." msgstr "إ_عدادات..." #: ../../po/../ui-gtk/UgtkMenubar-ui.c:304 msgid "_View" msgstr "ا_عرض" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:308 msgid "_Toolbar" msgstr "شر_يط الأدوات" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:313 msgid "Statusbar" msgstr "شريط الحالة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:323 msgid "_Summary" msgstr "المل_خّص" #. Summary Items --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:331 msgid "Summary _Items" msgstr "ع_ناصر الملخّص" #. Summary Items - Name #: ../../po/../ui-gtk/UgtkMenubar-ui.c:336 msgid "_Name" msgstr "الا_سم" #. Summary Items - Folder #: ../../po/../ui-gtk/UgtkMenubar-ui.c:341 msgid "_Folder" msgstr "الم_جلد" #. Summary Items - Elapsed #. menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); #. gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); #. gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); #. menubar->view.summary_items.elapsed = menu_item; #. Summary Items - URL #. Download Columns - URL #: ../../po/../ui-gtk/UgtkMenubar-ui.c:356 #: ../../po/../ui-gtk/UgtkMenubar-ui.c:436 msgid "_URL" msgstr "الو_صلة" #. Summary Items - Message #: ../../po/../ui-gtk/UgtkMenubar-ui.c:361 msgid "_Message" msgstr "ال_رسالة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:376 msgid "Download _Columns" msgstr "أ_عمدة التنزيل" #. Download Columns - Complete #: ../../po/../ui-gtk/UgtkMenubar-ui.c:381 msgid "_Complete" msgstr "م_كتمل" #. Download Columns - Total #: ../../po/../ui-gtk/UgtkMenubar-ui.c:386 msgid "_Size" msgstr "الح_جم" #. Download Columns - Percent (%) #: ../../po/../ui-gtk/UgtkMenubar-ui.c:391 msgid "_Percent '%'" msgstr "ال_نسبة \"%\"" #. Download Columns - Elapsed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:396 msgid "_Elapsed" msgstr "المنق_ضي" #. Download Columns - Left #: ../../po/../ui-gtk/UgtkMenubar-ui.c:401 msgid "_Left" msgstr "المتب_قي" #. Download Columns - Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:406 #: ../../po/../ui-gtk/UgtkNodeView.c:861 msgid "Speed" msgstr "السرعة" #. Download Columns - Up Speed #: ../../po/../ui-gtk/UgtkMenubar-ui.c:411 #: ../../po/../ui-gtk/UgtkNodeView.c:875 msgid "Up Speed" msgstr "سرعة الرفع" #. Download Columns - Uploaded #: ../../po/../ui-gtk/UgtkMenubar-ui.c:416 #: ../../po/../ui-gtk/UgtkNodeView.c:889 msgid "Uploaded" msgstr "المرفوع" #. Download Columns - Ratio #: ../../po/../ui-gtk/UgtkMenubar-ui.c:421 #: ../../po/../ui-gtk/UgtkNodeView.c:903 msgid "Ratio" msgstr "النسبة" #. Download Columns - Retry #: ../../po/../ui-gtk/UgtkMenubar-ui.c:426 msgid "_Retry" msgstr "الإ_عادة" #. Download Columns - Added On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:441 #: ../../po/../ui-gtk/UgtkNodeView.c:960 msgid "Added On" msgstr "أُضيف في" #. Download Columns - Completed On #: ../../po/../ui-gtk/UgtkMenubar-ui.c:446 #: ../../po/../ui-gtk/UgtkNodeView.c:974 msgid "Completed On" msgstr "انتهى في" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:461 msgid "_Category" msgstr "_فئة" #. New Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:466 msgid "_New Category..." msgstr "فئة _جديدة..." #. Delete Category #: ../../po/../ui-gtk/UgtkMenubar-ui.c:476 msgid "_Delete Category" msgstr "اح_ذف الفئة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:517 msgid "_Download" msgstr "ن_زّل" #. menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, #. accel_group); #: ../../po/../ui-gtk/UgtkMenubar-ui.c:529 msgid "_Delete Entry" msgstr "ا_حذف المدخلة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:540 msgid "Delete Entry and _File" msgstr "احذف المدخلة مع ال_ملف" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:555 msgid "Open _Containing folder" msgstr "افتح المجلد الم_حتوي" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:568 msgid "Force Start" msgstr "أجبر البدء" #. Move to --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:596 msgid "_Move To" msgstr "ان_قل إلى" #. Priority --- start --- #: ../../po/../ui-gtk/UgtkMenubar-ui.c:645 msgid "Priority" msgstr "الأهمّيّة" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:654 msgid "_High" msgstr "_عالٍ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:659 msgid "_Normal" msgstr "عا_ديّ" #: ../../po/../ui-gtk/UgtkMenubar-ui.c:664 msgid "_Low" msgstr "م_نخفض" #. Get Help Online #: ../../po/../ui-gtk/UgtkMenubar-ui.c:687 msgid "Get Help Online" msgstr "احصل على المساعدة عبر الإنترنت" #. Documentation #: ../../po/../ui-gtk/UgtkMenubar-ui.c:698 msgid "Documentation" msgstr "التوثيق" #. Support Forum #: ../../po/../ui-gtk/UgtkMenubar-ui.c:709 msgid "Support Forum" msgstr "منتدى الدعم" #. Submit Feedback #: ../../po/../ui-gtk/UgtkMenubar-ui.c:720 msgid "Submit Feedback" msgstr "أودِع تغذية استرجاعية" #. Report a Bug #: ../../po/../ui-gtk/UgtkMenubar-ui.c:731 msgid "Report a Bug" msgstr "أبلغ عن علّة" #. Keyboard Shortcuts #: ../../po/../ui-gtk/UgtkMenubar-ui.c:742 msgid "Keyboard Shortcuts" msgstr "اختصارات لوحة المفاتيح" #. Check for Updates #: ../../po/../ui-gtk/UgtkMenubar-ui.c:749 msgid "Check for Updates" msgstr "التمس التحديثات" #: ../../po/../ui-gtk/UgtkMenubar.c:187 msgid "Settings" msgstr "إعدادات" #: ../../po/../ui-gtk/UgtkMenubar.c:454 #, c-format msgid "Can't launch default application for file '%s'." msgstr "تعذّر تشغيل التطبيق الافتراضي للملف \"%s\"." #: ../../po/../ui-gtk/UgtkMenubar.c:486 #, c-format msgid "'%s' - This folder does not exist." msgstr "\"%s\" - المجلد هذا غير موجود." #. title #: ../../po/../ui-gtk/UgtkNodeDialog.c:219 #: ../../po/../ui-gtk/UgtkNodeDialog.c:223 msgid "URI had existed" msgstr "معرّف URI موجود" #: ../../po/../ui-gtk/UgtkNodeDialog.c:221 msgid "This URI had existed, are you sure to continue?" msgstr "معرّف URI موجد، أمتأكّد من المتابعة؟" #: ../../po/../ui-gtk/UgtkNodeDialog.c:359 msgid "General" msgstr "عامّ" #: ../../po/../ui-gtk/UgtkNodeDialog.c:361 msgid "Advanced" msgstr "متقدّم" #: ../../po/../ui-gtk/UgtkNodeDialog.c:370 msgid "Category settings" msgstr "إعدادات الفئة" #: ../../po/../ui-gtk/UgtkNodeDialog.c:372 msgid "Default for new download 1" msgstr "الافتراضي للتنزيل الجديد 1" #: ../../po/../ui-gtk/UgtkNodeDialog.c:374 msgid "Default 2" msgstr "الافتراضي 2" #: ../../po/../ui-gtk/UgtkNodeView.c:143 ../../po/../ui-gtk/UgtkNodeView.c:608 #: ../../po/../ui-gtk/UgtkSummary.c:107 msgid "unnamed" msgstr "غير معنون" #: ../../po/../ui-gtk/UgtkNodeView.c:641 msgid "Paused" msgstr "مُلبث" #: ../../po/../ui-gtk/UgtkNodeView.c:642 msgid "Uploading" msgstr "يرفع" #: ../../po/../ui-gtk/UgtkNodeView.c:643 msgid "Completed" msgstr "اكتمل" #: ../../po/../ui-gtk/UgtkNodeView.c:645 msgid "Recycled" msgstr "المحذوفة" #: ../../po/../ui-gtk/UgtkNodeView.c:646 msgid "Queuing" msgstr "المصطفّة" #: ../../po/../ui-gtk/UgtkNodeView.c:647 msgid "Active" msgstr "النشطة" #: ../../po/../ui-gtk/UgtkNodeView.c:668 msgid "All Status" msgstr "كلّ الحالات" #: ../../po/../ui-gtk/UgtkNodeView.c:773 #: ../../po/../ui-gtk/UgtkSettingDialog.c:101 #: ../../po/../ui-gtk/UgtkSummary.c:100 msgid "Name" msgstr "الاسم" #: ../../po/../ui-gtk/UgtkNodeView.c:790 msgid "Complete" msgstr "مكتمل" #: ../../po/../ui-gtk/UgtkNodeView.c:804 msgid "Size" msgstr "الحجم" #: ../../po/../ui-gtk/UgtkNodeView.c:819 msgid "%" msgstr "%" #: ../../po/../ui-gtk/UgtkNodeView.c:833 msgid "Elapsed" msgstr "المنقضي" #: ../../po/../ui-gtk/UgtkNodeView.c:847 msgid "Left" msgstr "المتبقي" #: ../../po/../ui-gtk/UgtkNodeView.c:946 #: ../../po/../ui-gtk/UgtkSettingForm.c:584 #: ../../po/../ui-gtk/UgtkSummary.c:143 msgid "URI" msgstr "رابط" #: ../../po/../ui-gtk/UgtkNodeView.c:997 msgid "Quantity" msgstr "الكمية" #. proxy type label & combo box #: ../../po/../ui-gtk/UgtkProxyForm.c:64 msgid "Proxy:" msgstr "الوسيط:" #: ../../po/../ui-gtk/UgtkProxyForm.c:67 msgid "Don't use" msgstr "لا تستخدم" #: ../../po/../ui-gtk/UgtkProxyForm.c:69 msgid "Default" msgstr "الافتراضي" #. host label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:121 msgid "Host:" msgstr "المضيف:" #. port label & entry #: ../../po/../ui-gtk/UgtkProxyForm.c:132 msgid "Port:" msgstr "المنفذ:" #: ../../po/../ui-gtk/UgtkProxyForm.c:359 msgid "Socket:" msgstr "المقبس:" #: ../../po/../ui-gtk/UgtkProxyForm.c:369 msgid "Socket args:" msgstr "مُعطيات المقبس:" #: ../../po/../ui-gtk/UgtkProxyForm.c:379 msgid "Element:" msgstr "العنصر:" #: ../../po/../ui-gtk/UgtkScheduleForm.c:57 msgid "Mon" msgstr "الإثنين" #: ../../po/../ui-gtk/UgtkScheduleForm.c:58 msgid "Tue" msgstr "الثلاثاء" #: ../../po/../ui-gtk/UgtkScheduleForm.c:59 msgid "Wed" msgstr "الأربعاء" #: ../../po/../ui-gtk/UgtkScheduleForm.c:60 msgid "Thu" msgstr "الخميس" #: ../../po/../ui-gtk/UgtkScheduleForm.c:61 msgid "Fri" msgstr "الجمعة" #: ../../po/../ui-gtk/UgtkScheduleForm.c:62 msgid "Sat" msgstr "السبت" #: ../../po/../ui-gtk/UgtkScheduleForm.c:63 msgid "Sun" msgstr "الأحد" #: ../../po/../ui-gtk/UgtkScheduleForm.c:104 msgid "_Enable Scheduler" msgstr "م_كّن الجدولة" #. Turn off - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:154 msgid "Turn off" msgstr "أطفئ" #. Turn off - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:159 msgid "- stop all task" msgstr "- أوقف كل المهام" #. Normal - label #: ../../po/../ui-gtk/UgtkScheduleForm.c:169 msgid "Normal" msgstr "عادي" #. Normal - help label #: ../../po/../ui-gtk/UgtkScheduleForm.c:174 msgid "- run task normally" msgstr "- شغّل المهمة اعتياديًا" #: ../../po/../ui-gtk/UgtkSelector.c:254 msgid "All" msgstr "الكلّ" #: ../../po/../ui-gtk/UgtkSelector.c:259 msgid "None" msgstr "لاشيء" #: ../../po/../ui-gtk/UgtkSelector.c:276 msgid "Mark by filter" msgstr "علّم بالمرشّح" #: ../../po/../ui-gtk/UgtkSelector.c:294 msgid "Mark URLs by host AND filename extension." msgstr "علّم الوصلات بالمضيف وامتداد الملف." #: ../../po/../ui-gtk/UgtkSelector.c:297 msgid "This will reset all marks of URLs." msgstr "هذا سيُعيد جميع علامات الوصلات." #. filter view ----------------------- #. left side #: ../../po/../ui-gtk/UgtkSelector.c:305 msgid "Host" msgstr "المضيف" #. right side (filename extension) #: ../../po/../ui-gtk/UgtkSelector.c:309 msgid "File Ext." msgstr "الملف موجود" #: ../../po/../ui-gtk/UgtkSelector.c:449 msgid "URL" msgstr "الوصلة" #: ../../po/../ui-gtk/UgtkSelector.c:781 msgid "Base hypertext reference" msgstr "أساس المرجع النصيّ التشعبيّ" #. select all #: ../../po/../ui-gtk/UgtkSelector.c:797 msgid "Mark _All" msgstr "علّم ال_كل" #. select none #: ../../po/../ui-gtk/UgtkSelector.c:801 msgid "Mark _None" msgstr "علّم لا _شيء" #. select by filter #: ../../po/../ui-gtk/UgtkSelector.c:805 msgid "_Mark by filter..." msgstr "_علّم بالمرشّح..." #. e.g. #: ../../po/../ui-gtk/UgtkSequence.c:74 msgid "e.g." msgstr "مثال" #. ------------------------------------------------------- #. radio "From" #: ../../po/../ui-gtk/UgtkSequence.c:85 msgid "_From:" msgstr "_من:" #. label "To" #: ../../po/../ui-gtk/UgtkSequence.c:108 msgid "To:" msgstr "إلى" #. label "digits" #: ../../po/../ui-gtk/UgtkSequence.c:123 msgid "digits:" msgstr "الخانات:" #: ../../po/../ui-gtk/UgtkSequence.c:132 msgid "F_rom:" msgstr "م_ن:" #. label case-sensitive #: ../../po/../ui-gtk/UgtkSequence.c:162 msgid "case-sensitive" msgstr "حسّاس للأحرف" #: ../../po/../ui-gtk/UgtkSequence.c:188 msgid "No wildcard(*) character in URL entry." msgstr "لا حرف بدل (*) في مُدخلة الوصلة." #: ../../po/../ui-gtk/UgtkSequence.c:192 msgid "URL is not valid." msgstr "الوصلة غير صالحة." #: ../../po/../ui-gtk/UgtkSequence.c:196 msgid "No character in 'From' or 'To' entry." msgstr "لا محارف في مدخلات \"من\" أو \"إلى\"." #: ../../po/../ui-gtk/UgtkSequence.c:311 msgid "Preview" msgstr "معاينة" #: ../../po/../ui-gtk/UgtkSettingDialog.c:113 msgid "User Interface" msgstr "واجهة المستخدم" #: ../../po/../ui-gtk/UgtkSettingDialog.c:125 msgid "Bandwidth" msgstr "عرض النطاق" #: ../../po/../ui-gtk/UgtkSettingDialog.c:131 msgid "Scheduler" msgstr "الجدولة" #: ../../po/../ui-gtk/UgtkSettingDialog.c:137 msgid "Plug-in" msgstr "الإضافات" #: ../../po/../ui-gtk/UgtkSettingDialog.c:143 msgid "Media website" msgstr "موقع الوسائط" #: ../../po/../ui-gtk/UgtkSettingDialog.c:149 msgid "Others" msgstr "أخرى" #. Monitor button #: ../../po/../ui-gtk/UgtkSettingForm.c:61 msgid "_Enable clipboard monitor" msgstr "م_كّن مراقبة الحافظة" #. quiet mode #: ../../po/../ui-gtk/UgtkSettingForm.c:66 msgid "_Quiet mode" msgstr "الوضع ال_صامت" #: ../../po/../ui-gtk/UgtkSettingForm.c:72 #: ../../po/../ui-gtk/UgtkSettingForm.c:488 msgid "Default category index" msgstr "فهرس الفئة الافتراضي" #: ../../po/../ui-gtk/UgtkSettingForm.c:84 #: ../../po/../ui-gtk/UgtkSettingForm.c:500 msgid "Adding to Nth category if no matched category." msgstr "اضافة عدد من الفئات اذا لم يتم المطابقة مع فئة" #. media website #: ../../po/../ui-gtk/UgtkSettingForm.c:90 msgid "_Monitor URL of media website" msgstr "_Monitor عرض رابط موقع الوسائط" #: ../../po/../ui-gtk/UgtkSettingForm.c:105 msgid "Monitor clipboard for specified file types:" msgstr "راقب الحافظة بحثًا عن أنواع الملفات:" #: ../../po/../ui-gtk/UgtkSettingForm.c:125 msgid "Separate the types with character '|'." msgstr "افصل الأنواع بالمحرف \"|\"." #: ../../po/../ui-gtk/UgtkSettingForm.c:130 msgid "You can use regular expressions here." msgstr "تستطيع استعمال التعابير النمطية هنا." #: ../../po/../ui-gtk/UgtkSettingForm.c:176 msgid "Confirmation" msgstr "أكّد" #. Confirmation check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:182 msgid "Show confirmation dialog on exit" msgstr "أظهر حواري تأكيدي عن الخروج" #: ../../po/../ui-gtk/UgtkSettingForm.c:185 msgid "Confirm when deleting files" msgstr "أظهر تأكيد عند حذف الملفات" #: ../../po/../ui-gtk/UgtkSettingForm.c:191 msgid "System Tray" msgstr "صينيّة النظام" #. System Tray check buttons #: ../../po/../ui-gtk/UgtkSettingForm.c:197 msgid "Always show tray icon" msgstr "أظهر صينية النظام دائمًا" #: ../../po/../ui-gtk/UgtkSettingForm.c:200 msgid "Minimize to tray on startup" msgstr "صغّر إلى الصينية عند البدء" #: ../../po/../ui-gtk/UgtkSettingForm.c:203 msgid "Close to tray on window close" msgstr "أغلق إلى الصينيّة عند إغلاق النافذة" #: ../../po/../ui-gtk/UgtkSettingForm.c:207 msgid "Use Ubuntu's App Indicator" msgstr "استخدم مؤشّر برمجيات أبونتو" #: ../../po/../ui-gtk/UgtkSettingForm.c:214 msgid "Enable offline mode on startup" msgstr "مكّن وضع عدم الاتصال عند البدء" #: ../../po/../ui-gtk/UgtkSettingForm.c:217 msgid "Download starting notification" msgstr "إخطار بدء التنزيل" #: ../../po/../ui-gtk/UgtkSettingForm.c:220 msgid "Sound when download is finished" msgstr "إصدار صوت عند انتهاء التنزيل" #. widget = gtk_check_button_new_with_label (_("Skip existing URI from #. clipboard and command-line")); #. uiform->skip_existing = (GtkToggleButton*) widget; #. gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #: ../../po/../ui-gtk/UgtkSettingForm.c:229 msgid "Display large icon" msgstr "اعرض رموز كبيرة" #: ../../po/../ui-gtk/UgtkSettingForm.c:295 msgid "These will affect all plug-ins." msgstr "سيؤثّر هذا على كلّ الإضافات." #. Global speed limit #: ../../po/../ui-gtk/UgtkSettingForm.c:301 msgid "Global speed limit" msgstr "حدّ السرعة العموميّ" #: ../../po/../ui-gtk/UgtkSettingForm.c:309 #: ../../po/../ui-gtk/UgtkSettingForm.c:610 msgid "Max upload speed" msgstr "حدّ الرفع العموميّ" #: ../../po/../ui-gtk/UgtkSettingForm.c:321 #: ../../po/../ui-gtk/UgtkSettingForm.c:622 msgid "Max download speed" msgstr "حدّ التنزيل العموميّ" #: ../../po/../ui-gtk/UgtkSettingForm.c:354 msgid "Completion Auto-Actions" msgstr "إجراءات الاكتمال الآليّة" #: ../../po/../ui-gtk/UgtkSettingForm.c:362 msgid "Custom command:" msgstr "أمر مخصّص:" #: ../../po/../ui-gtk/UgtkSettingForm.c:374 msgid "Custom command if error occured:" msgstr "أمر مخصّص إن حدث خطأ:" #: ../../po/../ui-gtk/UgtkSettingForm.c:424 msgid "_Autosave" msgstr "احفظ آ_ليًّا" #. auto save interval label #: ../../po/../ui-gtk/UgtkSettingForm.c:435 msgid "_Interval:" msgstr "ال_مدة:" #. auto save interval unit label #: ../../po/../ui-gtk/UgtkSettingForm.c:446 msgid "minutes" msgstr "دقيقة" #. Commandline Settings #: ../../po/../ui-gtk/UgtkSettingForm.c:475 msgid "Commandline Settings" msgstr "إعدادات سطر الأوامر" #. --quiet #: ../../po/../ui-gtk/UgtkSettingForm.c:482 msgid "Use '--quiet' by default" msgstr "استخدم \"‎--quiet\" افتراضيًا" #: ../../po/../ui-gtk/UgtkSettingForm.c:554 msgid "Plug-in matching order:" msgstr "ترتيب مطابقة الملحقات:" #: ../../po/../ui-gtk/UgtkSettingForm.c:577 msgid "Aria2 plug-in options" msgstr "خيارات ملحقات Aria2" #: ../../po/../ui-gtk/UgtkSettingForm.c:593 msgid "RPC authorization secret token" msgstr "رمز ترخيص RPC السري" #. ------------------------------------------------------------------------ #. Speed Limits #: ../../po/../ui-gtk/UgtkSettingForm.c:602 msgid "Global speed limit for aria2 only" msgstr "حدّ السرعة العموميّ لِـ aria2 فقط" #. ------------------------------------------------------------------------ #. aria2 works on local device #. launch #: ../../po/../ui-gtk/UgtkSettingForm.c:635 msgid "_Launch aria2 on startup" msgstr "ا_بدء aria2 عند بدء التشغيل" #. shutdown #: ../../po/../ui-gtk/UgtkSettingForm.c:641 msgid "_Shutdown aria2 on exit" msgstr "أو_قف تشغيل aria2 عند الخروج" #. ------------------------------------------------------------------------ #. Local options #: ../../po/../ui-gtk/UgtkSettingForm.c:647 msgid "Launch aria2 on local device" msgstr "أطلِق aria2 على جهاز محلّيّ" #: ../../po/../ui-gtk/UgtkSettingForm.c:656 msgid "Path" msgstr "المسار" #: ../../po/../ui-gtk/UgtkSettingForm.c:674 msgid "Arguments" msgstr "المُعطيات" #. Arguments - hint #: ../../po/../ui-gtk/UgtkSettingForm.c:679 msgid "You must restart uGet after modifying it." msgstr "عليك إعادة تشغيل uGet بعد تعديلها." #: ../../po/../ui-gtk/UgtkSettingForm.c:783 msgid "Media matching mode:" msgstr "نمط تطابق الميديا" #: ../../po/../ui-gtk/UgtkSettingForm.c:801 msgid "Match conditions" msgstr "تطابق الشروط" #. Quality #: ../../po/../ui-gtk/UgtkSettingForm.c:810 msgid "Quality:" msgstr "الجودة:" #. Type #: ../../po/../ui-gtk/UgtkSettingForm.c:830 msgid "Type:" msgstr "النوع:" #: ../../po/../ui-gtk/UgtkSummary.c:104 msgid "File" msgstr "ملف" #: ../../po/../ui-gtk/UgtkSummary.c:119 msgid "Folder" msgstr "مجلد" #: ../../po/../ui-gtk/UgtkSummary.c:262 msgid "Item" msgstr "عنصر" #: ../../po/../ui-gtk/UgtkSummary.c:267 msgid "Value" msgstr "قيمة" #. Copy All #: ../../po/../ui-gtk/UgtkSummary.c:299 msgid "Copy _All" msgstr "انسخ ال_كلّ" #. Show window #: ../../po/../ui-gtk/UgtkTrayIcon.c:141 msgid "Show window" msgstr "أظهر النافذة" #. Offline mode #: ../../po/../ui-gtk/UgtkTrayIcon.c:147 msgid "_Offline Mode" msgstr "وضع ع_دم الاتصال" uget-2.2.2/uget/0000775000175000017500000000000013470305207010431 500000000000000uget-2.2.2/uget/UgetHash.h0000664000175000017500000000545413470304402012236 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_HASH_H #define UGET_HASH_H #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // URI hash table #ifdef NO_URI_HASH #define uget_uri_hash_new() #define uget_uri_hash_free(uuhash) #define uget_uri_hash_find(uuhash, uri) #define uget_uri_hash_add(uuhash, uri) FALSE #define uget_uri_hash_remove(uuhash, uri) #define uget_uri_hash_add_download(uuhash, dnode) #define uget_uri_hash_remove_download(uuhash, dnode) #define uget_uri_hash_add_category(uuhash, cnode) #define uget_uri_hash_remove_category(uuhash, cnode) #else void* uget_uri_hash_new (void); void uget_uri_hash_free (void* uuhash); int uget_uri_hash_find (void* uuhash, const char* uri); void uget_uri_hash_add (void* uuhash, const char* uri); void uget_uri_hash_remove (void* uuhash, const char* uri); void uget_uri_hash_add_download (void* uuhash, UgInfo* dnode_info); void uget_uri_hash_remove_download (void* uuhash, UgInfo* dnode_info); void uget_uri_hash_add_category (void* uuhash, UgetNode* cnode); void uget_uri_hash_remove_category (void* uuhash, UgetNode* cnode); #endif // End of NO_URI_HASH #ifdef __cplusplus } #endif #endif // End of UGET_HASH_H uget-2.2.2/uget/UgetPluginCurl.c0000664000175000017500000012727013470304402013433 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #ifdef HAVE_CONFIG_H #include #endif #ifdef __ANDROID__ #include #endif #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include // Sleep() #include #define ug_sleep Sleep #else #include // posix_fallocate() #include // sleep(), usleep() #define ug_sleep(millisecond) usleep(millisecond * 1000) #endif // _WIN32 || _WIN64 #if defined(_MSC_VER) #define strtoll _strtoi64 // stdlib.h #endif #define MIN_SPLIT_SIZE (10 * 1024 * 1024) // can't less than 16384 x 2 #define MIN_SPEED_LIMIT 256 // speed control #define MAX_REPEAT_DIGITS 5 // + '.' + digits #define MAX_REPEAT_COUNTS 10000 // <= 9999 typedef struct UriLink UriLink; struct UriLink { UG_LINK_MEMBERS(UriLink, UriLink, self); // UriLink* self; // UriLink* next; // UriLink* prev; uint8_t scheme_type; uint8_t resumable:1; uint8_t tested:1; uint8_t ok:1; char uri[1]; }; // ---------------------------------------------------------------------------- // UgetPluginInfo (derived from UgTypeInfo) static void plugin_init (UgetPluginCurl* plugin); static void plugin_final(UgetPluginCurl* plugin); static int plugin_ctrl (UgetPluginCurl* plugin, int code, void* data); static int plugin_accept(UgetPluginCurl* plugin, UgInfo* node_info); static int plugin_sync (UgetPluginCurl* plugin, UgInfo* node_info); static UgetResult global_set(int code, void* parameter); static UgetResult global_get(int code, void* parameter); static const char* schemes[] = {"http", "https", "ftp", "ftps", NULL}; static const UgetPluginInfo UgetPluginCurlInfoStatic = { "curl", sizeof(UgetPluginCurl), (UgInitFunc) plugin_init, (UgFinalFunc) plugin_final, (UgetPluginSyncFunc) plugin_accept, (UgetPluginSyncFunc) plugin_sync, (UgetPluginCtrlFunc) plugin_ctrl, NULL, schemes, NULL, (UgetPluginGlobalFunc) global_set, (UgetPluginGlobalFunc) global_get }; // extern const UgetPluginInfo* UgetPluginCurlInfo = &UgetPluginCurlInfoStatic; // ---------------------------------------------------------------------------- // global data and it's functions. static struct { int initialized; int ref_count; } global = {0, 0}; static UgetResult global_init(void) { if (global.initialized == FALSE) { #if defined _WIN32 || defined _WIN64 WSADATA WSAData; WSAStartup(MAKEWORD(2, 2), &WSAData); #endif // _WIN32 || _WIN64 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { #if defined _WIN32 || defined _WIN64 WSACleanup(); #endif return UGET_RESULT_ERROR; } global.initialized = TRUE; } global.ref_count++; return UGET_RESULT_OK; } static void global_ref(void) { global.ref_count++; } static void global_unref(void) { if (global.initialized == FALSE) return; global.ref_count--; if (global.ref_count == 0) { global.initialized = FALSE; curl_global_cleanup(); #if defined _WIN32 || defined _WIN64 WSACleanup(); #endif } } static UgetResult global_set(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: // do global initialize/uninitialize here if (parameter) return global_init(); else global_unref(); break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } static UgetResult global_get(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: if (parameter) *(int*)parameter = global.initialized; break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } // ---------------------------------------------------------------------------- // plug-in functions static void plugin_init(UgetPluginCurl* plugin) { if (global.initialized == FALSE) global_init(); else global_ref(); ug_list_init(&plugin->segment.list); plugin->file.time = -1; plugin->synced = TRUE; plugin->paused = TRUE; plugin->stopped = TRUE; } static void plugin_final(UgetPluginCurl* plugin) { if (plugin->common) ug_data_free(plugin->common); if (plugin->files) ug_data_free(plugin->files); if (plugin->proxy) ug_data_free(plugin->proxy); if (plugin->http) ug_data_free(plugin->http); if (plugin->ftp) ug_data_free(plugin->ftp); // free uri.list (UriLink), all link will be freed. ug_list_foreach(&plugin->uri.list, (UgForeachFunc) ug_free, NULL); // curl_slist_free_all(plugin->ftp_command); ug_free(plugin->folder.path); ug_free(plugin->file.name_fmt); ug_free(plugin->file.path); ug_free(plugin->aria2.path); global_unref(); } // ---------------------------------------------------------------------------- // plugin_ctrl static int plugin_ctrl_speed(UgetPluginCurl* plugin, int* speed); static int plugin_start(UgetPluginCurl* plugin); static int plugin_ctrl(UgetPluginCurl* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: if (plugin->common) return plugin_start(plugin); break; case UGET_PLUGIN_CTRL_STOP: plugin->paused = TRUE; return TRUE; case UGET_PLUGIN_CTRL_SPEED: // speed control return plugin_ctrl_speed(plugin, data); // state ---------------- case UGET_PLUGIN_GET_STATE: *(int*)data = (plugin->stopped) ? FALSE : TRUE; return TRUE; default: break; } return FALSE; } static int plugin_ctrl_speed(UgetPluginCurl* plugin, int* speed) { UgetCommon* common; int value; // notify plug-in that speed limit has been changed if (plugin->limit.download != speed[0] || plugin->limit.upload != speed[1]) plugin->limit_changed = TRUE; // decide speed limit by user specified data. common = plugin->common; if (common == NULL) { plugin->limit.download = speed[0]; plugin->limit.upload = speed[1]; } else { // download value = speed[0]; if (common->max_download_speed) { if (value > common->max_download_speed || value == 0) { value = common->max_download_speed; plugin->limit_changed = TRUE; } } plugin->limit.download = value; // upload value = speed[1]; if (common->max_upload_speed) { if (value > common->max_upload_speed || value == 0) { value = common->max_upload_speed; plugin->limit_changed = TRUE; } } plugin->limit.upload = value; } return plugin->limit_changed; } // ---------------------------------------------------------------------------- // plugin_sync static int plugin_sync(UgetPluginCurl* plugin, UgInfo* node_info) { UgetCommon* common; UgetFiles* files; UgetProgress* progress; char* name; int speed[2]; if (plugin->stopped) { if (plugin->synced) return FALSE; plugin->synced = TRUE; } // avoid crash if plug-in failed to start. if (plugin->common == NULL) return FALSE; // sync data between plug-in and foreign UgData common = ug_info_realloc(node_info, UgetCommonInfo); common->retry_count = plugin->common->retry_count; // sync changed limit from node_info if (plugin->common->max_upload_speed != common->max_upload_speed || plugin->common->max_download_speed != common->max_download_speed) { // speed control plugin->common->max_upload_speed = common->max_upload_speed; plugin->common->max_download_speed = common->max_download_speed; speed[1] = common->max_upload_speed; speed[0] = common->max_download_speed; plugin_ctrl_speed(plugin, speed); } plugin->common->max_connections = common->max_connections; plugin->common->retry_limit = common->retry_limit; if (common->max_connections > 0) plugin->segment.n_max = common->max_connections; progress = ug_info_realloc(node_info, UgetProgressInfo); progress->upload_speed = plugin->speed.upload; progress->download_speed = plugin->speed.download; progress->uploaded = plugin->size.upload; progress->complete = plugin->size.download; if (plugin->file.size > 0) progress->total = plugin->file.size; else progress->total = progress->complete; if (progress->total > 0) progress->percent = (int) (progress->complete * 100 / progress->total); else progress->percent = 0; // If total size and average speed is unknown, don't calculate remain time. if (progress->download_speed > 0 && progress->total > 0) { progress->left = (progress->total - progress->complete) / progress->download_speed; } // consume time progress->elapsed = time(NULL) - plugin->start_time; // update UgetFiles files = ug_info_realloc(node_info, UgetFilesInfo); uget_plugin_lock(plugin); uget_files_sync(files, plugin->files); uget_plugin_unlock(plugin); // set name if (plugin->file_renamed && plugin->file.path) { plugin->file_renamed = FALSE; // change name #if defined _WIN32 || defined _WIN64 name = strrchr(plugin->file.path, '\\'); #else name = strrchr(plugin->file.path, '/'); #endif if (name && name[1]) { if (common->name == NULL || strcmp(name, common->name)) { ug_free(common->name); common->name = ug_strdup(name + 1); uget_plugin_post((UgetPlugin*) plugin, uget_event_new(UGET_EVENT_NAME)); } ug_free(common->file); common->file = ug_strdup(name + 1); } } return TRUE; } // ---------------------------------------------------------------------------- // plugin_accept/plugin_start static void plugin_decide_uris(UgetPluginCurl* plugin); static void plugin_decide_folder(UgetPluginCurl* plugin); static void plugin_decide_files(UgetPluginCurl* plugin); static UgThreadResult plugin_thread(UgetPluginCurl* plugin); static int plugin_accept(UgetPluginCurl* plugin, UgInfo* node_info) { union { UgetCommon* common; UgetFiles* files; UgetProxy* proxy; UgetHttp* http; UgetFtp* ftp; } temp; int speed[2]; temp.common = ug_info_get(node_info, UgetCommonInfo); if (temp.common == NULL || temp.common->uri == NULL) return FALSE; plugin->common = ug_data_copy(temp.common); plugin_decide_uris(plugin); plugin_decide_folder(plugin); // speed control: decide speed limit before starting plug-in speed[0] = plugin->limit.download; speed[1] = plugin->limit.upload; plugin_ctrl_speed(plugin, speed); temp.files = ug_info_get(node_info, UgetFilesInfo); if (temp.files) plugin->files = ug_data_copy(temp.files); else plugin->files = ug_data_new(UgetFilesInfo); temp.proxy = ug_info_get(node_info, UgetProxyInfo); if (temp.proxy) plugin->proxy = ug_data_copy(temp.proxy); temp.http = ug_info_get(node_info, UgetHttpInfo); if (temp.http) { plugin->http = ug_data_copy(temp.http); // check http->post_file if (temp.http->post_file) { if (ug_file_is_exist(temp.http->post_file) == FALSE) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_POST_FILE_NOT_FOUND, NULL)); return FALSE; } } // check http->cookie_file if (temp.http->cookie_file) { if (ug_file_is_exist(temp.http->cookie_file) == FALSE) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_COOKIE_FILE_NOT_FOUND, NULL)); return FALSE; } } } temp.ftp = ug_info_get(node_info, UgetFtpInfo); if (temp.ftp) plugin->ftp = ug_data_copy(temp.ftp); return TRUE; } static int plugin_start(UgetPluginCurl* plugin) { UgThread thread; int ok; plugin->start_time = time(NULL); // try to start thread plugin->paused = FALSE; plugin->stopped = FALSE; uget_plugin_ref((UgetPlugin*) plugin); ok = ug_thread_create(&thread, (UgThreadFunc) plugin_thread, plugin); if (ok == UG_THREAD_OK) ug_thread_unjoin(&thread); else { // failed to start thread ----------------- plugin->paused = TRUE; plugin->stopped = TRUE; // post error message and decreases the reference count uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_THREAD_CREATE_FAILED, NULL)); uget_plugin_unref((UgetPlugin*) plugin); return FALSE; } return TRUE; } static UriLink* plugin_replace_uri(UgetPluginCurl* plugin, UriLink* old_link, const char* uri, int uri_len) { UriLink* uri_link; if (uri_len == -1) uri_len = strlen(uri); uri_link = ug_malloc(sizeof(UriLink) + uri_len); strncpy(uri_link->uri, uri, uri_len); uri_link->uri[uri_len] = 0; // null terminated uri_link->self = uri_link; uri_link->next = NULL; uri_link->prev = NULL; uri_link->scheme_type = 0; uri_link->resumable = FALSE; uri_link->tested = FALSE; uri_link->ok = FALSE; // add to list if (old_link == NULL) ug_list_append(&plugin->uri.list, (void*) uri_link); else { ug_list_insert(&plugin->uri.list, (void*) old_link, (void*) uri_link); ug_list_remove(&plugin->uri.list, (void*) old_link); if (plugin->uri.link == (void*) old_link) plugin->uri.link = (void*) uri_link; ug_free(old_link); } return uri_link; } static void plugin_decide_uris(UgetPluginCurl* plugin) { UgetCommon* common; const char* curr; const char* prev; common = plugin->common; // uri plugin->uri.link = (void*) plugin_replace_uri(plugin, NULL, common->uri, -1); ug_free(common->uri); common->uri = NULL; // mirrors for (curr = common->mirrors; curr && curr[0];) { // skip space ' ' while (curr[0] == ' ') curr++; prev = curr; curr = curr + strcspn(curr, " "); // add to uri.list plugin_replace_uri(plugin, NULL, prev, curr - prev); } ug_free(common->mirrors); common->mirrors = NULL; } static void plugin_decide_folder(UgetPluginCurl* plugin) { UgetCommon* common; int length; int value; // folder common = plugin->common; if (common->folder == NULL || common->folder[0] == 0) length = 0; else { length = strlen(common->folder); value = common->folder[length - 1]; plugin->folder.path = ug_malloc(length + 2); // + '/' + '\x0' plugin->folder.path[0] = 0; strcpy(plugin->folder.path, common->folder); if (value != '\\' || value != '/') { #if defined _WIN32 || defined _WIN64 strcat(plugin->folder.path, "\\"); #else strcat(plugin->folder.path, "/"); #endif length++; } } plugin->folder.length = length; } static void plugin_decide_files(UgetPluginCurl* plugin) { // update UgetFiles uget_plugin_lock(plugin); // insert/replace file into files if (plugin->aria2.path) { uget_files_replace(plugin->files, plugin->aria2.path, UGET_FILE_TEMPORARY, 0); } uget_files_replace(plugin->files, plugin->file.path, UGET_FILE_REGULAR, 0); uget_plugin_unlock(plugin); } // ---------------------------------------------------------------------------- // plugin_thread #define N_THREAD(plugin) ((plugin)->segment.list.size) static void delay_ms(UgetPluginCurl* plugin, int milliseconds); static int switch_uri(UgetPluginCurl* plugin, UgetCurl* ugcurl, int is_resumable); static int prepare_file(UgetCurl* ugcurl, UgetPluginCurl* plugin); static char* get_repeating_fmt_string(char* filename); static void complete_file(UgetPluginCurl* plugin); static int load_file_info(UgetPluginCurl* plugin); static void clear_file_info(UgetPluginCurl* plugin); static int reuse_download(UgetPluginCurl* plugin, UgetCurl* ugcurl, int next_uri); static int split_download(UgetPluginCurl* plugin, UgetCurl* ugcurl); static void adjust_speed_limit(UgetPluginCurl* plugin); static UgetCurl* create_segment(UgetPluginCurl* plugin); static UgThreadResult plugin_thread(UgetPluginCurl* plugin) { UgetCommon* common; UgetCurl* ugcurl; UgetCurl* ugnext; int counter; int n_active_last = 0; struct { int64_t upload; int64_t download; } size, speed; common = plugin->common; common->retry_count = 0; plugin->segment.n_max = common->max_connections; if (plugin->segment.n_max == 0) plugin->segment.n_max = 1; // create new segment and add it to segment.list ugcurl = create_segment(plugin); if (load_file_info(plugin)) { uget_curl_open_file(ugcurl, plugin->file.path); ugcurl->beg = plugin->segment.beg; uget_a2cf_lack(&plugin->aria2.ctrl, (uint64_t*) &ugcurl->beg, (uint64_t*) &ugcurl->end); plugin->segment.beg = ugcurl->end; // plugin_sync() will set foreign UgetCommon::name plugin->file_renamed = TRUE; plugin->synced = FALSE; } else { clear_file_info(plugin); ugcurl->prepare.func = (UgetCurlFunc) prepare_file; ugcurl->prepare.data = plugin; ugcurl->header_store = TRUE; } ug_list_append(&plugin->segment.list, (void*) ugcurl); // start curl uget_curl_run(ugcurl, FALSE); // main loop for (counter = 0; N_THREAD(plugin) > 0; counter++) { // sleep 0.5 second ug_sleep(500); // reset data, plug-in will count them (in segment loop) later plugin->segment.n_active = 0; size.upload = 0; size.download = 0; speed.upload = 0; speed.download = 0; // segment loop ugcurl = (UgetCurl*) plugin->segment.list.head; for (; ugcurl; ugcurl = ugnext) { ugnext = ugcurl->next; // split download, use these code with split_download() if (ugcurl->split) { if (ugcurl->prev == NULL || ugcurl->prev->end < ugcurl->beg) ugcurl->split = FALSE; else if (ugcurl->beg < ugcurl->prev->pos) { // if previous segment overwrite current one. ugcurl->split = FALSE; ugcurl->paused = TRUE; ugcurl->end = ugcurl->beg; ugcurl->pos = ugcurl->beg; ugcurl->size[0] = 0; #ifndef NDEBUG if (common->debug_level) { printf("\n" "previous segment overwrite at %u KiB\n", (unsigned) (ugcurl->beg / 1024)); } #endif } else if (ugcurl->beg < ugcurl->pos) { // If this segment has downloaded data, // plug-in split new segment from previous one. ugcurl->split = FALSE; ugcurl->prev->end = ugcurl->beg; if (ugcurl->prev->pos > ugcurl->beg) { ugcurl->prev->pos = ugcurl->beg; ugcurl->prev->size[0] = ugcurl->prev->pos - ugcurl->prev->beg; } #ifndef NDEBUG if (common->debug_level) { printf("\n" "split new segment at %u KiB\n", (unsigned) (ugcurl->beg / 1024)); } #endif } } // if user want to stop plug-in, it must stop all UgetCurl in list. if (plugin->paused) { ugcurl->paused = TRUE; plugin->segment.n_max = 0; } // update aria2 control file progress if (plugin->aria2.path) uget_a2cf_fill(&plugin->aria2.ctrl, ugcurl->beg, ugcurl->pos); // progress if (ugcurl->state >= UGET_CURL_OK) { // ugcurl has stopped plugin->base.upload += ugcurl->size[1]; plugin->base.download += ugcurl->size[0]; } else if (ugcurl->state == UGET_CURL_RUN) { size.upload += ugcurl->size[1]; size.download += ugcurl->size[0]; speed.upload += ugcurl->speed[1]; speed.download += ugcurl->speed[0]; } // handle UgetCurl by state switch (ugcurl->state) { default: break; case UGET_CURL_RUN: plugin->segment.n_active++; break; case UGET_CURL_OK: ugcurl->state = UGET_CURL_RESPLIT; // special case for unknown file size if (plugin->file.size == 0 && N_THREAD (plugin) == 1) { complete_file(plugin); // delete download ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); } break; case UGET_CURL_ABORT: // delete download ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); break; case UGET_CURL_ERROR: // if no other downloading segment, plug-in response error if (N_THREAD(plugin) == 1) { // post error message if (ugcurl->event) { uget_plugin_post((UgetPlugin*) plugin, ugcurl->event); ugcurl->event = NULL; } // delete download ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); } else { // try to reuse download reuse_download(plugin, ugcurl, TRUE); } break; case UGET_CURL_RETRY: // if no other downloading segment if (N_THREAD(plugin) == 1) { common->retry_count++; if (common->retry_count < common->retry_limit || common->retry_limit == 0) { ugcurl->beg = ugcurl->pos; delay_ms(plugin, common->retry_delay * 1000); uget_curl_run(ugcurl, FALSE); } else { // delete segment ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); } } else { // try to reuse download reuse_download(plugin, ugcurl, FALSE); } break; case UGET_CURL_NOT_RESUMABLE: // if no other downloading segment if (N_THREAD(plugin) == 1) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_normal( UGET_EVENT_NORMAL_NOT_RESUMABLE, NULL)); common->retry_count++; if (common->retry_count < common->retry_limit || common->retry_limit == 0) { plugin->base.download = 0; plugin->size.download = 0; ugcurl->beg = 0; ugcurl->end = plugin->file.size; delay_ms(plugin, common->retry_delay * 1000); switch_uri(plugin, ugcurl, TRUE); uget_curl_run(ugcurl, FALSE); } else { // delete download ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); } } else { // try to reuse download reuse_download(plugin, ugcurl, TRUE); } break; } } // use completed UgetCurl to split new segment after segment loop ugcurl = (UgetCurl*) plugin->segment.list.head; for (; ugcurl; ugcurl = ugnext) { ugnext = ugcurl->next; if (ugcurl->state == UGET_CURL_RESPLIT) { if (split_download(plugin, ugcurl) == FALSE) { // delete download ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); } } } // progress --------------------- plugin->size.upload = plugin->base.upload + size.upload; plugin->size.download = plugin->base.download + size.download; // Don't update speed when stopping if (plugin->segment.list.size) { plugin->speed.upload = speed.upload; plugin->speed.download = speed.download; } plugin->synced = FALSE; // check file size -------------- if (plugin->file.size) { // response error if file size is different if (plugin->file.size < plugin->size.download) { #if 0 #ifndef NDEBUG if (common->debug_level) { printf("file size is different\n"); printf("plugin->file.size = %d\n", (int)plugin->file.size); printf("plugin->size.download = %d\n", (int)plugin->size.download); } #endif // NDEBUG plugin->size.download = plugin->file.size; #else plugin->paused = TRUE; if (N_THREAD(plugin) > 0) continue; // wait other thread else { if (plugin->aria2.path) ug_unlink(plugin->aria2.path); uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error( UGET_EVENT_ERROR_INCORRECT_SOURCE, NULL)); plugin->synced = FALSE; break; } #endif } // download completed if (plugin->file.size == plugin->size.download) { if (N_THREAD(plugin) > 0) continue; // wait other thread else { complete_file(plugin); plugin->synced = FALSE; break; } } } // timer ------------------------ // adjust speed every 0.5 x 2 = 1 second. if ((counter & 1) == 1 || n_active_last != plugin->segment.n_active) { n_active_last = plugin->segment.n_active; adjust_speed_limit(plugin); } // save aria2 control file every 0.5 x 4 = 2 seconds. if ((counter & 3) == 3 || N_THREAD(plugin) == 0) { if (plugin->aria2.path) uget_a2cf_save(&plugin->aria2.ctrl, plugin->aria2.path); } // split download every 0.5 x 8 = 4 seconds. if ((counter & 7) == 7 && plugin->file.size) { // If some threads are connecting, It doesn't split new segment. if (N_THREAD(plugin) < plugin->segment.n_max && N_THREAD(plugin) == plugin->segment.n_active) { split_download(plugin, NULL); } } // retry ------------------------ if (common->retry_count >= common->retry_limit && common->retry_limit != 0) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error( UGET_EVENT_ERROR_TOO_MANY_RETRIES, NULL)); plugin->synced = FALSE; plugin->paused = TRUE; } } // count the latest downloaded size if download doesn't complete if ((plugin->file.size != plugin->size.download) && plugin->aria2.path) { plugin->size.download = uget_a2cf_completed(&plugin->aria2.ctrl); plugin->synced = FALSE; } // free segment list ug_list_foreach(&plugin->segment.list, (UgForeachFunc) uget_curl_free, NULL); ug_list_clear(&plugin->segment.list, FALSE); // uget_a2cf_clear(&plugin->aria2.ctrl); plugin->stopped = TRUE; uget_plugin_unref((UgetPlugin*) plugin); return UG_THREAD_RESULT; } static int prepare_existed(UgetCurl* ugcurl, UgetPluginCurl* plugin) { double fsize; long ftime; // file.size if (plugin->file.size) { curl_easy_getinfo(ugcurl->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &fsize); if (plugin->file.size != ugcurl->beg + (int64_t) fsize) { // if remote file size and local file size are not the same, // plug-in will create new download file. if (plugin->prepared == FALSE) { // plugin_thread() has initialized/created some data for this function. // program must clear these data before calling prepare_file() clear_file_info(plugin); uget_curl_close_file(ugcurl); return prepare_file(ugcurl, plugin); } // don't write INCORRECT data to existed file. ugcurl->event_code = UGET_EVENT_ERROR_INCORRECT_SOURCE; ugcurl->size[0] = 0; return FALSE; } } // file.time if (plugin->file.time == -1) { curl_easy_getinfo(ugcurl->curl, CURLINFO_FILETIME, &ftime); plugin->file.time = (time_t) ftime; } if (uget_curl_open_file(ugcurl, plugin->file.path)) { plugin->prepared = TRUE; return TRUE; } else { ugcurl->event_code = UGET_EVENT_ERROR_FILE_OPEN_FAILED; return FALSE; } } static int prepare_file(UgetCurl* ugcurl, UgetPluginCurl* plugin) { UgetCommon* common; int length; int counts; int value; union { long ftime; double fsize; int64_t val64; UriLink* ulink; } temp; // file.time curl_easy_getinfo(ugcurl->curl, CURLINFO_FILETIME, &temp.ftime); plugin->file.time = (time_t) temp.ftime; // file.size curl_easy_getinfo(ugcurl->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &temp.fsize); plugin->file.size = (int64_t) temp.fsize + ugcurl->beg; if (plugin->file.size == -1) plugin->file.size = 0; common = plugin->common; length = plugin->folder.length; // decide filename if (common->file == NULL) { if (ugcurl->header.filename) { common->file = ugcurl->header.filename; ugcurl->header.filename = NULL; } else if (ugcurl->uri.part.file != -1) common->file = ug_uri_get_file(&ugcurl->uri.part); // if it is still no filename, set default one if (common->file == NULL) common->file = ug_strdup("index"); // replace invalid characters \/:*?"<>| by _ in filename. ug_str_replace_chars(common->file, "\\/:*?\"<>|", '_'); } length += strlen(common->file); // path = folder + filename // length + digits + ".aria2" + '\0' plugin->file.path = ug_malloc(length + MAX_REPEAT_DIGITS + 6 + 1); plugin->file.path[0] = 0; // you need this line if common->folder is NULL. if (plugin->folder.path) strcpy(plugin->file.path, plugin->folder.path); strcat(plugin->file.path, common->file); plugin->file.name_fmt = get_repeating_fmt_string(common->file); // create folder if (ug_create_dir_all(plugin->file.path, plugin->folder.length) == -1) { ugcurl->event_code = UGET_EVENT_ERROR_FOLDER_CREATE_FAILED; return FALSE; } // create file for (counts = 0; counts < MAX_REPEAT_COUNTS; counts++) { value = ug_open(plugin->file.path, UG_O_CREATE | UG_O_EXCL | UG_O_WRONLY, UG_S_IREAD | UG_S_IWRITE | UG_S_IRGRP | UG_S_IROTH); // value = ug_open(plugin->file.path, UG_O_CREATE | UG_O_EXCL | UG_O_RDWR, // UG_S_IREAD | UG_S_IWRITE | UG_S_IRGRP | UG_S_IROTH); // check if this path can't access // if (value == -1 && ug_file_is_exist(plugin->file.path) == FALSE) { // ugcurl->event_code = UGET_EVENT_ERROR_FILE_CREATE_FAILED; // return FALSE; // error // } // check exist downloaded file & it's control file strcat(plugin->file.path + length, ".aria2"); if (value == -1) { if (uget_a2cf_load(&plugin->aria2.ctrl, plugin->file.path)) { if (plugin->aria2.ctrl.total_len == plugin->file.size) { plugin->aria2.path = ug_strdup(plugin->file.path); plugin->base.download = uget_a2cf_completed(&plugin->aria2.ctrl); plugin->size.download = plugin->base.download; *(char*) strstr(plugin->file.path + length, ".aria2") = 0; break; } uget_a2cf_clear(&plugin->aria2.ctrl); } } else { // reset downloaded size if plug-in decide to create new file. plugin->base.download = 0; plugin->size.download = 0; // allocate disk space if plug-in known file size if (plugin->file.size) { // preallocate space for a file. #if defined _WIN32 || defined _WIN64 LARGE_INTEGER size; HANDLE handle; handle = (HANDLE) _get_osfhandle(value); size.QuadPart = plugin->file.size; if(SetFilePointerEx(handle ,size, 0, FILE_BEGIN) == FALSE) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; if(SetEndOfFile(handle) == FALSE) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; SetFilePointer(handle, 0, 0, FILE_BEGIN); #elif defined HAVE_FTRUNCATE if (ftruncate(value, plugin->file.size) == -1) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; #elif defined __ANDROID__ && __ANDROID_API__ >= 12 if (ftruncate64(value, plugin->file.size) == -1) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; #elif defined HAVE_POSIX_FALLOCATE if (posix_fallocate(value, 0, plugin->file.size) != 0) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; #elif defined __ANDROID__ && __ANDROID_API__ >= 20 if (posix_fallocate64(value, 0, plugin->file.size) != 0) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; #else if (ug_write(value, "O", 1) == -1) // begin of file ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; if (ug_seek(value, plugin->file.size - 1, SEEK_SET) == -1) ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; if (ug_write(value, "X", 1) == -1) // end of file ugcurl->event_code = UGET_EVENT_ERROR_OUT_OF_RESOURCE; #endif // _WIN32 || _WIN64 // create aria2 control file if no error if (ugcurl->event_code == 0) { plugin->aria2.path = ug_strdup(plugin->file.path); uget_a2cf_init(&plugin->aria2.ctrl, plugin->file.size); uget_a2cf_save(&plugin->aria2.ctrl, plugin->aria2.path); } } ug_close(value); // remove tail ".aria2" string in file path *(char*) strstr(plugin->file.path + length, ".aria2") = 0; // if error occurred while allocating disk space, delete created download file. if (ugcurl->event_code > 0) { ug_unlink(plugin->file.path); return FALSE; } break; } sprintf(plugin->file.path + plugin->folder.length, plugin->file.name_fmt, counts); } if (counts == MAX_REPEAT_COUNTS) { ugcurl->event_code = UGET_EVENT_ERROR_FILE_CREATE_FAILED; return FALSE; } // set filename if counts > 0 if (counts) { ug_free(common->file); common->file = ug_strdup(plugin->file.path + plugin->folder.length); } plugin->file_renamed = TRUE; // update UgetFiles plugin_decide_files(plugin); // event if (ugcurl->resumable) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_normal(UGET_EVENT_NORMAL_RESUMABLE, NULL)); } else { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_normal(UGET_EVENT_NORMAL_NOT_RESUMABLE, NULL)); } #ifndef NDEBUG if (common->debug_level) { printf("CURL message = %s\n", ugcurl->error_string); printf("plugin->file.path = %s\n", plugin->file.path); printf("plugin->file.size = %d\n", (int)plugin->file.size); printf("plugin->file.time = %d\n", (int)plugin->file.time); printf("resumable = %d\n", ugcurl->resumable); } #endif // set flags to UriLink if (ugcurl->header.uri) { // HTTP redirection temp.ulink = plugin_replace_uri(plugin, ugcurl->uri.link, ugcurl->header.uri, -1); ugcurl->uri.link = temp.ulink; ug_free(ugcurl->header.uri); ugcurl->header.uri = NULL; } else temp.ulink = ugcurl->uri.link; temp.ulink->scheme_type = ugcurl->scheme_type; temp.ulink->resumable = ugcurl->resumable; temp.ulink->tested = TRUE; temp.ulink->ok = TRUE; // change callback ugcurl->prepare.func = (UgetCurlFunc) prepare_existed; ugcurl->prepare.data = plugin; // prepare to download plugin->prepared = TRUE; // file and it's offset temp.val64 = 0; uget_a2cf_lack(&plugin->aria2.ctrl, (uint64_t*) &temp.val64, (uint64_t*) &ugcurl->end); plugin->segment.beg = ugcurl->end; if (ugcurl->beg == temp.val64) { if (uget_curl_open_file(ugcurl, plugin->file.path) == FALSE) { ugcurl->event_code = UGET_EVENT_ERROR_FILE_OPEN_FAILED; return FALSE; } return TRUE; } else { ugcurl->beg = temp.val64; ugcurl->pos = temp.val64; curl_easy_setopt(ugcurl->curl, CURLOPT_RESUME_FROM_LARGE, (curl_off_t) temp.val64); if (uget_curl_open_file(ugcurl, plugin->file.path)) ugcurl->restart = TRUE; return FALSE; } } // used by get_repeating_fmt_string() enum { EXT_NUMBER = 0x01, EXT_UPPER = 0x02, EXT_LOWER = 0x04, EXT_CAMEL = EXT_UPPER | EXT_LOWER, EXT_ALL = EXT_UPPER | EXT_LOWER | EXT_NUMBER, }; // used by get_repeating_fmt_string() static char* find_dot_ext(const char* filename, const char* end, uint8_t* status) { uint8_t stat = 0; const char* cur = NULL; for (cur = end-1; cur >= filename; cur--) { if (cur[0] == '.') { if (cur == end-1 || cur == filename) break; if (status) status[0] = stat; return (char*)cur; } else if (cur[0] >= '0' && cur[0] <= '9') stat |= EXT_NUMBER; else if (cur[0] >= 'A' && cur[0] <= 'Z') stat |= EXT_UPPER; else if (cur[0] >= 'a' && cur[0] <= 'z') stat |= EXT_LOWER; else break; } return NULL; } static char* get_repeating_fmt_string(char* filename) { char* result; char* dot[3] = {NULL, NULL, NULL}; uint8_t stat[3] = {0, 0, 0}; int index; int length; length = strlen(filename); result = ug_malloc(length + 3 + 1); // + ".%d" + "\0" // dot[0] dot[0] = find_dot_ext(filename, filename + length, &stat[0]); if (dot[0]) dot[1] = find_dot_ext(filename, dot[0], &stat[1]); if (dot[1]) dot[2] = find_dot_ext(filename, dot[1], &stat[2]); for (index = 2; index >= 0; index--) { if (dot[index] == NULL) continue; // replace exist number if (stat[index] == EXT_NUMBER) { // strncpy() doesn't always null-terminated strncpy(result, filename, dot[index] - filename); result[dot[index] - filename] = 0; strcat(result, ".%d"); if (index > 0) strcat(result, dot[index-1]); return result; } // insert number if (index == 2) continue; // strncpy() doesn't always null-terminated strncpy(result, filename, dot[index] - filename); result[dot[index] - filename] = 0; strcat(result, ".%d"); strcat(result, dot[index]); return result; } // append number strcpy(result, filename); strcat(result, ".%d"); // return printf() format string return result; } static int load_file_info(UgetPluginCurl* plugin) { UgetCommon* common; char* path; int length; common = plugin->common; if (common == NULL || common->file == NULL) return FALSE; // folder + filename length = plugin->folder.length; length += strlen(common->file); // path path = ug_malloc(length + 6 + 1); // length + ".aria2" + '\0' path[0] = 0; // you need this line if common->folder is NULL. if (plugin->folder.path) strcpy(path, plugin->folder.path); strcat(path, common->file); if (ug_file_is_exist(path) == FALSE) { ug_free(path); return FALSE; } strcat(path, ".aria2"); // aria2 control file if (uget_a2cf_load(&plugin->aria2.ctrl, path)) { plugin->file.size = plugin->aria2.ctrl.total_len; plugin->file.path = ug_strndup(path, length); plugin->aria2.path = path; plugin->base.download = uget_a2cf_completed(&plugin->aria2.ctrl); plugin->size.download = plugin->base.download; // update UgetFiles plugin_decide_files(plugin); return TRUE; } else { uget_a2cf_clear(&plugin->aria2.ctrl); ug_free(path); return FALSE; } } static void clear_file_info(UgetPluginCurl* plugin) { // update UgetFiles uget_plugin_lock(plugin); uget_files_apply_deleted(plugin->files); uget_plugin_unlock(plugin); uget_a2cf_clear(&plugin->aria2.ctrl); ug_free(plugin->aria2.path); plugin->aria2.path = NULL; ug_free(plugin->file.path); plugin->file.path = NULL; plugin->file.size = 0; plugin->base.download = 0; plugin->size.download = 0; } static int switch_uri(UgetPluginCurl* plugin, UgetCurl* ugcurl, int is_resumable) { UriLink* uri_link; uri_link = (UriLink*) plugin->uri.link; if (uri_link == NULL) uri_link = (UriLink*) plugin->uri.list.head; // set URI and decide it's scheme uget_curl_set_url(ugcurl, uri_link->uri); uri_link->scheme_type = ugcurl->scheme_type; // sync URI flags to UgetCurl ugcurl->uri.link = uri_link; ugcurl->resumable = uri_link->resumable; ugcurl->tested = uri_link->tested; ugcurl->test_ok = uri_link->ok; // pointer current URI to next one plugin->uri.link = (void*) uri_link->next; return TRUE; } static void complete_file(UgetPluginCurl* plugin) { if (plugin->aria2.path) { // update UgetFiles uget_plugin_lock(plugin); uget_files_replace(plugin->files, plugin->file.path, UGET_FILE_REGULAR, UGET_FILE_STATE_COMPLETED); uget_files_replace(plugin->files, plugin->aria2.path, UGET_FILE_ATTACHMENT, UGET_FILE_STATE_DELETED); uget_plugin_unlock(plugin); // delete aria2 control file ug_unlink(plugin->aria2.path); ug_free(plugin->aria2.path); plugin->aria2.path = NULL; } // modify file time if (plugin->common->timestamp == TRUE && plugin->file.time != -1) ug_modify_file_time(plugin->file.path, plugin->file.time); // completed message uget_plugin_post((UgetPlugin*)plugin, uget_event_new(UGET_EVENT_COMPLETED)); uget_plugin_post((UgetPlugin*)plugin, uget_event_new(UGET_EVENT_STOP)); } static int reuse_download(UgetPluginCurl* plugin, UgetCurl* ugcurl, int next_uri) { if (ugcurl->beg == ugcurl->pos) { // delete segment if no downloaded data ug_list_remove(&plugin->segment.list, (void*)ugcurl); uget_curl_free(ugcurl); return FALSE; } else { // reuse this segment if (next_uri == TRUE) switch_uri(plugin, ugcurl, TRUE); ugcurl->beg = ugcurl->pos; uget_curl_run(ugcurl, FALSE); return TRUE; } } static int split_download(UgetPluginCurl* plugin, UgetCurl* ugcurl) { UgetCurl* temp; UgetCurl* sibling = NULL; uint64_t cur; uint64_t end; if (plugin->aria2.path == NULL) return FALSE; // try to find unused space cur = plugin->segment.beg; if (uget_a2cf_lack(&plugin->aria2.ctrl, &cur, &end)) { plugin->segment.beg = end; #ifndef NDEBUG if (plugin->common->debug_level) { printf("\n" "lack %u-%u KiB\n", (unsigned) cur / 1024, (unsigned) end / 1024); } #endif } // if no unused space, try to split downloading segment. else { // cur = segment size; end = the largest segment size; end = 0; for (temp = (void*)plugin->segment.list.head; temp; temp = temp->next) { cur = temp->end - temp->pos; if (end < cur) { end = cur; sibling = temp; } } if (sibling == NULL) return FALSE; cur = (sibling->end - sibling->pos) >> 1; // if segment is too small, don't split it. if (cur < MIN_SPLIT_SIZE) return FALSE; // cur = begin of new segment; end = end of new segment; cur = sibling->end - cur; end = sibling->end; if (cur & 16383) cur += 16384 - (cur & 16383); #ifndef NDEBUG if (plugin->common->debug_level) { printf("\n" "split %u-%u KiB\n", (unsigned) cur / 1024, (unsigned) end / 1024); } #endif } // reuse or create UgetCurl // if this UgetCurl has been inserted in segment.list, remove it. if (ugcurl) ug_list_remove(&plugin->segment.list, (UgLink*) ugcurl); else ugcurl = create_segment(plugin); // add to segment.list if (sibling == NULL) ug_list_append(&plugin->segment.list, (void*) ugcurl); else { ugcurl->split = TRUE; ug_list_insert(&plugin->segment.list, (void*) sibling->next, (void*) ugcurl); } ugcurl->beg = cur; ugcurl->end = end; uget_curl_run(ugcurl, FALSE); return TRUE; } static void delay_ms(UgetPluginCurl* plugin, int milliseconds) { while (plugin->paused == FALSE) { if (milliseconds > 500) { milliseconds -= 500; ug_sleep(500); continue; } ug_sleep(milliseconds); return; } } static UgetCurl* create_segment(UgetPluginCurl* plugin) { UgetCurl* ugcurl; ugcurl = uget_curl_new(); uget_curl_set_common(ugcurl, plugin->common); uget_curl_set_proxy(ugcurl, plugin->proxy); uget_curl_set_http(ugcurl, plugin->http); uget_curl_set_ftp(ugcurl, plugin->ftp); // set speed limit if (plugin->limit.download) ugcurl->limit[0] = plugin->limit.download / (plugin->segment.list.size + 1); if (plugin->limit.upload) ugcurl->limit[1] = plugin->limit.upload / (plugin->segment.list.size + 1); // select URL switch_uri(plugin, ugcurl, FALSE); // set output function ugcurl->prepare.func = (UgetCurlFunc) prepare_existed; ugcurl->prepare.data = plugin; return ugcurl; } // speed control static void adjust_speed_limit_index(UgetPluginCurl* plugin, int idx, int64_t remain) { UgetCurl* ucurl; // balance speed remain = remain / plugin->segment.n_active; for (ucurl = (UgetCurl*) plugin->segment.list.head; ucurl; ucurl=ucurl->next) { if (ucurl->state != UGET_CURL_RUN) continue; ucurl->limit[idx] = ucurl->speed[idx] + remain; if (ucurl->limit[idx] < MIN_SPEED_LIMIT) ucurl->limit[idx] = MIN_SPEED_LIMIT; ucurl->limit_changed = TRUE; } } static void disable_speed_limit(UgetPluginCurl* plugin, int idx) { UgetCurl* ugcurl; ugcurl = (UgetCurl*) plugin->segment.list.head; for (; ugcurl; ugcurl = ugcurl->next) { ugcurl->limit[idx] = 0; ugcurl->limit_changed = TRUE; } } static void adjust_speed_limit(UgetPluginCurl* plugin) { if (plugin->segment.n_active == 0) return; // download if (plugin->limit.download > 0) adjust_speed_limit_index(plugin, 0, plugin->limit.download - plugin->speed.download); else if (plugin->limit_changed) disable_speed_limit(plugin, 0); // upload if (plugin->limit.upload > 0) adjust_speed_limit_index(plugin, 1, plugin->limit.upload - plugin->speed.upload); else if (plugin->limit_changed) disable_speed_limit(plugin, 1); plugin->limit_changed = FALSE; } uget-2.2.2/uget/UgetMedia-youtube.c0000664000175000017500000005657213470304402014066 00000000000000/* * * Copyright (C) 2015-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #ifdef HAVE_GLIB #include #else #define _(x) x #endif // -------------------------------------------------------- // UgetMedia for YouTube // Youtube: // https://www.youtube.com/watch?v=xxxxxxxxxxx // https://youtu.be/xxxxxxxxxxx typedef struct UgetYouTube UgetYouTube; struct UgetYouTube { UgUriQuery query; char* video_id; // Method 1 UgBuffer buffer; char* reason; // VEVO char* status; // VEVO int error_code; // errorcode = 100, This video has been removed. // errorcode = 101 or 150, The video requested does not allow playback in an embedded player. // method 2 UgHtml html; UgJson json; char* js; // JavaScript player URL }; static UgetYouTube* uget_youtube_new(void) { UgetYouTube* uyoutube; uyoutube = ug_malloc0(sizeof(UgetYouTube)); ug_buffer_init(&uyoutube->buffer, 4096); uyoutube->reason = NULL; uyoutube->status = NULL; ug_html_init(&uyoutube->html); ug_json_init(&uyoutube->json); uyoutube->js = NULL; return uyoutube; } static void uget_youtube_free(UgetYouTube* uyoutube) { ug_buffer_clear(&uyoutube->buffer, TRUE); ug_free(uyoutube->reason); ug_free(uyoutube->status); ug_html_final(&uyoutube->html); ug_json_final(&uyoutube->json); ug_free(uyoutube->js); ug_free(uyoutube); } static void uget_youtube_parse_map(UgetYouTube* uyoutube, UgetMedia* umedia, const char* field) { UgetMediaItem* umitem = NULL; char* temp; while (ug_uri_query_part(&uyoutube->query, field)) { // debug // printf(" %.*s=%.*s\n", // uyoutube->query.field_len, field, // uyoutube->query.value_len, uyoutube->query.value); if (umitem == NULL) umitem = uget_media_item_new(umedia); if (strncmp("url", field, uyoutube->query.field_len) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); umitem->url = ug_strdup(uyoutube->query.value); } else if (strncmp("sig", field, uyoutube->query.field_len) == 0) { // signature. // If it exist, append "&signature=xxxx" to umitem->url umitem->data.string = ug_strndup(uyoutube->query.value, uyoutube->query.value_len); } else if (strncmp("type", field, uyoutube->query.field_len) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); if (strncmp("video/webm", uyoutube->query.value, 10) == 0) umitem->type = UGET_MEDIA_TYPE_WEBM; else if (strncmp("video/mp4", uyoutube->query.value, 9) == 0) umitem->type = UGET_MEDIA_TYPE_MP4; else if (strncmp("video/x-flv", uyoutube->query.value, 11) == 0) umitem->type = UGET_MEDIA_TYPE_FLV; else if (strncmp("video/3gpp", uyoutube->query.value, 10) == 0) umitem->type = UGET_MEDIA_TYPE_3GPP; else umitem->type = UGET_MEDIA_TYPE_UNKNOWN; } else if (strncmp(field, "quality", uyoutube->query.field_len) == 0) { // ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); if (strncmp("small", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_240P; else if (strncmp("medium", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_360P; else if (strncmp("large", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_480P; else if (strncmp("hd720", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_720P; else if (strncmp("hd1080", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_1080P; else umitem->quality = UGET_MEDIA_QUALITY_UNKNOWN; } if (uyoutube->query.value_next) { // append "&signature=xxxx" to url if (umitem->data.string) { temp = ug_strdup_printf("%s" "&signature=%s", umitem->url, umitem->data.string); ug_free(umitem->url); ug_free(umitem->data.string); umitem->url = temp; umitem->data.string = NULL; } umitem->order = 1; field = uyoutube->query.value_next; umitem = NULL; } else field = uyoutube->query.field_next; } } static void uget_youtube_parse_adaptive_fmts(UgetYouTube* uyoutube, UgetMedia* umedia, const char* field) { UgetMediaItem* umitem = NULL; char* temp; while (ug_uri_query_part(&uyoutube->query, field)) { // debug printf(" %.*s=%.*s\n", uyoutube->query.field_len, field, uyoutube->query.value_len, uyoutube->query.value); if (umitem == NULL) umitem = uget_media_item_new(umedia); if (strncmp("url", field, uyoutube->query.field_len) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); umitem->url = ug_strdup(uyoutube->query.value); } else if (strncmp("sig", field, uyoutube->query.field_len) == 0) { // signature. // If it exist, append "&signature=xxxx" to umitem->url umitem->data.string = ug_strndup(uyoutube->query.value, uyoutube->query.value_len); } else if (strncmp("type", field, uyoutube->query.field_len) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); if (strncmp("video/webm", uyoutube->query.value, 10) == 0) umitem->type = UGET_MEDIA_TYPE_WEBM; else if (strncmp("video/mp4", uyoutube->query.value, 9) == 0) umitem->type = UGET_MEDIA_TYPE_MP4; else if (strncmp("video/x-flv", uyoutube->query.value, 11) == 0) umitem->type = UGET_MEDIA_TYPE_FLV; else if (strncmp("video/3gpp", uyoutube->query.value, 10) == 0) umitem->type = UGET_MEDIA_TYPE_3GPP; else if (strncmp("audio/mp4", uyoutube->query.value, 9) == 0) umitem->type = UGET_MEDIA_AUDIO_MP4; else if (strncmp("audio/webm", uyoutube->query.value, 10) == 0) umitem->type = UGET_MEDIA_AUDIO_WEBM; else umitem->type = UGET_MEDIA_TYPE_UNKNOWN; } else if (strncmp(field, "quality_label", uyoutube->query.field_len) == 0) { // ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); if (strncmp("240p", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_240P; else if (strncmp("360p", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_360P; else if (strncmp("480p", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_480P; else if (strncmp("720p", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_720P; else if (strncmp("1080p", uyoutube->query.value, uyoutube->query.value_len) == 0) umitem->quality = UGET_MEDIA_QUALITY_1080P; else umitem->quality = UGET_MEDIA_QUALITY_UNKNOWN; } else if (strncmp(field, "bitrate", uyoutube->query.field_len) == 0) { // ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); umitem->bitrate = strtol(uyoutube->query.value, NULL, 10); } if (uyoutube->query.value_next) { // append "&signature=xxxx" to url if (umitem->data.string) { temp = ug_strdup_printf("%s" "&signature=%s", umitem->url, umitem->data.string); umitem->url = temp; umitem->data.string = NULL; } field = uyoutube->query.value_next; umitem = NULL; } else field = uyoutube->query.field_next; } } // ---------------------------------------------------------------------------- // method 1 // https://www.youtube.com/get_video_info?video_id=xxxxxxxxxxx // https://www.youtube.com/get_video_info?video_id=xxxxxxxxxxx&el=vevo&el=embedded&asv=3&sts=15902 static void uget_youtube_parse_query(UgetYouTube* uyoutube, UgetMedia* umedia) { if (ug_uri_query_part(&uyoutube->query, uyoutube->buffer.beg) == 0) return; // debug // printf("%.*s\n", uyoutube->query.field_len, uyoutube->buffer.beg); if (uyoutube->query.field_len == 26 && strncmp(uyoutube->buffer.beg, "url_encoded_fmt_stream_map", 26) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); uget_youtube_parse_map(uyoutube, umedia, uyoutube->query.value); } else if (uyoutube->query.field_len == 13 && strncmp(uyoutube->buffer.beg, "adaptive_fmts", 13) == 0) { ug_decode_uri(uyoutube->query.value, uyoutube->query.value_len, uyoutube->query.value); uget_youtube_parse_adaptive_fmts(uyoutube, umedia, uyoutube->query.value); } else if (uyoutube->query.field_len == 5 && strncmp(uyoutube->buffer.beg, "title", 5) == 0) { umedia->title = ug_strndup(uyoutube->query.value, uyoutube->query.value_len); ug_decode_uri(umedia->title, uyoutube->query.value_len, umedia->title); } else if (uyoutube->query.field_len == 6 && strncmp(uyoutube->buffer.beg, "reason", 6) == 0) { uyoutube->reason = ug_strndup(uyoutube->query.value, uyoutube->query.value_len); ug_decode_uri(uyoutube->reason, uyoutube->query.value_len, uyoutube->reason); } else if (uyoutube->query.field_len == 6 && strncmp(uyoutube->buffer.beg, "status", 6) == 0) { uyoutube->status = ug_strndup(uyoutube->query.value, uyoutube->query.value_len); ug_decode_uri(uyoutube->status, uyoutube->query.value_len, uyoutube->status); } else if (uyoutube->query.field_len == 9 && strncmp(uyoutube->buffer.beg, "errorcode", 9) == 0) { uyoutube->error_code = strtol(uyoutube->query.value, NULL, 10); } } static size_t curl_output_youtube(char* beg, size_t size, size_t nmemb, void* data) { UgetMedia* umedia = data; UgBuffer* buffer = &((UgetYouTube*)umedia->data)->buffer; char* end; char* cur; size *= nmemb; end = beg + size; for (cur = beg; cur < end; cur++) { if (cur[0] == '&') { ug_buffer_write_data(buffer, beg, cur - beg); ug_buffer_write_char(buffer, 0); uget_youtube_parse_query(umedia->data, umedia); // next field buffer->cur = buffer->beg; beg = cur + 1; // + '&' continue; } } if (cur == end) ug_buffer_write_data(buffer, beg, cur - beg); return size; } int uget_media_grab_youtube_method_1(UgetMedia* umedia, UgetProxy* proxy) { CURL* curl; CURLcode code; UgetYouTube* uyoutube; char* string; int retry = FALSE; uyoutube = umedia->data; string = ug_strdup_printf( "https://www.youtube.com/get_video_info?video_id=%s", uyoutube->video_id); curl = curl_easy_init(); if (proxy) ug_curl_set_proxy(curl, proxy); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_output_youtube); curl_easy_setopt(curl, CURLOPT_WRITEDATA, umedia); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); do { curl_easy_setopt(curl, CURLOPT_URL, string); code = curl_easy_perform(curl); ug_free(string); string = NULL; switch (code) { case CURLE_OK: if (uyoutube->buffer.beg != uyoutube->buffer.cur) { ug_buffer_write_char(&uyoutube->buffer, 0); uget_youtube_parse_query(umedia->data, umedia); } if (uyoutube->error_code == 100) { umedia->event = uget_event_new_error( UGET_EVENT_ERROR_CUSTOM, _("This video has been removed.")); goto break_do_loop; } break; case CURLE_OUT_OF_MEMORY: umedia->event = uget_event_new_error( UGET_EVENT_ERROR_OUT_OF_RESOURCE, NULL); goto break_do_loop; default: umedia->event = uget_event_new_error( UGET_EVENT_ERROR_CUSTOM, _("Error occurred during getting video info.")); goto break_do_loop; } #if 0 if (retry == TRUE) { retry = FALSE; // decrypt_signature } else if (uyoutube->status && strcmp(uyoutube->status, "ok") != 0) { if (uyoutube->reason && strstr(uyoutube->reason, "VEVO") == NULL) break; retry = TRUE; // reset data if we need retry ug_buffer_restart(&uyoutube->buffer); ug_free(uyoutube->reason); uyoutube->reason = NULL; ug_free(uyoutube->status); uyoutube->status = NULL; string = ug_strdup_printf( "https://www.youtube.com/get_video_info?video_id=%s&el=vevo&el=embedded&asv=3&sts=15902", uyoutube->video_id); } #endif } while (retry == TRUE); break_do_loop: curl_easy_cleanup(curl); return umedia->size; } // ---------------------------------------------------------------------------- // method 2 // get HTML and parse it // ------------------------------------ // JSON parser static UgJsonError ug_json_parse_assets_js(UgJson* json, const char* name, const char* value, void* umedia, void* data) { UgetYouTube* uyoutube; uyoutube = ((UgetMedia*)umedia)->data; uyoutube->js = ug_strdup(value); return UG_JSON_ERROR_NONE; } static UgJsonError ug_json_parse_args_map(UgJson* json, const char* name, const char* value, void* umedia, void* data) { UgetYouTube* uyoutube; uyoutube = ((UgetMedia*)umedia)->data; uget_youtube_parse_map(uyoutube, (void*) umedia, value); return UG_JSON_ERROR_NONE; } static UgJsonError ug_json_parse_args_adaptive_fmts(UgJson* json, const char* name, const char* value, void* umedia, void* data) { UgetYouTube* uyoutube; uyoutube = ((UgetMedia*)umedia)->data; uget_youtube_parse_adaptive_fmts(uyoutube, (void*) umedia, value); return UG_JSON_ERROR_NONE; } static const UgEntry youtube_assets_entry[] = { {"js", 0, UG_ENTRY_CUSTOM, ug_json_parse_assets_js, NULL}, {NULL} // null-terminated }; static const UgEntry youtube_args_entry[] = { {"title", offsetof(UgetMedia, title), UG_ENTRY_STRING, NULL, NULL}, {"url_encoded_fmt_stream_map", 0, UG_ENTRY_CUSTOM, ug_json_parse_args_map, NULL}, {"adaptive_fmts", 0, UG_ENTRY_CUSTOM, ug_json_parse_args_adaptive_fmts, NULL}, {NULL} // null-terminated }; static const UgEntry youtube_config_entry[] = { {"assets", 0, UG_ENTRY_OBJECT, (void*) youtube_assets_entry, NULL}, {"args", 0, UG_ENTRY_OBJECT, (void*) youtube_args_entry, NULL}, {NULL} // null-terminated }; // ------------------------------------ // HTML parser static const UgHtmlParser youtube_html_parser; static const UgHtmlParser youtube_script_parser; static void youtube_start_element(UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { if (strcmp(element_name, "script") == 0) ug_html_push(uhtml, &youtube_script_parser, dest, data); } static void youtube_end_element(UgHtml* uhtml, const char* element_name, void* dest, void* data) { if (strcmp(element_name, "script") == 0) ug_html_pop(uhtml); } static void youtube_script_text(UgHtml* uhtml, const char* text, int text_len, UgetMedia* umedia, UgetYouTube* uyoutube) { UgJson* json; char* cur; int cur_len; int diff; // if (strncmp("var ytplayer", text, 12) != 0) // return; for (cur = (char*)text, cur_len = text_len; ; ) { cur = memchr(cur, 'y', cur_len); if (cur == NULL) return; cur_len = text_len - (cur - text); if (cur_len < 15) // strlen("ytplayer.config") return; diff = memcmp(cur, "ytplayer.config", 15); cur++; cur_len--; if (diff != 0) continue; cur = memchr(cur, '=', cur_len); if (cur == NULL) return; cur_len = text_len - (cur - text); cur = memchr(cur, '{', cur_len); if (cur == NULL) return; break; } json = &uyoutube->json; ug_json_begin_parse(json); ug_json_push(json, ug_json_parse_entry, umedia, (void*) youtube_config_entry); ug_json_push(json, ug_json_parse_object, NULL, NULL); ug_json_parse(json, cur, text_len - (cur - text)); ug_json_end_parse(json); } static const UgHtmlParser youtube_script_parser = { NULL, (UgHtmlParserEndElementFunc) youtube_end_element, (UgHtmlParserTextFunc) youtube_script_text }; static const UgHtmlParser youtube_html_parser = { youtube_start_element, NULL, NULL }; // ------------------------------------ // curl static size_t curl_output_youtube_html(char* text, size_t size, size_t nmemb, void* data) { UgetMedia* umedia; UgHtml* uhtml; umedia = data; uhtml = &((UgetYouTube*)umedia->data)->html; size *= nmemb; ug_html_parse(uhtml, text, size); return size; } int uget_media_grab_youtube_method_2(UgetMedia* umedia, UgetProxy* proxy) { CURL* curl; CURLcode code; UgetYouTube* uyoutube; char* string; ug_free(umedia->title); umedia->title = NULL; uyoutube = umedia->data; // create URL string string = ug_strdup_printf("https://www.youtube.com/watch?v=%s", uyoutube->video_id); // setup option curl = curl_easy_init(); if (proxy) ug_curl_set_proxy(curl, proxy); curl_easy_setopt(curl, CURLOPT_URL, string); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_output_youtube_html); curl_easy_setopt(curl, CURLOPT_WRITEDATA, umedia); // run & parse ug_html_begin_parse(&uyoutube->html); ug_html_push(&uyoutube->html, &youtube_html_parser, umedia, uyoutube); code = curl_easy_perform(curl); ug_html_end_parse(&uyoutube->html); // free URL string ug_free(string); switch (code) { case CURLE_OK: // player URL if (uyoutube->js && strncmp(uyoutube->js, "//", 2) == 0) { string = ug_malloc(strlen(uyoutube->js) + 6 + 1); // "https:" + '\0' string[0] = 0; strcat(string, "https:"); strcat(string, uyoutube->js); ug_free(uyoutube->js); uyoutube->js = string; } break; case CURLE_OUT_OF_MEMORY: umedia->event = uget_event_new_error( UGET_EVENT_ERROR_OUT_OF_RESOURCE, NULL); break; default: umedia->event = uget_event_new_error( UGET_EVENT_ERROR_CUSTOM, _("Error occurred during getting video web page.")); break; } curl_easy_cleanup(curl); return umedia->size; } // ---------------------------------------------------------------------------- // UgetMedia functions int uget_media_is_youtube(UgUri* uuri) { int length; const char* string; // youtube.com // https://youtube.com/watch?=xxxxxxxxxxx // https://youtu.be/xxxxxxxxxxx length = ug_uri_host(uuri, &string); if (length >= 11 && strncmp(string + length - 11, "youtube.com", 11) == 0) { if (strncmp(uuri->uri + uuri->file , "watch?", 6) == 0) return TRUE; } else if (length >= 8 && strncmp(string + length - 8, "youtu.be", 8) == 0) { if (uuri->file != -1) return TRUE; } return FALSE; } int uget_media_grab_youtube_method_1(UgetMedia* umedia, UgetProxy* proxy); int uget_media_grab_youtube_method_2(UgetMedia* umedia, UgetProxy* proxy); static void erase_duplicate(UgetMedia* umedia) { UgList list; UgetMediaItem* cur; UgetMediaItem* cur_next; UgetMediaItem* matched; UgetMediaItem* matched_next; ug_list_init(&list); // grab media from YouTube's 'url_encoded_fmt_stream_map' for (cur = umedia->head; cur; cur = cur_next) { cur_next = cur->next; if (cur->order == 1) { // move items to list ug_list_remove((UgList*) umedia, (UgLink*) cur); ug_list_append(&list, (UgLink*) cur); } } // preserve media from YouTube's 'url_encoded_fmt_stream_map' for (cur = (UgetMediaItem*)list.head; cur; cur = cur_next) { cur_next = cur->next; matched = uget_media_match(umedia, UGET_MEDIA_MATCH_2, cur->quality, cur->type); for (; matched; matched = matched_next) { matched_next = matched->next; ug_list_remove((UgList*) umedia, (UgLink*) matched); uget_media_item_free(matched); } ug_list_remove(&list, (UgLink*) cur); ug_list_prepend((UgList*) umedia, (UgLink*) cur); } ug_list_clear(&list, FALSE); } int uget_media_grab_youtube(UgetMedia* umedia, UgetProxy* proxy) { int n; char* string; char* video_id_str; int video_id_len; UgUriQuery* query; UgetYouTube* uyoutube; ug_uri_init(&umedia->uuri, umedia->url); query = &umedia->uquery; video_id_str = NULL; video_id_len = 0; // get youtube video_id if (umedia->uuri.query != -1) { // https://www.youtube.com/watch?v=xxxxxxxxxxx string = umedia->url + umedia->uuri.query; while (ug_uri_query_part(query, string)) { if (strncmp("v", string, query->field_len) == 0 && query->value) { video_id_str = query->value; video_id_len = query->value_len; break; } string = query->field_next; } } else { // http://youtu.be/xxxxxxxxxxx video_id_len = ug_uri_file(&umedia->uuri, (const char**)&video_id_str); } if (video_id_str == NULL || video_id_len == 0) { umedia->event = uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, _("No video_id found in URL of YouTube.")); return 0; } uyoutube = uget_youtube_new(); uyoutube->video_id = ug_strndup(video_id_str, video_id_len); umedia->data = uyoutube; n = uget_media_grab_youtube_method_1(umedia, proxy); if (n == 0 && uyoutube->error_code != 100) { ug_free(umedia->title); umedia->title = NULL; if (umedia->event) { uget_event_free(umedia->event); umedia->event = NULL; } n = uget_media_grab_youtube_method_2(umedia, proxy); } uget_youtube_free(uyoutube); erase_duplicate(umedia); umedia->data = NULL; return n; } uget-2.2.2/uget/UgetNode.c0000664000175000017500000003722513470304402012234 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #ifdef HAVE_GLIB #include // g_slice_xxx #endif static void uget_node_call_fake_filter (UgetNode* parent, UgetNode* sibling, UgetNode* child); static UgJsonError ug_json_parse_state2group (UgJson* json, const char* name, const char* value, void* node, void* none); static UgJsonError ug_json_parse_name2data (UgJson* json, const char* name, const char* value, void* node, void* none); // ---------------------------------------------------------------------------- // UgetNode struct UgetNodeNotifier uget_node_default_notifier = { NULL, // UgetNodeFunc inserted; NULL, // UgetNodeFunc removed; NULL, // UgNotifyFunc updated; NULL, // void* data; // extra data for user }; struct UgetNodeControl uget_node_default_control = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; NULL, // UgetNodeFunc filter; }; const UgEntry UgetNodeEntry[] = { {"info", offsetof (UgetNode, info), UG_ENTRY_CUSTOM, ug_json_parse_info_ptr, ug_json_write_info_ptr}, {"children", 0, UG_ENTRY_ARRAY, ug_json_parse_uget_node_children, ug_json_write_uget_node_children}, // deprecated {"name", 0, UG_ENTRY_CUSTOM, ug_json_parse_name2data, NULL}, {"state", 0, UG_ENTRY_CUSTOM, ug_json_parse_state2group, NULL}, {"data", offsetof (UgetNode, info), UG_ENTRY_CUSTOM, ug_json_parse_info_ptr, NULL}, {NULL} // null-terminated }; UgetNode* uget_node_new (UgetNode* node_real) { UgetNode* node; #ifdef HAVE_GLIB node = g_slice_alloc (sizeof (UgetNode)); #else node = ug_malloc (sizeof (UgetNode)); #endif // HAVE_GLIB uget_node_init (node, node_real); return node; } void uget_node_free(UgetNode* node) { uget_node_final(node); #ifdef HAVE_GLIB g_slice_free1(sizeof(UgetNode), node); #else ug_free(node); #endif // HAVE_GLIB } void uget_node_init (UgetNode* node, UgetNode* node_real) { memset (node, 0, sizeof (UgetNode)); node->control = &uget_node_default_control; if (node_real == NULL) { node->base = node; // pointer to self node->info = ug_info_new(8, 2); node->info->at[0].key = (void*) UgetRelationInfo; node->info->at[1].key = (void*) UgetProgressInfo; } else { // this is a fake node. // node->group = 0; node->base = node_real->base; node->real = node_real; node->peer = node_real->fake; node_real->fake = node; node->info = node_real->info; ug_info_ref(node->info); } } void uget_node_final(UgetNode* node) { if (node->parent) uget_node_remove(node->parent, node); if (node->real) uget_node_remove_fake(node->real, node); uget_node_clear_fake(node); uget_node_clear_children(node); // ug_node_unlink((UgNode*)node); ug_info_unref(node->info); } void uget_node_clear_children (UgetNode* node) { UgetNode* next; UgetNode* children; for (children = node->children; children; children = next) { next = children->next; uget_node_free(children); } node->children = NULL; } void uget_node_clear_fake (UgetNode* node) { UgetNode* peer; UgetNode* fake; for (fake = node->fake; fake; fake = peer) { peer = fake->peer; fake->real = NULL; // speed up uget_node_free() uget_node_free(fake); } node->fake = NULL; // speed up uget_node_free() } void uget_node_move (UgetNode* node, UgetNode* sibling, UgetNode* child) { UgetNode* fake_sibling; UgetNode* fake_child; ug_node_remove ((UgNode*) node, (UgNode*) child); ug_node_insert ((UgNode*) node, (UgNode*) sibling, (UgNode*) child); fake_sibling = NULL; for (fake_child = child->fake; fake_child; fake_child = fake_child->peer) { node = fake_child->parent; if (node == NULL) continue; if (sibling) { for (fake_sibling = sibling->fake; fake_sibling; fake_sibling = fake_sibling->peer) { if (fake_sibling->parent == node) break; } if (fake_sibling == NULL) continue; } uget_node_move (node, fake_sibling, fake_child); } } void uget_node_insert (UgetNode* node, UgetNode* sibling, UgetNode* child) { UgetNodeFunc inserted; ug_node_insert ((UgNode*) node, (UgNode*) sibling, (UgNode*) child); child->control = node->control; // child->control = node->control->children; inserted = node->control->notifier->inserted; if (inserted) inserted (node, sibling, child); uget_node_call_fake_filter (node, sibling, child); } static void uget_node_unlink_children_real (UgetNode* node) { for (node = node->children; node; node = node->next) { uget_node_unlink_children_real (node); if (node->real) uget_node_remove_fake (node->real, node); } } static void uget_node_unlink_fake_parent (UgetNode* child) { UgetNode* parent; UgetNode* sibling; UgetNodeFunc removed; for (child = child->fake; child; child = child->peer) { uget_node_unlink_fake_parent (child); parent = child->parent; if (parent == NULL) continue; sibling = child->next; ug_node_remove ((UgNode*) parent, (UgNode*) child); // notify removed = parent->control->notifier->removed; if (removed) removed (parent, sibling, child); } } void uget_node_remove (UgetNode* node, UgetNode* child) { UgetNode* sibling; UgetNodeFunc removed; sibling = child->next; ug_node_remove ((UgNode*)node, (UgNode*)child); uget_node_unlink_fake_parent (child); uget_node_unlink_children_real (child); removed = node->control->notifier->removed; if (removed) removed (node, sibling, child); } void uget_node_append (UgetNode* node, UgetNode* child) { UgetNodeFunc inserted; ug_node_append ((UgNode*) node, (UgNode*) child); child->control = node->control; // child->control = node->control->children; inserted = node->control->notifier->inserted; if (inserted) inserted (node, NULL, child); uget_node_call_fake_filter (node, NULL, child); } void uget_node_prepend (UgetNode* node, UgetNode* child) { UgetNode* sibling; UgetNodeFunc inserted; sibling = node->children; ug_node_prepend ((UgNode*) node, (UgNode*) child); child->control = node->control; // child->control = node->control->children; inserted = node->control->notifier->inserted; if (inserted) inserted (node, sibling, child); uget_node_call_fake_filter (node, sibling, child); } // used by uget_node_sort() static void uget_node_qsort(UgetNode** array, int left, int right, UgCompareFunc compare) { UgetNode* temp; UgetNode* pivot = array[(left + right) / 2]; int i = left, j = right; /* partition */ while (i <= j) { while (compare(array[i], pivot) < 0) i++; while (compare(array[j], pivot) > 0) j--; if (i <= j) { temp = array[i]; array[i] = array[j]; array[j] = temp; i++; j--; } }; /* recursion */ if (left < j) uget_node_qsort(array, left, j, compare); if (i < right) uget_node_qsort(array, i, right, compare); } void uget_node_sort(UgetNode* node, UgCompareFunc compare, int reversed) { int index; UgetNode** array; UgetNode* cur; if (node->n_children == 0) return; array = (UgetNode**) ug_malloc(sizeof(UgetNode*) * node->n_children); for (index = 0, cur = node->children; cur; cur = cur->next, index++) array[index] = cur; uget_node_qsort(array, 0, node->n_children -1, compare); if (reversed) { for (index = node->n_children-1; index >=0; index--) { uget_node_remove(node, array[index]); uget_node_append(node, array[index]); } } else { for (index = 0; index < node->n_children; index++) { uget_node_remove(node, array[index]); uget_node_append(node, array[index]); } } ug_free(array); } /* void uget_node_sort (UgetNode* node, UgCompareFunc compare, int reversed) { UgetNode* beg; UgetNode* cur; UgetNode* unsorted; for (beg = node->children; beg; beg = unsorted->next) { unsorted = beg; if (reversed == FALSE) { for (cur = beg->next; cur; cur = cur->next) { if (compare (cur, unsorted) < 0) unsorted = cur; } } else { for (cur = beg->next; cur; cur = cur->next) { if (compare (unsorted, cur) < 0) unsorted = cur; } } if (unsorted != beg) uget_node_move (node, beg, unsorted); } } */ void uget_node_insert_sorted (UgetNode* node, UgetNode* child) { UgCompareFunc compare; UgetNode* cur; int reverse; compare = node->control->sort.compare; reverse = node->control->sort.reverse; if (compare == NULL) return; if (reverse == FALSE) { for (cur = node->children; cur; cur = cur->next) { if (compare (cur, child) > 0) { uget_node_insert (node, cur, child); return; } } } else { for (cur = node->children; cur; cur = cur->next) { if (compare (child, cur) > 0) { uget_node_insert (node, cur, child); return; } } } uget_node_insert (node, NULL, child); } void uget_node_reorder_by_real (UgetNode* node, UgetNode* real) { UgetNode* sibling; UgetNode* fake; sibling = node->children; if (real == NULL) real = node->real; if (real == NULL) return; for (real = real->children; real; real = real->next) { for (fake = real->fake; fake; fake = fake->peer) { if (fake->parent != node) continue; if (fake == sibling) { sibling = sibling->next; break; } ug_node_remove ((UgNode*) node, (UgNode*) fake); ug_node_insert ((UgNode*) node, (UgNode*) sibling, (UgNode*) fake); break; } } } void uget_node_reorder_by_fake (UgetNode* node, UgetNode* fake) { UgetNode* sibling; UgetNode* real; if (fake == NULL || fake->children == NULL) return; sibling = fake->children->real; for (fake = fake->children; fake; fake = fake->next) { real = fake->real; if (real == NULL || real->parent != node) continue; if (real == sibling) sibling = sibling->next; ug_node_remove ((UgNode*) node, (UgNode*) real); ug_node_insert ((UgNode*) node, (UgNode*) sibling, (UgNode*) real); } } void uget_node_remove_fake (UgetNode* node, UgetNode* fake) { UgetNode* curr; UgetNode* prev; for (prev = NULL, curr = node->fake; curr; curr = curr->peer) { if (curr == fake) { if (prev) prev->peer = curr->peer; else node->fake = curr->peer; curr->real = NULL; curr->peer = NULL; return; } prev = curr; } } void uget_node_make_fake (UgetNode* node) { UgetNode* child; // UgetNode* sibling; if (node->fake == NULL) return; for (child = node->children; child; child = child->next) { uget_node_call_fake_filter (node, NULL, child); uget_node_make_fake (child); } } // fake filter node from real. // If real node inserted a child node, all fake nodes call this to filter. static void uget_node_call_fake_filter (UgetNode* parent, UgetNode* sibling, UgetNode* child) { UgetNode* fake; UgetNodeFunc filter; for (fake = parent->fake; fake; fake = fake->peer) { filter = fake->control->filter; if (filter) filter (fake, sibling, child); } } // ---------------------------------------------------------------------------- // position UgetNode* uget_node_nth_fake (UgetNode* node, int nth) { UgetNode* fake; for (fake = node->fake; fake; fake = fake->peer, nth--) { if (nth == 0) return fake; } return NULL; } int uget_node_fake_position (UgetNode* node, UgetNode* fake) { int position = 0; for (node = node->fake; node; node = node->peer, position++) { if (node == fake) return position; } return -1; } // ---------------------------------------------------------------------------- // notify void uget_node_updated (UgetNode* node) { UgNotifyFunc updated; updated = node->control->notifier->updated; if (updated) updated (node); // update fake node for (node = node->fake; node; node = node->peer) uget_node_updated (node); } // ---------------------------------------------------------------------------- // JSON UgJsonError ug_json_parse_uget_node_children (UgJson* json, const char* name, const char* value, void* node, void* none) { UgetNode* temp; if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } temp = uget_node_new (NULL); uget_node_append (node, temp); ug_json_push (json, ug_json_parse_entry, temp, (void*)UgetNodeEntry); return UG_JSON_ERROR_NONE; } void ug_json_write_uget_node_children (UgJson* json, const UgetNode* node) { for (node = node->children; node; node = node->next) { ug_json_write_object_head (json); ug_json_write_entry (json, (void*) node, UgetNodeEntry); ug_json_write_object_tail (json); } } // convert old format to new static UgJsonError ug_json_parse_name2data (UgJson* json, const char* name, const char* value, void* nodev, void* none) { UgetNode* node = nodev; union { UgetCommon* common; UgetFiles* files; } temp; if (json->type != UG_JSON_STRING) return UG_JSON_ERROR_TYPE_NOT_MATCH; // Now root node is category node if (node->parent == NULL || node->parent->parent == NULL) { // category or download node temp.common = ug_info_realloc(node->info, UgetCommonInfo); temp.common->name = ug_strdup(value); } else if (node->parent->parent->parent == NULL) { // file node temp.files = ug_info_realloc(node->parent->info, UgetFilesInfo); uget_files_realloc(temp.files, value); } return UG_JSON_ERROR_NONE; } // convert old format to new static UgJsonError ug_json_parse_state2group (UgJson* json, const char* name, const char* value, void* nodev, void* none) { UgetRelation* relation; UgetNode* node = nodev; int group; if (json->type != UG_JSON_NUMBER) return UG_JSON_ERROR_TYPE_NOT_MATCH; else { group = strtol(value, NULL, 10); if (group != 0) { relation = ug_info_realloc(node->info, UgetRelationInfo); relation->group = group; } } return UG_JSON_ERROR_NONE; } uget-2.2.2/uget/UgetAria2.h0000664000175000017500000001053013470304402012300 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_ARIA2_H #define UGET_ARIA2_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetAria2 UgetAria2; typedef struct UgetAria2Thread UgetAria2Thread; typedef enum { UGET_ARIA2_ERROR_NONE, UGET_ARIA2_ERROR_RPC, UGET_ARIA2_ERROR_LAUNCH, } UGET_ARIA2_ERROR; struct UgetAria2 { int ref_count; UgMutex mutex; UgetAria2Thread* thread; // request -> global thread -> requested + responsed // // requested + responsed -+-> reuse // | | // | V // +-> recycled // // JSON objects(UgJsonrpcObject) pair UgJsonrpcArray queuing; UgJsonrpcArray recycled; // completed UgSLinks requested; UgSLinks responsed; UgMutex completed_mutex; int completed_changed; // common data for status request UgValue status_keys; unsigned int error; unsigned int batch_len; unsigned int batch_additional; unsigned int polling_interval; // boolean uint8_t connect_fail:1; uint8_t speed_required:1; uint8_t limit_required:1; uint8_t launched:1; uint8_t shutdown:1; uint8_t uri_changed:1; uint8_t uri_remote:1; char* uri; char* path; char* args; char* token; // --rpc-secret= struct { int download; int upload; } speed, limit; // speed limit counter int limit_count_prev; int limit_count; }; UgetAria2* uget_aria2_new (void); void uget_aria2_ref (UgetAria2* ua2); void uget_aria2_unref (UgetAria2* ua2); void uget_aria2_start_thread (UgetAria2* uaria2); void uget_aria2_stop_thread (UgetAria2* uaria2); void uget_aria2_set_uri (UgetAria2* uaria2, const char* uri); void uget_aria2_set_path (UgetAria2* uaria2, const char* path); void uget_aria2_set_args (UgetAria2* uaria2, const char* args); void uget_aria2_set_token (UgetAria2* uaria2, const char* token); void uget_aria2_set_speed (UgetAria2* uaria2, int dl_speed, int ul_speed); int uget_aria2_launch (UgetAria2* aria2); void uget_aria2_shutdown (UgetAria2* aria2); // If you want to get response, set request->id.type = UG_VALUE_INT // If you don't need response, set request->id.type = UG_VALUE_NONE UgJsonrpcObject* uget_aria2_alloc (UgetAria2* aria2, int is_request, int has_response); void uget_aria2_request (UgetAria2* aria2, UgJsonrpcObject* request); UgJsonrpcObject* uget_aria2_respond (UgetAria2* aria2, UgJsonrpcObject* request); void uget_aria2_recycle (UgetAria2* aria2, UgJsonrpcObject* jobject); UgValue* uget_aria2_clear_token (UgJsonrpcObject* jobject); #ifdef __cplusplus } #endif // __cplusplus #endif // End of UGET_ARIA2_H uget-2.2.2/uget/UgetPluginAria2.h0000664000175000017500000001203713470304402013463 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_ARIA2_H #define UGET_PLUGIN_ARIA2_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginAria2 UgetPluginAria2; typedef struct UgetPluginAria2Setting UgetPluginAria2Setting; extern const UgetPluginInfo* UgetPluginAria2Info; typedef enum { UGET_PLUGIN_ARIA2_GLOBAL = UGET_PLUGIN_GLOBAL_DERIVED, UGET_PLUGIN_ARIA2_GLOBAL_URI, // set parameter = (char* ) // UGET_PLUGIN_ARIA2_GLOBAL_LOCAL, // set parameter = (intptr_t) UGET_PLUGIN_ARIA2_GLOBAL_PATH, // set parameter = (char* ) UGET_PLUGIN_ARIA2_GLOBAL_ARGUMENT, // set parameter = (char* ) UGET_PLUGIN_ARIA2_GLOBAL_TOKEN, // set parameter = (char* ) UGET_PLUGIN_ARIA2_GLOBAL_LAUNCH, // get/set parameter = (intptr_t) UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN, // set parameter = (intptr_t) UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN_NOW, // set parameter = (intptr_t) } UgetPluginAria2GlobalCode; typedef enum { UGET_PLUGIN_ARIA2_ERROR_NONE, UGET_PLUGIN_ARIA2_ERROR_RPC, UGET_PLUGIN_ARIA2_ERROR_LAUNCH, } UgetPluginAria2Error; /* ---------------------------------------------------------------------------- UgetPluginAria2: aria2 plug-in that derived from UgetPlugin. UgType | `--- UgetPlugin | `--- UgetPluginAria2 */ struct UgetPluginAria2 { UGET_PLUGIN_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; */ // aria2.addUri, aria2.addTorrent, aria2.addMetalink UgJsonrpcObject* start_request; time_t start_time; UgUri uri_part; int uri_type; unsigned int retry_delay; // all gids and it's files UgArrayStr gids; UgetFiles* files; int files_per_gid; // aria2.tellStatus int status; int errorCode; int64_t totalLength; int64_t completedLength; int64_t uploadLength; int downloadSpeed; int uploadSpeed; // speed limit control // limit[0] = download speed limit // limit[1] = upload speed limit int limit[2]; int limit_upper[2]; uint8_t limit_changed:1; // speed limit changed by user or program // flags uint8_t synced:1; uint8_t paused:1; // paused by user or program uint8_t stopped:1; // download is stopped uint8_t restart:1; // for retry uint8_t named:1; }; // ---------------------------------------------------------------------------- struct UgetPluginAria2Setting { uint8_t launch; uint8_t shutdown; // millisecond interval between aria2.tellStatus() int polling_interval; char* uri; char* path; char* arguments; }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const PluginInfo* const PluginAria2Info = (PluginInfo*) UgetPluginAria2Info; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginAria2Method : PluginMethod {}; // This one is for directly use only. You can NOT derived it. struct PluginAria2 : PluginAria2Method, UgetPluginAria2 { inline void* operator new(size_t size) { return uget_plugin_new(PluginAria2Info); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_ARIA2_H uget-2.2.2/uget/Makefile.in0000664000175000017500000023312713470304626012432 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : @WITH_LIBPWMD_TRUE@am__append_1 = @LIBPWMD_CFLAGS@ @WITH_LIBPWMD_TRUE@am__append_2 = pwmd.c @WITH_LIBPWMD_TRUE@am__append_3 = pwmd.h subdir = uget ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__noinst_HEADERS_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libuget_a_AR = $(AR) $(ARFLAGS) libuget_a_LIBADD = am__libuget_a_SOURCES_DIST = UgetSequence.c UgetRss.c UgetRpc.c \ UgetOption.c UgetData.c UgetFiles.c UgetNode.c \ UgetNode-compare.c UgetNode-filter.c UgetTask.c UgetHash.c \ UgetSite.c UgetApp.c UgetEvent.c UgetPlugin.c UgetA2cf.c \ UgetCurl.c UgetAria2.c UgetMedia.c UgetMedia-youtube.c \ UgetPluginCurl.c UgetPluginAria2.c UgetPluginMedia.c \ UgetPluginAgent.c UgetPluginMega.c UgetPluginEmpty.c pwmd.c @WITH_LIBPWMD_TRUE@am__objects_1 = libuget_a-pwmd.$(OBJEXT) am_libuget_a_OBJECTS = libuget_a-UgetSequence.$(OBJEXT) \ libuget_a-UgetRss.$(OBJEXT) libuget_a-UgetRpc.$(OBJEXT) \ libuget_a-UgetOption.$(OBJEXT) libuget_a-UgetData.$(OBJEXT) \ libuget_a-UgetFiles.$(OBJEXT) libuget_a-UgetNode.$(OBJEXT) \ libuget_a-UgetNode-compare.$(OBJEXT) \ libuget_a-UgetNode-filter.$(OBJEXT) \ libuget_a-UgetTask.$(OBJEXT) libuget_a-UgetHash.$(OBJEXT) \ libuget_a-UgetSite.$(OBJEXT) libuget_a-UgetApp.$(OBJEXT) \ libuget_a-UgetEvent.$(OBJEXT) libuget_a-UgetPlugin.$(OBJEXT) \ libuget_a-UgetA2cf.$(OBJEXT) libuget_a-UgetCurl.$(OBJEXT) \ libuget_a-UgetAria2.$(OBJEXT) libuget_a-UgetMedia.$(OBJEXT) \ libuget_a-UgetMedia-youtube.$(OBJEXT) \ libuget_a-UgetPluginCurl.$(OBJEXT) \ libuget_a-UgetPluginAria2.$(OBJEXT) \ libuget_a-UgetPluginMedia.$(OBJEXT) \ libuget_a-UgetPluginAgent.$(OBJEXT) \ libuget_a-UgetPluginMega.$(OBJEXT) \ libuget_a-UgetPluginEmpty.$(OBJEXT) $(am__objects_1) libuget_a_OBJECTS = $(am_libuget_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libuget_a-UgetA2cf.Po \ ./$(DEPDIR)/libuget_a-UgetApp.Po \ ./$(DEPDIR)/libuget_a-UgetAria2.Po \ ./$(DEPDIR)/libuget_a-UgetCurl.Po \ ./$(DEPDIR)/libuget_a-UgetData.Po \ ./$(DEPDIR)/libuget_a-UgetEvent.Po \ ./$(DEPDIR)/libuget_a-UgetFiles.Po \ ./$(DEPDIR)/libuget_a-UgetHash.Po \ ./$(DEPDIR)/libuget_a-UgetMedia-youtube.Po \ ./$(DEPDIR)/libuget_a-UgetMedia.Po \ ./$(DEPDIR)/libuget_a-UgetNode-compare.Po \ ./$(DEPDIR)/libuget_a-UgetNode-filter.Po \ ./$(DEPDIR)/libuget_a-UgetNode.Po \ ./$(DEPDIR)/libuget_a-UgetOption.Po \ ./$(DEPDIR)/libuget_a-UgetPlugin.Po \ ./$(DEPDIR)/libuget_a-UgetPluginAgent.Po \ ./$(DEPDIR)/libuget_a-UgetPluginAria2.Po \ ./$(DEPDIR)/libuget_a-UgetPluginCurl.Po \ ./$(DEPDIR)/libuget_a-UgetPluginEmpty.Po \ ./$(DEPDIR)/libuget_a-UgetPluginMedia.Po \ ./$(DEPDIR)/libuget_a-UgetPluginMega.Po \ ./$(DEPDIR)/libuget_a-UgetRpc.Po \ ./$(DEPDIR)/libuget_a-UgetRss.Po \ ./$(DEPDIR)/libuget_a-UgetSequence.Po \ ./$(DEPDIR)/libuget_a-UgetSite.Po \ ./$(DEPDIR)/libuget_a-UgetTask.Po \ ./$(DEPDIR)/libuget_a-pwmd.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libuget_a_SOURCES) DIST_SOURCES = $(am__libuget_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = UgetSequence.h UgetRss.h UgetRpc.h \ UgetOption.h UgetData.h UgetFiles.h UgetNode.h UgetTask.h \ UgetHash.h UgetSite.h UgetApp.h UgetEvent.h UgetPlugin.h \ UgetA2cf.h UgetCurl.h UgetAria2.h UgetMedia.h UgetPluginCurl.h \ UgetPluginAria2.h UgetPluginMedia.h UgetPluginAgent.h \ UgetPluginMega.h UgetPluginEmpty.h pwmd.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # lib_LIBRARIES = libuget.a noinst_LIBRARIES = libuget.a libuget_a_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget libuget_a_CFLAGS = @PTHREAD_CFLAGS@ @GLIB_CFLAGS@ $(am__append_1) libuget_a_SOURCES = UgetSequence.c UgetRss.c UgetRpc.c UgetOption.c \ UgetData.c UgetFiles.c UgetNode.c UgetNode-compare.c \ UgetNode-filter.c UgetTask.c UgetHash.c UgetSite.c UgetApp.c \ UgetEvent.c UgetPlugin.c UgetA2cf.c UgetCurl.c UgetAria2.c \ UgetMedia.c UgetMedia-youtube.c UgetPluginCurl.c \ UgetPluginAria2.c UgetPluginMedia.c UgetPluginAgent.c \ UgetPluginMega.c UgetPluginEmpty.c $(am__append_2) noinst_HEADERS = UgetSequence.h UgetRss.h UgetRpc.h UgetOption.h \ UgetData.h UgetFiles.h UgetNode.h UgetTask.h UgetHash.h \ UgetSite.h UgetApp.h UgetEvent.h UgetPlugin.h UgetA2cf.h \ UgetCurl.h UgetAria2.h UgetMedia.h UgetPluginCurl.h \ UgetPluginAria2.h UgetPluginMedia.h UgetPluginAgent.h \ UgetPluginMega.h UgetPluginEmpty.h $(am__append_3) EXTRA_DIST = \ Android.mk \ CMakeLists.txt all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu uget/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu uget/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libuget.a: $(libuget_a_OBJECTS) $(libuget_a_DEPENDENCIES) $(EXTRA_libuget_a_DEPENDENCIES) $(AM_V_at)-rm -f libuget.a $(AM_V_AR)$(libuget_a_AR) libuget.a $(libuget_a_OBJECTS) $(libuget_a_LIBADD) $(AM_V_at)$(RANLIB) libuget.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetA2cf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetApp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetAria2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetCurl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetData.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetEvent.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetFiles.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetHash.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetMedia-youtube.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetMedia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetNode-compare.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetNode-filter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetNode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetOption.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPlugin.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginAgent.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginAria2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginCurl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginEmpty.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginMedia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetPluginMega.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetRpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetRss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetSequence.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetSite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-UgetTask.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libuget_a-pwmd.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libuget_a-UgetSequence.o: UgetSequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetSequence.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetSequence.Tpo -c -o libuget_a-UgetSequence.o `test -f 'UgetSequence.c' || echo '$(srcdir)/'`UgetSequence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetSequence.Tpo $(DEPDIR)/libuget_a-UgetSequence.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetSequence.c' object='libuget_a-UgetSequence.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetSequence.o `test -f 'UgetSequence.c' || echo '$(srcdir)/'`UgetSequence.c libuget_a-UgetSequence.obj: UgetSequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetSequence.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetSequence.Tpo -c -o libuget_a-UgetSequence.obj `if test -f 'UgetSequence.c'; then $(CYGPATH_W) 'UgetSequence.c'; else $(CYGPATH_W) '$(srcdir)/UgetSequence.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetSequence.Tpo $(DEPDIR)/libuget_a-UgetSequence.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetSequence.c' object='libuget_a-UgetSequence.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetSequence.obj `if test -f 'UgetSequence.c'; then $(CYGPATH_W) 'UgetSequence.c'; else $(CYGPATH_W) '$(srcdir)/UgetSequence.c'; fi` libuget_a-UgetRss.o: UgetRss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetRss.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetRss.Tpo -c -o libuget_a-UgetRss.o `test -f 'UgetRss.c' || echo '$(srcdir)/'`UgetRss.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetRss.Tpo $(DEPDIR)/libuget_a-UgetRss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetRss.c' object='libuget_a-UgetRss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetRss.o `test -f 'UgetRss.c' || echo '$(srcdir)/'`UgetRss.c libuget_a-UgetRss.obj: UgetRss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetRss.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetRss.Tpo -c -o libuget_a-UgetRss.obj `if test -f 'UgetRss.c'; then $(CYGPATH_W) 'UgetRss.c'; else $(CYGPATH_W) '$(srcdir)/UgetRss.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetRss.Tpo $(DEPDIR)/libuget_a-UgetRss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetRss.c' object='libuget_a-UgetRss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetRss.obj `if test -f 'UgetRss.c'; then $(CYGPATH_W) 'UgetRss.c'; else $(CYGPATH_W) '$(srcdir)/UgetRss.c'; fi` libuget_a-UgetRpc.o: UgetRpc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetRpc.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetRpc.Tpo -c -o libuget_a-UgetRpc.o `test -f 'UgetRpc.c' || echo '$(srcdir)/'`UgetRpc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetRpc.Tpo $(DEPDIR)/libuget_a-UgetRpc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetRpc.c' object='libuget_a-UgetRpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetRpc.o `test -f 'UgetRpc.c' || echo '$(srcdir)/'`UgetRpc.c libuget_a-UgetRpc.obj: UgetRpc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetRpc.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetRpc.Tpo -c -o libuget_a-UgetRpc.obj `if test -f 'UgetRpc.c'; then $(CYGPATH_W) 'UgetRpc.c'; else $(CYGPATH_W) '$(srcdir)/UgetRpc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetRpc.Tpo $(DEPDIR)/libuget_a-UgetRpc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetRpc.c' object='libuget_a-UgetRpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetRpc.obj `if test -f 'UgetRpc.c'; then $(CYGPATH_W) 'UgetRpc.c'; else $(CYGPATH_W) '$(srcdir)/UgetRpc.c'; fi` libuget_a-UgetOption.o: UgetOption.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetOption.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetOption.Tpo -c -o libuget_a-UgetOption.o `test -f 'UgetOption.c' || echo '$(srcdir)/'`UgetOption.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetOption.Tpo $(DEPDIR)/libuget_a-UgetOption.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetOption.c' object='libuget_a-UgetOption.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetOption.o `test -f 'UgetOption.c' || echo '$(srcdir)/'`UgetOption.c libuget_a-UgetOption.obj: UgetOption.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetOption.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetOption.Tpo -c -o libuget_a-UgetOption.obj `if test -f 'UgetOption.c'; then $(CYGPATH_W) 'UgetOption.c'; else $(CYGPATH_W) '$(srcdir)/UgetOption.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetOption.Tpo $(DEPDIR)/libuget_a-UgetOption.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetOption.c' object='libuget_a-UgetOption.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetOption.obj `if test -f 'UgetOption.c'; then $(CYGPATH_W) 'UgetOption.c'; else $(CYGPATH_W) '$(srcdir)/UgetOption.c'; fi` libuget_a-UgetData.o: UgetData.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetData.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetData.Tpo -c -o libuget_a-UgetData.o `test -f 'UgetData.c' || echo '$(srcdir)/'`UgetData.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetData.Tpo $(DEPDIR)/libuget_a-UgetData.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetData.c' object='libuget_a-UgetData.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetData.o `test -f 'UgetData.c' || echo '$(srcdir)/'`UgetData.c libuget_a-UgetData.obj: UgetData.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetData.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetData.Tpo -c -o libuget_a-UgetData.obj `if test -f 'UgetData.c'; then $(CYGPATH_W) 'UgetData.c'; else $(CYGPATH_W) '$(srcdir)/UgetData.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetData.Tpo $(DEPDIR)/libuget_a-UgetData.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetData.c' object='libuget_a-UgetData.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetData.obj `if test -f 'UgetData.c'; then $(CYGPATH_W) 'UgetData.c'; else $(CYGPATH_W) '$(srcdir)/UgetData.c'; fi` libuget_a-UgetFiles.o: UgetFiles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetFiles.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetFiles.Tpo -c -o libuget_a-UgetFiles.o `test -f 'UgetFiles.c' || echo '$(srcdir)/'`UgetFiles.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetFiles.Tpo $(DEPDIR)/libuget_a-UgetFiles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetFiles.c' object='libuget_a-UgetFiles.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetFiles.o `test -f 'UgetFiles.c' || echo '$(srcdir)/'`UgetFiles.c libuget_a-UgetFiles.obj: UgetFiles.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetFiles.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetFiles.Tpo -c -o libuget_a-UgetFiles.obj `if test -f 'UgetFiles.c'; then $(CYGPATH_W) 'UgetFiles.c'; else $(CYGPATH_W) '$(srcdir)/UgetFiles.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetFiles.Tpo $(DEPDIR)/libuget_a-UgetFiles.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetFiles.c' object='libuget_a-UgetFiles.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetFiles.obj `if test -f 'UgetFiles.c'; then $(CYGPATH_W) 'UgetFiles.c'; else $(CYGPATH_W) '$(srcdir)/UgetFiles.c'; fi` libuget_a-UgetNode.o: UgetNode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode.Tpo -c -o libuget_a-UgetNode.o `test -f 'UgetNode.c' || echo '$(srcdir)/'`UgetNode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode.Tpo $(DEPDIR)/libuget_a-UgetNode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode.c' object='libuget_a-UgetNode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode.o `test -f 'UgetNode.c' || echo '$(srcdir)/'`UgetNode.c libuget_a-UgetNode.obj: UgetNode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode.Tpo -c -o libuget_a-UgetNode.obj `if test -f 'UgetNode.c'; then $(CYGPATH_W) 'UgetNode.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode.Tpo $(DEPDIR)/libuget_a-UgetNode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode.c' object='libuget_a-UgetNode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode.obj `if test -f 'UgetNode.c'; then $(CYGPATH_W) 'UgetNode.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode.c'; fi` libuget_a-UgetNode-compare.o: UgetNode-compare.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode-compare.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode-compare.Tpo -c -o libuget_a-UgetNode-compare.o `test -f 'UgetNode-compare.c' || echo '$(srcdir)/'`UgetNode-compare.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode-compare.Tpo $(DEPDIR)/libuget_a-UgetNode-compare.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode-compare.c' object='libuget_a-UgetNode-compare.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode-compare.o `test -f 'UgetNode-compare.c' || echo '$(srcdir)/'`UgetNode-compare.c libuget_a-UgetNode-compare.obj: UgetNode-compare.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode-compare.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode-compare.Tpo -c -o libuget_a-UgetNode-compare.obj `if test -f 'UgetNode-compare.c'; then $(CYGPATH_W) 'UgetNode-compare.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode-compare.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode-compare.Tpo $(DEPDIR)/libuget_a-UgetNode-compare.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode-compare.c' object='libuget_a-UgetNode-compare.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode-compare.obj `if test -f 'UgetNode-compare.c'; then $(CYGPATH_W) 'UgetNode-compare.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode-compare.c'; fi` libuget_a-UgetNode-filter.o: UgetNode-filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode-filter.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode-filter.Tpo -c -o libuget_a-UgetNode-filter.o `test -f 'UgetNode-filter.c' || echo '$(srcdir)/'`UgetNode-filter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode-filter.Tpo $(DEPDIR)/libuget_a-UgetNode-filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode-filter.c' object='libuget_a-UgetNode-filter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode-filter.o `test -f 'UgetNode-filter.c' || echo '$(srcdir)/'`UgetNode-filter.c libuget_a-UgetNode-filter.obj: UgetNode-filter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetNode-filter.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetNode-filter.Tpo -c -o libuget_a-UgetNode-filter.obj `if test -f 'UgetNode-filter.c'; then $(CYGPATH_W) 'UgetNode-filter.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode-filter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetNode-filter.Tpo $(DEPDIR)/libuget_a-UgetNode-filter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetNode-filter.c' object='libuget_a-UgetNode-filter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetNode-filter.obj `if test -f 'UgetNode-filter.c'; then $(CYGPATH_W) 'UgetNode-filter.c'; else $(CYGPATH_W) '$(srcdir)/UgetNode-filter.c'; fi` libuget_a-UgetTask.o: UgetTask.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetTask.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetTask.Tpo -c -o libuget_a-UgetTask.o `test -f 'UgetTask.c' || echo '$(srcdir)/'`UgetTask.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetTask.Tpo $(DEPDIR)/libuget_a-UgetTask.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetTask.c' object='libuget_a-UgetTask.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetTask.o `test -f 'UgetTask.c' || echo '$(srcdir)/'`UgetTask.c libuget_a-UgetTask.obj: UgetTask.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetTask.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetTask.Tpo -c -o libuget_a-UgetTask.obj `if test -f 'UgetTask.c'; then $(CYGPATH_W) 'UgetTask.c'; else $(CYGPATH_W) '$(srcdir)/UgetTask.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetTask.Tpo $(DEPDIR)/libuget_a-UgetTask.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetTask.c' object='libuget_a-UgetTask.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetTask.obj `if test -f 'UgetTask.c'; then $(CYGPATH_W) 'UgetTask.c'; else $(CYGPATH_W) '$(srcdir)/UgetTask.c'; fi` libuget_a-UgetHash.o: UgetHash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetHash.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetHash.Tpo -c -o libuget_a-UgetHash.o `test -f 'UgetHash.c' || echo '$(srcdir)/'`UgetHash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetHash.Tpo $(DEPDIR)/libuget_a-UgetHash.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetHash.c' object='libuget_a-UgetHash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetHash.o `test -f 'UgetHash.c' || echo '$(srcdir)/'`UgetHash.c libuget_a-UgetHash.obj: UgetHash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetHash.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetHash.Tpo -c -o libuget_a-UgetHash.obj `if test -f 'UgetHash.c'; then $(CYGPATH_W) 'UgetHash.c'; else $(CYGPATH_W) '$(srcdir)/UgetHash.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetHash.Tpo $(DEPDIR)/libuget_a-UgetHash.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetHash.c' object='libuget_a-UgetHash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetHash.obj `if test -f 'UgetHash.c'; then $(CYGPATH_W) 'UgetHash.c'; else $(CYGPATH_W) '$(srcdir)/UgetHash.c'; fi` libuget_a-UgetSite.o: UgetSite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetSite.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetSite.Tpo -c -o libuget_a-UgetSite.o `test -f 'UgetSite.c' || echo '$(srcdir)/'`UgetSite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetSite.Tpo $(DEPDIR)/libuget_a-UgetSite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetSite.c' object='libuget_a-UgetSite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetSite.o `test -f 'UgetSite.c' || echo '$(srcdir)/'`UgetSite.c libuget_a-UgetSite.obj: UgetSite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetSite.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetSite.Tpo -c -o libuget_a-UgetSite.obj `if test -f 'UgetSite.c'; then $(CYGPATH_W) 'UgetSite.c'; else $(CYGPATH_W) '$(srcdir)/UgetSite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetSite.Tpo $(DEPDIR)/libuget_a-UgetSite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetSite.c' object='libuget_a-UgetSite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetSite.obj `if test -f 'UgetSite.c'; then $(CYGPATH_W) 'UgetSite.c'; else $(CYGPATH_W) '$(srcdir)/UgetSite.c'; fi` libuget_a-UgetApp.o: UgetApp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetApp.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetApp.Tpo -c -o libuget_a-UgetApp.o `test -f 'UgetApp.c' || echo '$(srcdir)/'`UgetApp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetApp.Tpo $(DEPDIR)/libuget_a-UgetApp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetApp.c' object='libuget_a-UgetApp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetApp.o `test -f 'UgetApp.c' || echo '$(srcdir)/'`UgetApp.c libuget_a-UgetApp.obj: UgetApp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetApp.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetApp.Tpo -c -o libuget_a-UgetApp.obj `if test -f 'UgetApp.c'; then $(CYGPATH_W) 'UgetApp.c'; else $(CYGPATH_W) '$(srcdir)/UgetApp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetApp.Tpo $(DEPDIR)/libuget_a-UgetApp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetApp.c' object='libuget_a-UgetApp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetApp.obj `if test -f 'UgetApp.c'; then $(CYGPATH_W) 'UgetApp.c'; else $(CYGPATH_W) '$(srcdir)/UgetApp.c'; fi` libuget_a-UgetEvent.o: UgetEvent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetEvent.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetEvent.Tpo -c -o libuget_a-UgetEvent.o `test -f 'UgetEvent.c' || echo '$(srcdir)/'`UgetEvent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetEvent.Tpo $(DEPDIR)/libuget_a-UgetEvent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetEvent.c' object='libuget_a-UgetEvent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetEvent.o `test -f 'UgetEvent.c' || echo '$(srcdir)/'`UgetEvent.c libuget_a-UgetEvent.obj: UgetEvent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetEvent.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetEvent.Tpo -c -o libuget_a-UgetEvent.obj `if test -f 'UgetEvent.c'; then $(CYGPATH_W) 'UgetEvent.c'; else $(CYGPATH_W) '$(srcdir)/UgetEvent.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetEvent.Tpo $(DEPDIR)/libuget_a-UgetEvent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetEvent.c' object='libuget_a-UgetEvent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetEvent.obj `if test -f 'UgetEvent.c'; then $(CYGPATH_W) 'UgetEvent.c'; else $(CYGPATH_W) '$(srcdir)/UgetEvent.c'; fi` libuget_a-UgetPlugin.o: UgetPlugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPlugin.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPlugin.Tpo -c -o libuget_a-UgetPlugin.o `test -f 'UgetPlugin.c' || echo '$(srcdir)/'`UgetPlugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPlugin.Tpo $(DEPDIR)/libuget_a-UgetPlugin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPlugin.c' object='libuget_a-UgetPlugin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPlugin.o `test -f 'UgetPlugin.c' || echo '$(srcdir)/'`UgetPlugin.c libuget_a-UgetPlugin.obj: UgetPlugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPlugin.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPlugin.Tpo -c -o libuget_a-UgetPlugin.obj `if test -f 'UgetPlugin.c'; then $(CYGPATH_W) 'UgetPlugin.c'; else $(CYGPATH_W) '$(srcdir)/UgetPlugin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPlugin.Tpo $(DEPDIR)/libuget_a-UgetPlugin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPlugin.c' object='libuget_a-UgetPlugin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPlugin.obj `if test -f 'UgetPlugin.c'; then $(CYGPATH_W) 'UgetPlugin.c'; else $(CYGPATH_W) '$(srcdir)/UgetPlugin.c'; fi` libuget_a-UgetA2cf.o: UgetA2cf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetA2cf.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetA2cf.Tpo -c -o libuget_a-UgetA2cf.o `test -f 'UgetA2cf.c' || echo '$(srcdir)/'`UgetA2cf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetA2cf.Tpo $(DEPDIR)/libuget_a-UgetA2cf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetA2cf.c' object='libuget_a-UgetA2cf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetA2cf.o `test -f 'UgetA2cf.c' || echo '$(srcdir)/'`UgetA2cf.c libuget_a-UgetA2cf.obj: UgetA2cf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetA2cf.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetA2cf.Tpo -c -o libuget_a-UgetA2cf.obj `if test -f 'UgetA2cf.c'; then $(CYGPATH_W) 'UgetA2cf.c'; else $(CYGPATH_W) '$(srcdir)/UgetA2cf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetA2cf.Tpo $(DEPDIR)/libuget_a-UgetA2cf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetA2cf.c' object='libuget_a-UgetA2cf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetA2cf.obj `if test -f 'UgetA2cf.c'; then $(CYGPATH_W) 'UgetA2cf.c'; else $(CYGPATH_W) '$(srcdir)/UgetA2cf.c'; fi` libuget_a-UgetCurl.o: UgetCurl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetCurl.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetCurl.Tpo -c -o libuget_a-UgetCurl.o `test -f 'UgetCurl.c' || echo '$(srcdir)/'`UgetCurl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetCurl.Tpo $(DEPDIR)/libuget_a-UgetCurl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetCurl.c' object='libuget_a-UgetCurl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetCurl.o `test -f 'UgetCurl.c' || echo '$(srcdir)/'`UgetCurl.c libuget_a-UgetCurl.obj: UgetCurl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetCurl.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetCurl.Tpo -c -o libuget_a-UgetCurl.obj `if test -f 'UgetCurl.c'; then $(CYGPATH_W) 'UgetCurl.c'; else $(CYGPATH_W) '$(srcdir)/UgetCurl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetCurl.Tpo $(DEPDIR)/libuget_a-UgetCurl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetCurl.c' object='libuget_a-UgetCurl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetCurl.obj `if test -f 'UgetCurl.c'; then $(CYGPATH_W) 'UgetCurl.c'; else $(CYGPATH_W) '$(srcdir)/UgetCurl.c'; fi` libuget_a-UgetAria2.o: UgetAria2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetAria2.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetAria2.Tpo -c -o libuget_a-UgetAria2.o `test -f 'UgetAria2.c' || echo '$(srcdir)/'`UgetAria2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetAria2.Tpo $(DEPDIR)/libuget_a-UgetAria2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetAria2.c' object='libuget_a-UgetAria2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetAria2.o `test -f 'UgetAria2.c' || echo '$(srcdir)/'`UgetAria2.c libuget_a-UgetAria2.obj: UgetAria2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetAria2.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetAria2.Tpo -c -o libuget_a-UgetAria2.obj `if test -f 'UgetAria2.c'; then $(CYGPATH_W) 'UgetAria2.c'; else $(CYGPATH_W) '$(srcdir)/UgetAria2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetAria2.Tpo $(DEPDIR)/libuget_a-UgetAria2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetAria2.c' object='libuget_a-UgetAria2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetAria2.obj `if test -f 'UgetAria2.c'; then $(CYGPATH_W) 'UgetAria2.c'; else $(CYGPATH_W) '$(srcdir)/UgetAria2.c'; fi` libuget_a-UgetMedia.o: UgetMedia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetMedia.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetMedia.Tpo -c -o libuget_a-UgetMedia.o `test -f 'UgetMedia.c' || echo '$(srcdir)/'`UgetMedia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetMedia.Tpo $(DEPDIR)/libuget_a-UgetMedia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetMedia.c' object='libuget_a-UgetMedia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetMedia.o `test -f 'UgetMedia.c' || echo '$(srcdir)/'`UgetMedia.c libuget_a-UgetMedia.obj: UgetMedia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetMedia.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetMedia.Tpo -c -o libuget_a-UgetMedia.obj `if test -f 'UgetMedia.c'; then $(CYGPATH_W) 'UgetMedia.c'; else $(CYGPATH_W) '$(srcdir)/UgetMedia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetMedia.Tpo $(DEPDIR)/libuget_a-UgetMedia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetMedia.c' object='libuget_a-UgetMedia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetMedia.obj `if test -f 'UgetMedia.c'; then $(CYGPATH_W) 'UgetMedia.c'; else $(CYGPATH_W) '$(srcdir)/UgetMedia.c'; fi` libuget_a-UgetMedia-youtube.o: UgetMedia-youtube.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetMedia-youtube.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetMedia-youtube.Tpo -c -o libuget_a-UgetMedia-youtube.o `test -f 'UgetMedia-youtube.c' || echo '$(srcdir)/'`UgetMedia-youtube.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetMedia-youtube.Tpo $(DEPDIR)/libuget_a-UgetMedia-youtube.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetMedia-youtube.c' object='libuget_a-UgetMedia-youtube.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetMedia-youtube.o `test -f 'UgetMedia-youtube.c' || echo '$(srcdir)/'`UgetMedia-youtube.c libuget_a-UgetMedia-youtube.obj: UgetMedia-youtube.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetMedia-youtube.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetMedia-youtube.Tpo -c -o libuget_a-UgetMedia-youtube.obj `if test -f 'UgetMedia-youtube.c'; then $(CYGPATH_W) 'UgetMedia-youtube.c'; else $(CYGPATH_W) '$(srcdir)/UgetMedia-youtube.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetMedia-youtube.Tpo $(DEPDIR)/libuget_a-UgetMedia-youtube.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetMedia-youtube.c' object='libuget_a-UgetMedia-youtube.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetMedia-youtube.obj `if test -f 'UgetMedia-youtube.c'; then $(CYGPATH_W) 'UgetMedia-youtube.c'; else $(CYGPATH_W) '$(srcdir)/UgetMedia-youtube.c'; fi` libuget_a-UgetPluginCurl.o: UgetPluginCurl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginCurl.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginCurl.Tpo -c -o libuget_a-UgetPluginCurl.o `test -f 'UgetPluginCurl.c' || echo '$(srcdir)/'`UgetPluginCurl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginCurl.Tpo $(DEPDIR)/libuget_a-UgetPluginCurl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginCurl.c' object='libuget_a-UgetPluginCurl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginCurl.o `test -f 'UgetPluginCurl.c' || echo '$(srcdir)/'`UgetPluginCurl.c libuget_a-UgetPluginCurl.obj: UgetPluginCurl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginCurl.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginCurl.Tpo -c -o libuget_a-UgetPluginCurl.obj `if test -f 'UgetPluginCurl.c'; then $(CYGPATH_W) 'UgetPluginCurl.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginCurl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginCurl.Tpo $(DEPDIR)/libuget_a-UgetPluginCurl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginCurl.c' object='libuget_a-UgetPluginCurl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginCurl.obj `if test -f 'UgetPluginCurl.c'; then $(CYGPATH_W) 'UgetPluginCurl.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginCurl.c'; fi` libuget_a-UgetPluginAria2.o: UgetPluginAria2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginAria2.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginAria2.Tpo -c -o libuget_a-UgetPluginAria2.o `test -f 'UgetPluginAria2.c' || echo '$(srcdir)/'`UgetPluginAria2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginAria2.Tpo $(DEPDIR)/libuget_a-UgetPluginAria2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginAria2.c' object='libuget_a-UgetPluginAria2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginAria2.o `test -f 'UgetPluginAria2.c' || echo '$(srcdir)/'`UgetPluginAria2.c libuget_a-UgetPluginAria2.obj: UgetPluginAria2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginAria2.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginAria2.Tpo -c -o libuget_a-UgetPluginAria2.obj `if test -f 'UgetPluginAria2.c'; then $(CYGPATH_W) 'UgetPluginAria2.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginAria2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginAria2.Tpo $(DEPDIR)/libuget_a-UgetPluginAria2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginAria2.c' object='libuget_a-UgetPluginAria2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginAria2.obj `if test -f 'UgetPluginAria2.c'; then $(CYGPATH_W) 'UgetPluginAria2.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginAria2.c'; fi` libuget_a-UgetPluginMedia.o: UgetPluginMedia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginMedia.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginMedia.Tpo -c -o libuget_a-UgetPluginMedia.o `test -f 'UgetPluginMedia.c' || echo '$(srcdir)/'`UgetPluginMedia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginMedia.Tpo $(DEPDIR)/libuget_a-UgetPluginMedia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginMedia.c' object='libuget_a-UgetPluginMedia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginMedia.o `test -f 'UgetPluginMedia.c' || echo '$(srcdir)/'`UgetPluginMedia.c libuget_a-UgetPluginMedia.obj: UgetPluginMedia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginMedia.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginMedia.Tpo -c -o libuget_a-UgetPluginMedia.obj `if test -f 'UgetPluginMedia.c'; then $(CYGPATH_W) 'UgetPluginMedia.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginMedia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginMedia.Tpo $(DEPDIR)/libuget_a-UgetPluginMedia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginMedia.c' object='libuget_a-UgetPluginMedia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginMedia.obj `if test -f 'UgetPluginMedia.c'; then $(CYGPATH_W) 'UgetPluginMedia.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginMedia.c'; fi` libuget_a-UgetPluginAgent.o: UgetPluginAgent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginAgent.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginAgent.Tpo -c -o libuget_a-UgetPluginAgent.o `test -f 'UgetPluginAgent.c' || echo '$(srcdir)/'`UgetPluginAgent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginAgent.Tpo $(DEPDIR)/libuget_a-UgetPluginAgent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginAgent.c' object='libuget_a-UgetPluginAgent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginAgent.o `test -f 'UgetPluginAgent.c' || echo '$(srcdir)/'`UgetPluginAgent.c libuget_a-UgetPluginAgent.obj: UgetPluginAgent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginAgent.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginAgent.Tpo -c -o libuget_a-UgetPluginAgent.obj `if test -f 'UgetPluginAgent.c'; then $(CYGPATH_W) 'UgetPluginAgent.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginAgent.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginAgent.Tpo $(DEPDIR)/libuget_a-UgetPluginAgent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginAgent.c' object='libuget_a-UgetPluginAgent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginAgent.obj `if test -f 'UgetPluginAgent.c'; then $(CYGPATH_W) 'UgetPluginAgent.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginAgent.c'; fi` libuget_a-UgetPluginMega.o: UgetPluginMega.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginMega.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginMega.Tpo -c -o libuget_a-UgetPluginMega.o `test -f 'UgetPluginMega.c' || echo '$(srcdir)/'`UgetPluginMega.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginMega.Tpo $(DEPDIR)/libuget_a-UgetPluginMega.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginMega.c' object='libuget_a-UgetPluginMega.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginMega.o `test -f 'UgetPluginMega.c' || echo '$(srcdir)/'`UgetPluginMega.c libuget_a-UgetPluginMega.obj: UgetPluginMega.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginMega.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginMega.Tpo -c -o libuget_a-UgetPluginMega.obj `if test -f 'UgetPluginMega.c'; then $(CYGPATH_W) 'UgetPluginMega.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginMega.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginMega.Tpo $(DEPDIR)/libuget_a-UgetPluginMega.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginMega.c' object='libuget_a-UgetPluginMega.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginMega.obj `if test -f 'UgetPluginMega.c'; then $(CYGPATH_W) 'UgetPluginMega.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginMega.c'; fi` libuget_a-UgetPluginEmpty.o: UgetPluginEmpty.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginEmpty.o -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginEmpty.Tpo -c -o libuget_a-UgetPluginEmpty.o `test -f 'UgetPluginEmpty.c' || echo '$(srcdir)/'`UgetPluginEmpty.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginEmpty.Tpo $(DEPDIR)/libuget_a-UgetPluginEmpty.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginEmpty.c' object='libuget_a-UgetPluginEmpty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginEmpty.o `test -f 'UgetPluginEmpty.c' || echo '$(srcdir)/'`UgetPluginEmpty.c libuget_a-UgetPluginEmpty.obj: UgetPluginEmpty.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-UgetPluginEmpty.obj -MD -MP -MF $(DEPDIR)/libuget_a-UgetPluginEmpty.Tpo -c -o libuget_a-UgetPluginEmpty.obj `if test -f 'UgetPluginEmpty.c'; then $(CYGPATH_W) 'UgetPluginEmpty.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginEmpty.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-UgetPluginEmpty.Tpo $(DEPDIR)/libuget_a-UgetPluginEmpty.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgetPluginEmpty.c' object='libuget_a-UgetPluginEmpty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-UgetPluginEmpty.obj `if test -f 'UgetPluginEmpty.c'; then $(CYGPATH_W) 'UgetPluginEmpty.c'; else $(CYGPATH_W) '$(srcdir)/UgetPluginEmpty.c'; fi` libuget_a-pwmd.o: pwmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-pwmd.o -MD -MP -MF $(DEPDIR)/libuget_a-pwmd.Tpo -c -o libuget_a-pwmd.o `test -f 'pwmd.c' || echo '$(srcdir)/'`pwmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-pwmd.Tpo $(DEPDIR)/libuget_a-pwmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pwmd.c' object='libuget_a-pwmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-pwmd.o `test -f 'pwmd.c' || echo '$(srcdir)/'`pwmd.c libuget_a-pwmd.obj: pwmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -MT libuget_a-pwmd.obj -MD -MP -MF $(DEPDIR)/libuget_a-pwmd.Tpo -c -o libuget_a-pwmd.obj `if test -f 'pwmd.c'; then $(CYGPATH_W) 'pwmd.c'; else $(CYGPATH_W) '$(srcdir)/pwmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libuget_a-pwmd.Tpo $(DEPDIR)/libuget_a-pwmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pwmd.c' object='libuget_a-pwmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuget_a_CPPFLAGS) $(CPPFLAGS) $(libuget_a_CFLAGS) $(CFLAGS) -c -o libuget_a-pwmd.obj `if test -f 'pwmd.c'; then $(CYGPATH_W) 'pwmd.c'; else $(CYGPATH_W) '$(srcdir)/pwmd.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libuget_a-UgetA2cf.Po -rm -f ./$(DEPDIR)/libuget_a-UgetApp.Po -rm -f ./$(DEPDIR)/libuget_a-UgetAria2.Po -rm -f ./$(DEPDIR)/libuget_a-UgetCurl.Po -rm -f ./$(DEPDIR)/libuget_a-UgetData.Po -rm -f ./$(DEPDIR)/libuget_a-UgetEvent.Po -rm -f ./$(DEPDIR)/libuget_a-UgetFiles.Po -rm -f ./$(DEPDIR)/libuget_a-UgetHash.Po -rm -f ./$(DEPDIR)/libuget_a-UgetMedia-youtube.Po -rm -f ./$(DEPDIR)/libuget_a-UgetMedia.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode-compare.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode-filter.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode.Po -rm -f ./$(DEPDIR)/libuget_a-UgetOption.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPlugin.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginAgent.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginAria2.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginCurl.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginEmpty.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginMedia.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginMega.Po -rm -f ./$(DEPDIR)/libuget_a-UgetRpc.Po -rm -f ./$(DEPDIR)/libuget_a-UgetRss.Po -rm -f ./$(DEPDIR)/libuget_a-UgetSequence.Po -rm -f ./$(DEPDIR)/libuget_a-UgetSite.Po -rm -f ./$(DEPDIR)/libuget_a-UgetTask.Po -rm -f ./$(DEPDIR)/libuget_a-pwmd.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libuget_a-UgetA2cf.Po -rm -f ./$(DEPDIR)/libuget_a-UgetApp.Po -rm -f ./$(DEPDIR)/libuget_a-UgetAria2.Po -rm -f ./$(DEPDIR)/libuget_a-UgetCurl.Po -rm -f ./$(DEPDIR)/libuget_a-UgetData.Po -rm -f ./$(DEPDIR)/libuget_a-UgetEvent.Po -rm -f ./$(DEPDIR)/libuget_a-UgetFiles.Po -rm -f ./$(DEPDIR)/libuget_a-UgetHash.Po -rm -f ./$(DEPDIR)/libuget_a-UgetMedia-youtube.Po -rm -f ./$(DEPDIR)/libuget_a-UgetMedia.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode-compare.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode-filter.Po -rm -f ./$(DEPDIR)/libuget_a-UgetNode.Po -rm -f ./$(DEPDIR)/libuget_a-UgetOption.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPlugin.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginAgent.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginAria2.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginCurl.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginEmpty.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginMedia.Po -rm -f ./$(DEPDIR)/libuget_a-UgetPluginMega.Po -rm -f ./$(DEPDIR)/libuget_a-UgetRpc.Po -rm -f ./$(DEPDIR)/libuget_a-UgetRss.Po -rm -f ./$(DEPDIR)/libuget_a-UgetSequence.Po -rm -f ./$(DEPDIR)/libuget_a-UgetSite.Po -rm -f ./$(DEPDIR)/libuget_a-UgetTask.Po -rm -f ./$(DEPDIR)/libuget_a-pwmd.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/uget/UgetMedia.h0000664000175000017500000001072113470304402012363 00000000000000/* * * Copyright (C) 2015-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ // YouTube support #ifndef UGET_MEDIA_H #define UGET_MEDIA_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetMedia UgetMedia; typedef struct UgetMediaItem UgetMediaItem; typedef enum UgetMediaMatchMode { UGET_MEDIA_MATCH_0 = 0, UGET_MEDIA_MATCH_1 = 1, UGET_MEDIA_MATCH_2, UGET_MEDIA_MATCH_NEAR, // near quality UGET_MEDIA_N_MATCH_MODE, } UgetMediaMatchMode; typedef enum UgetMediaQuality { UGET_MEDIA_QUALITY_UNKNOWN = -1, UGET_MEDIA_QUALITY_240P, // YouTube small UGET_MEDIA_QUALITY_360P, // YouTube medium UGET_MEDIA_QUALITY_480P, // YouTube large UGET_MEDIA_QUALITY_720P, // YouTube hd720 UGET_MEDIA_QUALITY_1080P, // YouTube hd1080 UGET_MEDIA_N_QUALITY, } UgetMediaQuality; typedef enum UgetMediaType { UGET_MEDIA_TYPE_UNKNOWN = -1, UGET_MEDIA_TYPE_MP4, UGET_MEDIA_TYPE_WEBM, UGET_MEDIA_TYPE_3GPP, UGET_MEDIA_TYPE_FLV, // YouTube MIME type: // audio/mp4;+codecs="mp4a.40.2" // audio/webm;+codecs="vorbis" // audio/webm;+codecs="opus" UGET_MEDIA_AUDIO_MP4, UGET_MEDIA_AUDIO_WEBM, // UGET_MEDIA_AUDIO_WEBM_VORBIS, // YouTube - audio/webm;+codecs="vorbis" // UGET_MEDIA_AUDIO_WEBM_OPUS, // YouTube - audio/webm;+codecs="opus" UGET_MEDIA_N_TYPE, } UgetMediaType; struct UgetMedia { UG_LIST_MEMBERS(UgetMediaItem); // uintptr_t size; // UgetMediaItem* head; // UgetMediaItem* tail; UgUri uuri; UgUriQuery uquery; int site_id; char* url; char* title; // error message UgetEvent* event; // for internal use only void* data; void* data1; void* data2; void* data3; void* data4; }; UgetMedia* uget_media_new(const char* url, UgetSiteId site_id); void uget_media_free(UgetMedia* umedia); void uget_media_clear(UgetMedia* umedia, int free_items); int uget_media_grab_items(UgetMedia* umedia, UgetProxy* proxy); // return begin of matched items. Don't free it UgetMediaItem* uget_media_match(UgetMedia* umedia, UgetMediaMatchMode mode, UgetMediaQuality quality, UgetMediaType type); // ---------------------------------------------------------------------------- // UgetMediaItem struct UgetMediaItem { UG_LINK_MEMBERS(UgetMediaItem, UgetMediaItem, self); // UgetMediaItem* self; // UgetMediaItem* next; // UgetMediaItem* prev; char* url; int quality; // video - 480p, 720p int bitrate; // audio int type; // UgetMediaType // for internal use only int order; union { int integer; char* string; void* pointer; } data; union { int integer; char* string; void* pointer; } data1; }; UgetMediaItem* uget_media_item_new(UgetMedia* umedia); void uget_media_item_free(UgetMediaItem* umitem); #ifdef __cplusplus } #endif // __cplusplus #endif // End of UGET_MEDIA_H uget-2.2.2/uget/pwmd.c0000664000175000017500000002001213470304403011454 00000000000000/* Copyright (C) 2011-2016 Ben Kibbey This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "pwmd.h" static gpg_error_t alloc_result(const char* s, size_t len, char** result) { char *b; if (!len) { *result = NULL; return 0; } b = pwmd_malloc(len+1); if (!b) return GPG_ERR_ENOMEM; memcpy(b, s, len); b[len] = 0; *result = b; return 0; } static int failure(const char* root, const char* id, gpg_error_t rc, int required) { if (!rc) return 0; if (gpg_err_code (rc) == GPG_ERR_ELEMENT_NOT_FOUND || gpg_err_code (rc) == GPG_ERR_NO_DATA) { if (!required) return 0; fprintf(stderr, "pwmd: ERR(%u): %s%s%s: %s\n", rc, root ? root : "", root ? "^": "", id, gpg_strerror (rc)); } return 1; } gpg_error_t ug_set_pwmd_proxy_options(struct pwmd_proxy_s* pwmd, UgetProxy* proxy) { char *bulk = NULL; const gchar *bresult = NULL; gchar *result = NULL; size_t brlen, len; size_t offset = 0; char *str; gpg_error_t rcs[4] = { 0 }; gpg_error_t rc, brc; pwm_t *pwm = NULL; gchar *path = NULL; const gchar *root = proxy->pwmd.element; gint i; gchar **args = NULL; pwmd->port = 80; if (proxy->pwmd.element) { pwmd->path = path = g_strdup_printf("%s\t", proxy->pwmd.element); for (i = 0; path[i]; i++) { if (path[i] == '^') path[i] = '\t'; } } pwmd_init(); rc = pwmd_new("uget", &pwm); if (rc) goto fail; rc = pwmd_setopt(pwm, PWMD_OPTION_SOCKET_TIMEOUT, 120); if (!rc && proxy->pwmd.socket_args && *proxy->pwmd.socket_args) args = g_strsplit(proxy->pwmd.socket_args, ",", 0); if (!rc) rc = pwmd_connect(pwm, proxy->pwmd.socket, g_strv_length (args) > 0 ? args[0] : NULL, g_strv_length (args) > 1 ? args[1] : NULL, g_strv_length (args) > 2 ? args[2] : NULL, g_strv_length (args) > 3 ? args[3] : NULL, g_strv_length (args) > 4 ? args[4] : NULL, g_strv_length (args) > 5 ? args[5] : NULL, g_strv_length (args) > 6 ? args[6] : NULL, g_strv_length (args) > 7 ? args[7] : NULL ); if (rc) goto fail; rc = pwmd_setopt(pwm, PWMD_OPTION_PINENTRY_DESC, NULL); if (!rc) rc = pwmd_setopt(pwm, PWMD_OPTION_LOCK_TIMEOUT, 100); if (rc) goto fail; rc = pwmd_open(pwm, proxy->pwmd.file, NULL, NULL); if (rc) goto fail; rc = pwmd_bulk_append(&bulk, "NOP", 3, "NOP", NULL, 0, &offset); if (rc) goto fail; rcs[0] = 0; rcs[1] = GPG_ERR_MISSING_ERRNO; str = pwmd_strdup_printf("%stype", path); rc = pwmd_bulk_append_rc(&bulk, rcs, "TYPE", 4, "GET", str, strlen (str), &offset); pwmd_free(str); if (rc) goto fail; rcs[0] = 0; rcs[1] = GPG_ERR_MISSING_ERRNO; str = pwmd_strdup_printf("%shostname", path); rc = pwmd_bulk_append_rc(&bulk, rcs, "HOST", 4, "GET", str, strlen (str), &offset); pwmd_free(str); if (rc) goto fail; rcs[0] = 0; rcs[1] = gpg_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_ELEMENT_NOT_FOUND); rcs[2] = GPG_ERR_MISSING_ERRNO; str = pwmd_strdup_printf("%sport", path); rc = pwmd_bulk_append_rc(&bulk, rcs, "PORT", 4, "GET", str, strlen (str), &offset); pwmd_free(str); if (rc) goto fail; rcs[0] = 0; rcs[1] = gpg_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_ELEMENT_NOT_FOUND); rcs[2] = gpg_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_NO_DATA); rcs[3] = GPG_ERR_MISSING_ERRNO; str = pwmd_strdup_printf("%susername", path); rc = pwmd_bulk_append_rc(&bulk, rcs, "USER", 4, "GET", str, strlen (str), &offset); pwmd_free(str); if (rc) goto fail; rcs[0] = 0; rcs[1] = gpg_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_ELEMENT_NOT_FOUND); rcs[2] = gpg_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_NO_DATA); rcs[3] = GPG_ERR_MISSING_ERRNO; str = pwmd_strdup_printf("%spassword", path); rc = pwmd_bulk_append_rc(&bulk, rcs, "PASS", 4, "GET", str, strlen (str), &offset); pwmd_free(str); if (rc) goto fail; rc = pwmd_bulk_finalize(&bulk); if (!rc) rc = pwmd_bulk(pwm, &result, &len, NULL, NULL, bulk, strlen (bulk)); if (rc) goto fail; offset = 0; rc = pwmd_bulk_result(result, len, "TYPE", 4, &offset, &bresult, &brlen, &brc); if (failure(root, "type", rc ? rc : brc, 1)) goto fail; else if(brlen) alloc_result (bresult, brlen, &pwmd->type); rc = pwmd_bulk_result(result, len, "HOST", 4, &offset, &bresult, &brlen, &brc); if (failure(root, "hostname", rc ? rc : brc, 1)) goto fail; else if (brlen) alloc_result(bresult, brlen, &pwmd->hostname); rc = pwmd_bulk_result(result, len, "PORT", 4, &offset, &bresult, &brlen, &brc); if (failure(root, "port", rc ? rc : brc, 0)) goto fail; else if (brlen) { char *p; alloc_result(bresult, brlen, &p); pwmd->port = atoi(p); pwmd_free(p); } rc = pwmd_bulk_result(result, len, "USER", 4, &offset, &bresult, &brlen, &brc); if (failure(root, "username", rc ? rc : brc, 0)) goto fail; else if (brlen) alloc_result(bresult, brlen, &pwmd->username); rc = pwmd_bulk_result(result, len, "PASS", 4, &offset, &bresult, &brlen, &brc); if (failure(root, "password", rc ? rc : brc, 0)) goto fail; else if (brlen) alloc_result(bresult, brlen, &pwmd->password); brc = 0; fail: if (args) g_strfreev(args); pwmd_free(result); pwmd_free(bulk); pwmd_close(pwm); return rc ? rc : brc; } void ug_close_pwmd(struct pwmd_proxy_s* pwmd) { pwmd_free(pwmd->type); pwmd_free(pwmd->hostname); pwmd_free(pwmd->username); pwmd_free(pwmd->password); g_free(pwmd->path); } uget-2.2.2/uget/Android.mk0000664000175000017500000000142313470304402012256 00000000000000LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libuget LOCAL_CPPFLAGS += -DNDEBUG ## -DNO_RETRY_IF_CONNECT_FAILED LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/../uglib $(LOCAL_PATH)/../curl/include $(LOCAL_PATH)/../openssl/include LOCAL_SRC_FILES := \ UgetSequence.c \ UgetRpc.c \ UgetOption.c \ UgetData.c \ UgetFiles.c \ UgetNode.c \ UgetNode-compare.c \ UgetNode-filter.c \ UgetTask.c \ UgetHash.c \ UgetSite.c \ UgetApp.c \ UgetEvent.c \ UgetPlugin.c \ UgetA2cf.c \ UgetCurl.c \ UgetAria2.c \ UgetMedia.c \ UgetMedia-youtube.c \ UgetPluginCurl.c \ UgetPluginAria2.c \ UgetPluginMedia.c \ UgetPluginAgent.c \ UgetPluginMega.c include $(BUILD_STATIC_LIBRARY) uget-2.2.2/uget/UgetTask.h0000664000175000017500000001001013470304403012236 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_TASK_H #define UGET_TASK_H #include #include #include #include #include #include #define UGET_TASK_N_WATCH 4 #ifdef __cplusplus extern "C" { #endif /* UgetTask - match/manage UgetNode and UgetPlugin - adjust/limit speed */ typedef struct UgetTask UgetTask; typedef int (*UgetWatchFunc) (void* instance, UgetEvent* msg, UgetNode* node, void* data); // ---------------------------------------------------------------------------- // UgetTask functions void uget_task_init(UgetTask* task); void uget_task_final(UgetTask* task); int uget_task_add(UgetTask* task, UgetNode* node, const UgetPluginInfo* pinfo); int uget_task_remove(UgetTask* task, UgetNode* node); void uget_task_remove_all(UgetTask* task); void uget_task_dispatch(UgetTask* task); void uget_task_add_watch(UgetTask* task, UgetWatchFunc func, void* data); void uget_task_set_speed(UgetTask* task, int dl_speed, int ul_speed); void uget_task_adjust_speed(UgetTask* task); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgetTask structure struct UgetTask { UG_SLINKS_MEMBERS; /* // ------ UgSLinks members ------ UgSLink* at; int length; int allocated; int element_size; int n_links; UgSLink* used; UgSLink* freed; */ struct { UgetWatchFunc func; void* data; } watch[UGET_TASK_N_WATCH]; struct { int upload; int download; } speed, limit; #ifdef __cplusplus // C++11 standard-layout inline void init(void) { uget_task_init((UgetTask*) this); } inline void final(void) { uget_task_final((UgetTask*) this); } inline int add(UgetNode* node, UgetPluginInfo* info) { return uget_task_add((UgetTask*) this, node, info); } inline void remove(UgetNode* node) { uget_task_remove((UgetTask*) this, node); } inline void dispatch(void) { uget_task_dispatch((UgetTask*) this); } inline void setSpeed(int dl_speed, int ul_speed) { uget_task_set_speed(this, dl_speed, ul_speed); } inline void adjustSpeed(void) { uget_task_adjust_speed(this); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { typedef struct UgetTask Task; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_TASK_H uget-2.2.2/uget/UgetPlugin.c0000664000175000017500000001245313470304402012601 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // ------------------------------------ // UgetPluginInfo global functions UgetPlugin* uget_plugin_new(const UgetPluginInfo* info) { UgetPlugin* plugin; plugin = ug_malloc0(info->size); plugin->info = info; ug_mutex_init(&plugin->mutex); plugin->ref_count = 1; info->init(plugin); return plugin; } UgetResult uget_plugin_global_set(const UgetPluginInfo* info, int option, void* parameter) { UgetPluginGlobalFunc global_set; global_set = info->global_set; if (global_set) return global_set(option, parameter); return UGET_RESULT_UNSUPPORT; } UgetResult uget_plugin_global_get(const UgetPluginInfo* info, int option, void* parameter) { UgetPluginGlobalFunc global_get; global_get = info->global_get; if (global_get) return global_get(option, parameter); return UGET_RESULT_UNSUPPORT; } int uget_plugin_match(const UgetPluginInfo* info, UgUri* uuri) { UgetResult res; const char* str; int len; int matched_count = 0; if (info == NULL) return 0; if (info->hosts && (len = ug_uri_part_host(uuri, &str))) { if (ug_uri_match_hosts(uuri, (char**)info->hosts) >= 0) { matched_count++; // Don't match this plug-in if it is for specify host. res = uget_plugin_global_get(info, UGET_PLUGIN_GLOBAL_MATCH, (void*) uuri->uri); if (res == UGET_RESULT_FAILED) matched_count = -1; else if (res == UGET_RESULT_OK) matched_count = 2; } } if (info->schemes && (len = ug_uri_part_scheme(uuri, &str))) { if (ug_uri_match_schemes(uuri, (char**)info->schemes) >= 0) matched_count++; } if (info->file_exts && (len = ug_uri_part_file_ext(uuri, &str))) { if (ug_uri_match_file_exts(uuri, (char**)info->file_exts) >= 0) matched_count++; } return matched_count; } // ------------------------------------ // UgetPlugin functions //void uget_plugin_init(UgetPlugin* plugin); #define uget_plugin_init ug_type_init //void uget_plugin_final(UgetPlugin* plugin); #define uget_plugin_final ug_type_final void uget_plugin_ref(UgetPlugin* plugin) { plugin->ref_count++; } void uget_plugin_unref(UgetPlugin* plugin) { UgetEvent* curr; UgetEvent* next; if (--plugin->ref_count == 0) { uget_plugin_final(plugin); ug_mutex_clear(&plugin->mutex); // free events for (curr = plugin->events; curr; curr = next) { next = curr->next; uget_event_free(curr); } // free plug-in ug_free(plugin); } } int uget_plugin_accept(UgetPlugin* plugin, UgInfo* info) { UgetPluginSyncFunc accept; accept = plugin->info->accept; if (accept) return accept(plugin, info); return FALSE; } int uget_plugin_sync(UgetPlugin* plugin, UgInfo* info) { UgetPluginSyncFunc sync; sync = plugin->info->sync; if (sync) return sync(plugin, info); return FALSE; } int uget_plugin_ctrl(UgetPlugin* plugin, int code, void* data) { UgetPluginCtrlFunc ctrl; ctrl = plugin->info->ctrl; if (ctrl) return ctrl(plugin, code, data); return FALSE; } int uget_plugin_get_state(UgetPlugin* plugin) { int is_active; uget_plugin_ctrl(plugin, UGET_PLUGIN_GET_STATE, &is_active); return is_active; } void uget_plugin_post(UgetPlugin* plugin, UgetEvent* message) { ug_mutex_lock(&plugin->mutex); if (plugin->events) plugin->events->prev = message; message->next = plugin->events; plugin->events = message; ug_mutex_unlock(&plugin->mutex); } UgetEvent* uget_plugin_pop(UgetPlugin* plugin) { UgetEvent* curr; UgetEvent* next; ug_mutex_lock(&plugin->mutex); curr = plugin->events; plugin->events = NULL; ug_mutex_unlock(&plugin->mutex); // revert while (curr) { next = curr->next; curr->next = curr->prev; curr->prev = next; if (next == NULL) break; curr = next; } return curr; } uget-2.2.2/uget/UgetA2cf.h0000664000175000017500000000645113470304402012124 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ // Aria2 Control File for uGet #ifndef UGET_A2CF_H #define UGET_A2CF_H #include #include #ifdef __cplusplus extern "C" { #endif // A2cf = Aria2 Control File typedef struct UgetA2cf UgetA2cf; typedef struct UgetA2cfPiece UgetA2cfPiece; struct UgetA2cfPiece { UG_LINK_MEMBERS (UgetA2cfPiece, UgetA2cfPiece, self); // UgetA2cfPiece* self; // UgetA2cfPiece* next; // UgetA2cfPiece* prev; uint32_t index; uint32_t length; uint32_t bitfield_len; uint8_t bitfield[1]; }; struct UgetA2cf { uint16_t ver; uint32_t ext; uint32_t info_hash_len; uint8_t* info_hash; uint32_t piece_len; uint64_t total_len; uint64_t upload_len; uint32_t bitfield_len; uint8_t* bitfield; // aria2 control file has this field. // uint32_t n_pieces; // piece struct { UgList list; uint32_t index_end; } piece; }; void uget_a2cf_init (UgetA2cf* a2cf, uint64_t total_size); void uget_a2cf_clear (UgetA2cf* a2cf); // return TRUE if successful. int uget_a2cf_load (UgetA2cf* a2cf, const char* filename); int uget_a2cf_save (UgetA2cf* a2cf, const char* filename); // beg [in, out]: pass search position and return new begin position // end [out] : return end position int uget_a2cf_lack (UgetA2cf* a2cf, uint64_t* beg, uint64_t* end); uint64_t uget_a2cf_fill (UgetA2cf* a2cf, uint64_t beg, uint64_t end); uint64_t uget_a2cf_completed (UgetA2cf* a2cf); void uget_a2cf_insert (UgetA2cf* a2cf, UgetA2cfPiece* piece); UgetA2cfPiece* uget_a2cf_find (UgetA2cf* a2cf, uint32_t piece_index); UgetA2cfPiece* uget_a2cf_realloc (UgetA2cf* a2cf, uint32_t piece_index); #ifdef __cplusplus } #endif // __cplusplus #endif // End of UGET_A2CF_H uget-2.2.2/uget/UgetApp.h0000664000175000017500000002740313470304402012071 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_APP_H #define UGET_APP_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetApp UgetApp; // ---------------------------------------------------------------------------- // UgetApp #define UGET_APP_MEMBERS \ UgetNode real; \ UgetNode split; \ UgetNode sorted; \ UgetNode sorted_split; \ UgetNode mix; \ UgetNode mix_split; \ UgRegistry infos; \ UgRegistry plugins; \ UgetPluginInfo* plugin_default; \ UgetTask task; \ UgArrayPtr nodes; \ void* uri_hash; \ char* config_dir; \ int n_error; \ int n_moved; \ int n_deleted; \ int n_completed struct UgetApp { UGET_APP_MEMBERS; /* // ------ UgetApp members ------ UgetNode real; // real root node for real nodes UgetNode split; // virtual root UgetNode sorted; // virtual root UgetNode sorted_split; // virtual root UgetNode mix; // virtual root UgetNode mix_split; // virtual root UgRegistry infos; UgRegistry plugins; UgetPluginInfo* plugin_default; UgetTask task; UgArrayPtr nodes; void* uri_hash; char* config_dir; int n_error; // uget_app_grow() will count these value: int n_moved; // n_error, n_moved, n_deleted, and int n_deleted; // n_completed int n_completed; // */ }; void uget_app_init (UgetApp* app); void uget_app_final (UgetApp* app); // uget_app_grow() activate queue download // return number of active download int uget_app_grow (UgetApp* app, int no_queuing); // uget_app_trim() remove finished/recycled download that over capacity // return number of trimmed download int uget_app_trim (UgetApp* app, UgArrayPtr* deleted_nodes); void uget_app_set_config_dir (UgetApp* app, const char* dir); void uget_app_set_sorting (UgetApp* app, UgCompareFunc func, int reversed); void uget_app_set_notification (UgetApp* app, void* data, UgetNodeFunc inserted, UgetNodeFunc removed, UgNotifyFunc updated); // category functions // uget_app_move_category() return TRUE or FALSE void uget_app_add_category (UgetApp* app, UgetNode* cnode, int save_file); int uget_app_move_category (UgetApp* app, UgetNode* cnode, UgetNode* position); void uget_app_delete_category (UgetApp* app, UgetNode* cnode); void uget_app_stop_category (UgetApp* app, UgetNode* cnode); void uget_app_pause_category (UgetApp* app, UgetNode* cnode); void uget_app_resume_category (UgetApp* app, UgetNode* cnode); UgetNode* uget_app_match_category (UgetApp* app, UgUri* uuri, const char* file); // download functions: return TRUE or FALSE int uget_app_add_download_uri (UgetApp* app, const char* uri, UgetNode* cnode, int apply); int uget_app_add_download (UgetApp* app, UgetNode* dnode, UgetNode* cnode, int apply); int uget_app_move_download (UgetApp* app, UgetNode* dnode, UgetNode* dnode_position); int uget_app_move_download_to (UgetApp* app, UgetNode* dnode, UgetNode* cnode); int uget_app_delete_download (UgetApp* app, UgetNode* dnode, int delete_file); int uget_app_recycle_download (UgetApp* app, UgetNode* dnode); int uget_app_activate_download (UgetApp* app, UgetNode* dnode); int uget_app_pause_download (UgetApp* app, UgetNode* dnode); int uget_app_queue_download (UgetApp* app, UgetNode* dnode); void uget_app_reset_download_name (UgetApp* app, UgetNode* dnode); #ifdef NO_URI_HASH #define uget_app_use_uri_hash(app) #define uget_app_save_attachment(app, info, file, rename) #define uget_app_clear_attachment(app) #else void uget_app_use_uri_hash (UgetApp* app); char* uget_app_save_attachment(UgetApp* app, UgInfo* info, const char* file, const char* rename); void uget_app_clear_attachment (UgetApp* app); #endif // plug-in functions // uget_app_find_plugin() return TRUE or FALSE void uget_app_clear_plugins (UgetApp* app); void uget_app_add_plugin (UgetApp* app, const UgetPluginInfo* pinfo); void uget_app_remove_plugin (UgetApp* app, const UgetPluginInfo* pinfo); int uget_app_find_plugin (UgetApp* app, const char* name, const UgetPluginInfo** pinfo); void uget_app_set_default_plugin (UgetApp* app, const UgetPluginInfo* pinfo); UgetPluginInfo* uget_app_match_plugin (UgetApp* app, const char* uri, const UgetPluginInfo* exclude); // ---------------------------------------------------------------------------- // save/load categories // uget_app_save_category() return TRUE or FALSE int uget_app_save_category (UgetApp* app, UgetNode* cnode, const char* filename, void* jsonfile); UgetNode* uget_app_load_category (UgetApp* app, const char* filename, void* jsonfile); int uget_app_save_category_fd (UgetApp* app, UgetNode* cnode, int fd, void* jsonfile); UgetNode* uget_app_load_category_fd (UgetApp* app, int fd, void* jsonfile); // return number of category save/load int uget_app_save_categories (UgetApp* app, const char* folder); int uget_app_load_categories (UgetApp* app, const char* folder); // ---------------------------------------------------------------------------- // keeping status void uget_node_set_keeping (UgetNode* node, int enable); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct AppMethod { inline void init(void) { uget_app_init((UgetApp*)this); } inline void final(void) { uget_app_final((UgetApp*)this); } inline void grow(int noQueuing) { uget_app_grow((UgetApp*)this, noQueuing); } inline void trim(UgArrayPtr* deleted_nodes = NULL) { uget_app_trim((UgetApp*)this, deleted_nodes); } inline void setConfigDir(const char* dir) { uget_app_set_config_dir((UgetApp*)this, dir); } inline void setSorting(UgCompareFunc func, int reversed) { uget_app_set_sorting((UgetApp*)this, func, reversed); } inline void setNotification(void* data, UgetNodeFunc inserted, UgetNodeFunc removed, UgNotifyFunc updated) { uget_app_set_notification((UgetApp*)this, data, inserted, removed, updated); } inline void addCategory(UgetNode* cnode, int saveFile) { uget_app_add_category((UgetApp*)this, cnode, saveFile); } inline void moveCategory(UgetNode* cnode, UgetNode* position) { uget_app_move_category((UgetApp*)this, cnode, position); } inline void deleteCategory(UgetNode* cnode) { uget_app_delete_category((UgetApp*)this, cnode); } inline void stopCategory(UgetNode* cnode) { uget_app_stop_category((UgetApp*)this, cnode); } inline void pauseCategory(UgetNode* cnode) { uget_app_pause_category((UgetApp*)this, cnode); } inline void resumeCategory(UgetNode* cnode) { uget_app_resume_category((UgetApp*)this, cnode); } inline UgetNode* matchCategory(UgUri* uuri, const char* file) { return uget_app_match_category((UgetApp*)this, uuri, file); } inline int addDownload(const char* uri, UgetNode* cnode, int apply) { return uget_app_add_download_uri((UgetApp*)this, uri, cnode, apply); } inline int addDownload(UgetNode* dnode, UgetNode* cnode, int apply) { return uget_app_add_download((UgetApp*)this, dnode, cnode, apply); } inline int moveDownload(UgetNode* dnode, UgetNode* dnode_position) { return uget_app_move_download((UgetApp*)this, dnode, dnode_position); } inline int moveDownloadTo(UgetNode* dnode, UgetNode* cnode) { return uget_app_move_download_to((UgetApp*)this, dnode, cnode); } inline int deleteDownload(UgetNode* dnode, int deleteFile) { return uget_app_delete_download((UgetApp*)this, dnode, deleteFile); } inline int recycleDownload(UgetNode* dnode) { return uget_app_recycle_download((UgetApp*)this, dnode); } inline int activateDownload(UgetNode* dnode) { return uget_app_activate_download((UgetApp*)this, dnode); } inline int pauseDownload(UgetNode* dnode) { return uget_app_pause_download((UgetApp*)this, dnode); } inline int queueDownload(UgetNode* dnode) { return uget_app_queue_download((UgetApp*)this, dnode); } inline void resetDownloadName(UgetNode* dnode) { uget_app_reset_download_name((UgetApp*)this, dnode); } inline void useUriHash(void) { uget_app_use_uri_hash((UgetApp*)this); } inline void clearAttachment(void) { uget_app_clear_attachment((UgetApp*)this); } inline void clearPlugins(void) { uget_app_clear_plugins((UgetApp*)this); } inline void addPlugin(const UgetPluginInfo* pinfo) { uget_app_add_plugin((UgetApp*)this, pinfo); } inline void removePlugin(const UgetPluginInfo* pinfo) { uget_app_remove_plugin((UgetApp*)this, pinfo); } inline int findPlugin(const char* name, const UgetPluginInfo** pinfo) { return uget_app_find_plugin((UgetApp*)this, name, pinfo); } inline void setDefaultPlugin(const UgetPluginInfo* pinfo) { return uget_app_set_default_plugin((UgetApp*)this, pinfo); } inline UgetPluginInfo* matchPlugin(const char* uri, const UgetPluginInfo* exclude) { return uget_app_match_plugin((UgetApp*)this, uri, exclude); } inline int saveCategory(UgetNode* cnode, const char* filename, void* jsonfile) { return uget_app_save_category((UgetApp*)this, cnode, filename, jsonfile); } inline UgetNode* loadCategory(const char* filename, void* jsonfile) { return uget_app_load_category((UgetApp*)this, filename, jsonfile); } // return number of category save/load inline int saveCategories(const char* folder) { return uget_app_save_categories((UgetApp*)this, folder); } inline int loadCategories(const char* folder) { return uget_app_load_categories((UgetApp*)this, folder); } }; // This one is for directly use only. You can NOT derived it. struct App : AppMethod, UgetApp {}; }; // namespace Uget #endif // __cplusplus #endif // UGET_APP_H uget-2.2.2/uget/UgetNode.h0000664000175000017500000002720613470304402012237 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_NODE_H #define UGET_NODE_H #include // offsetof() #include // int16_t #include #include #include #ifdef __cplusplus extern "C" { #endif /* ---------------------------------------------------------------------------- UgetNode: extend from UgNode and add pointers (real, fake, and peer). * Tree chart 1: (parent and child nodes) Root --+-- Category1 --+-- Download1 (URI) | | | | | | | +-- Download2 (URI) | (torrent path) | | +-- Category2 --+-- Download3 (URI) | (metalink path) | | +-- Download4 (URI) * Tree chart 2: fake ----- peer -----> fake / / prev / prev / | / | / | / | / | / | / |/ |/ ... <---> parent <--------------> child <----> ... /| /| / | / | / | / | / | / | / | / | / next / next / / real real */ typedef struct UgetNode UgetNode; /* typedef struct UgetNodeControl UgetNodeControl; typedef struct UgetNodeNotifier UgetNodeNotifier; typedef struct UgetNodeSort UgetNodeSort; */ typedef void (*UgetNodeFunc)(UgetNode* node, UgetNode* sibling, UgetNode* child); extern const UgEntry UgetNodeEntry[]; typedef enum { UGET_GROUP_NULL = 0, UGET_GROUP_QUEUING = 1 << 0, UGET_GROUP_PAUSED = 1 << 1, UGET_GROUP_ACTIVE = 1 << 2, UGET_GROUP_COMPLETED = 1 << 3, UGET_GROUP_UPLOADING = 1 << 4, UGET_GROUP_ERROR = 1 << 5, UGET_GROUP_FINISHED = 1 << 6, UGET_GROUP_RECYCLED = 1 << 7, UGET_GROUP_MAJOR = UGET_GROUP_ACTIVE | UGET_GROUP_QUEUING | UGET_GROUP_FINISHED | UGET_GROUP_RECYCLED, UGET_GROUP_INACTIVE = UGET_GROUP_PAUSED | UGET_GROUP_ERROR, UGET_GROUP_UNRUNNABLE = UGET_GROUP_PAUSED | UGET_GROUP_ERROR | UGET_GROUP_FINISHED | UGET_GROUP_RECYCLED, UGET_GROUP_UNFINISHED = UGET_GROUP_ACTIVE | UGET_GROUP_UPLOADING, } UgetGroup; struct UgetNodeNotifier { // notify when node has inserted a child node. UgetNodeFunc inserted; // notify when node has removed a child node. UgetNodeFunc removed; // notify when a child node has updated. UgNotifyFunc updated; // UgNotifyFunc destroy; void* data; // extra data for user }; struct UgetNodeSort { UgCompareFunc compare; int reverse; // TRUE or FALSE }; struct UgetNodeControl { // struct UgetNodeControl* children; // control of children node struct UgetNodeNotifier* notifier; struct UgetNodeSort sort; // filter child of real node and decide how to insert child of fake node. // If real node inserted a child node, all fake nodes call this to filter. UgetNodeFunc filter; }; extern struct UgetNodeControl uget_node_default_control; extern struct UgetNodeNotifier uget_node_default_notifier; // ---------------------------------------------------------------------------- // UgetNode functions UgetNode* uget_node_new (UgetNode* node_real); void uget_node_free (UgetNode* node); void uget_node_init (UgetNode* node, UgetNode* node_real); void uget_node_final (UgetNode* node); void uget_node_clear_fake (UgetNode* node); void uget_node_clear_children (UgetNode* node); void uget_node_move (UgetNode* node, UgetNode* sibling, UgetNode* child); void uget_node_insert (UgetNode* node, UgetNode* sibling, UgetNode* child); void uget_node_remove (UgetNode* node, UgetNode* child); void uget_node_append (UgetNode* node, UgetNode* child); void uget_node_prepend (UgetNode* node, UgetNode* child); void uget_node_sort (UgetNode* node, UgCompareFunc cmp_func, int is_reversed); void uget_node_insert_sorted (UgetNode* node, UgetNode* child); void uget_node_reorder_by_real (UgetNode* node, UgetNode* real); void uget_node_reorder_by_fake (UgetNode* node, UgetNode* fake); void uget_node_remove_fake (UgetNode* node, UgetNode* fake); void uget_node_make_fake (UgetNode* node); #define uget_node_nth_child(node,nth) \ (UgetNode*) ug_node_nth_child((UgNode*)node, nth) #define uget_node_child_position(node,child) \ ug_node_child_position((UgNode*)node, (UgNode*)child) UgetNode* uget_node_nth_fake (UgetNode* node, int nth); int uget_node_fake_position (UgetNode* node, UgetNode* fake); // notify void uget_node_updated (UgetNode* node); // ---------------------------------------------------------------------------- // JSON parser used with UG_ENTRY_ARRAY. UgJsonError ug_json_parse_uget_node_children (UgJson* json, const char* name, const char* value, void* node, void* none); // JSON writer used with UG_ENTRY_ARRAY. void ug_json_write_uget_node_children (UgJson* json, const UgetNode* node); /* ---------------------------------------------------------------------------- compare functions for UgetNode.control.sort.compare and uget_node_sort() these function implemented in UgetNode-compare.c */ int uget_node_compare_name (UgetNode* node1, UgetNode* node2); int uget_node_compare_complete (UgetNode* node1, UgetNode* node2); int uget_node_compare_size (UgetNode* node1, UgetNode* node2); int uget_node_compare_percent (UgetNode* node1, UgetNode* node2); int uget_node_compare_elapsed (UgetNode* node1, UgetNode* node2); int uget_node_compare_left (UgetNode* node1, UgetNode* node2); int uget_node_compare_speed (UgetNode* node1, UgetNode* node2); int uget_node_compare_upload_speed (UgetNode* node1, UgetNode* node2); int uget_node_compare_uploaded (UgetNode* node1, UgetNode* node2); int uget_node_compare_ratio (UgetNode* node1, UgetNode* node2); int uget_node_compare_retry (UgetNode* node1, UgetNode* node2); int uget_node_compare_parent_name (UgetNode* node1, UgetNode* node2); int uget_node_compare_uri (UgetNode* node1, UgetNode* node2); int uget_node_compare_added_time (UgetNode* node1, UgetNode* node2); int uget_node_compare_completed_time (UgetNode* node1, UgetNode* node2); /* ---------------------------------------------------------------------------- callback functions for UgetNode.control.filter (they are used by UgetApp) these function implemented in UgetNode-filter.c */ void uget_node_filter_mix (UgetNode* node, UgetNode* sibling, UgetNode* child_real); void uget_node_filter_split (UgetNode* node, UgetNode* sibling, UgetNode* child_real); void uget_node_filter_mix_split (UgetNode* node, UgetNode* sibling, UgetNode* child_real); void uget_node_filter_sorted (UgetNode* node, UgetNode* sibling, UgetNode* child_real); /* uget_node_filter_split() v ,-----------. ,--------. | real node | ---> | filter | --+---> fake node (UGET_GROUP_ACTIVE) `-----------' `--------' | +---> fake node (UGET_GROUP_QUEUING) | +---> fake node (UGET_GROUP_FINISHED) | `---> fake node (UGET_GROUP_RECYCLED) * helper functions for uget_node_filter_split(), uget_node_filter_mix_split() uget_node_get_split() use 'group' (UgetGroup) to find fake node. uget_node_get_group() return UgetGroup if it is split fake node. */ UgetNode* uget_node_get_split(UgetNode* node, int group); int uget_node_get_group(UgetNode* node); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgetNode structure struct UgetNode { UG_NODE_MEMBERS(UgetNode, UgetNode, base); /* // ------ UgNode members ------ UgetNode* base; // the realest UgetNode (real->real->real-> ...) UgetNode* next; UgetNode* prev; UgetNode* parent; UgetNode* children; UgetNode* last; int n_children; */ UgetNode* real; UgetNode* fake; UgetNode* peer; UgInfo* info; struct UgetNodeControl* control; #ifdef __cplusplus inline void* operator new(size_t size, UgetNode* node_real = NULL) { return uget_node_new(node_real); } inline void operator delete(void* p) { uget_node_free((UgetNode*)p); } inline void init(UgetNode* node_real = NULL) { uget_node_init(this, node_real); } inline void final() { uget_node_final(this); } inline void clearFake(void) { uget_node_clear_fake(this); } inline void clearChildren(void) { uget_node_clear_children(this); } inline void move(UgetNode* sibling, UgetNode* child) { uget_node_move(this, sibling, child); } inline void insert(UgetNode* sibling, UgetNode* child) { uget_node_insert(this, sibling, child); } inline void remove(UgetNode* child) { uget_node_remove(this, child); } inline void append(UgetNode* child) { uget_node_append(this, child); } inline void prepend(UgetNode* child) { uget_node_prepend(this, child); } inline UgetNode* nthChild(int nth) { return uget_node_nth_child(this, nth); } inline int childPosition(UgetNode* child) { return uget_node_child_position(this, child); } inline UgetNode* nthFake(int nth) { return uget_node_nth_fake(this, nth); } inline int fakePosition(UgetNode* fake) { return uget_node_fake_position(this, fake); } inline UgetNode* getSplit(int group) { return uget_node_get_split(this, group); } inline int getGroup() { return uget_node_get_group(this); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { // This one is for directly use only. You can NOT derived it. typedef struct UgetNode Node; }; // namespace Uget #endif // __cplusplus #endif // UGET_NODE_H uget-2.2.2/uget/UgetCurl.c0000664000175000017500000007073713470304402012261 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #ifdef HAVE_LIBPWMD #include "pwmd.h" #endif // HAVE_LIBPWMD #define PROGRESS_COUNT_LIMIT 2 #define LOW_SPEED_LIMIT 128 #define LOW_SPEED_TIME 60 enum SchemeType { SCHEME_UNKNOWN, SCHEME_HTTP, SCHEME_FTP, }; // curl_easy_perform () -> progress callback -> connect // -> progress callback -> header callback // -> write callback -> progress callback // static size_t uget_curl_header_http0 (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl); static size_t uget_curl_header_http (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl); static size_t uget_curl_header_ftp0 (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl); static size_t uget_curl_output_none (char *buffer, size_t size, size_t nmemb, void* data); static size_t uget_curl_output_default (char *buffer, size_t size, size_t nmemb, void* data); static int uget_curl_progress (UgetCurl* ugcurl, double dltotal, double dlnow, double ultotal, double ulnow); #ifdef HAVE_LIBPWMD static int uget_curl_set_proxy_pwmd (UgetCurl* ugcurl, UgetProxy *proxy); #endif UgetCurl* uget_curl_new (void) { UgetCurl* ugcurl; ugcurl = ug_malloc0 (sizeof (UgetCurl)); ugcurl->self = ugcurl; ugcurl->curl = curl_easy_init (); curl_easy_setopt (ugcurl->curl, CURLOPT_ERRORBUFFER, ugcurl->error_string); // ugcurl->ftp_command = NULL; // ugcurl->ftp_command = curl_slist_append (ugcurl->ftp_command, "REST 10"); return ugcurl; } void uget_curl_free (UgetCurl* ugcurl) { if (ugcurl->curl) curl_easy_cleanup (ugcurl->curl); if (ugcurl->file.output) ug_fclose (ugcurl->file.output); if (ugcurl->file.post) ug_fclose (ugcurl->file.post); if (ugcurl->event) uget_event_free (ugcurl->event); ug_free (ugcurl->header.uri); ug_free (ugcurl->header.filename); ug_free (ugcurl); } static UgThreadResult uget_curl_thread (UgetCurl* ugcurl) { char* tempstr; CURLcode code; // perform do { ugcurl->restart = FALSE; code = curl_easy_perform (ugcurl->curl); curl_easy_getinfo (ugcurl->curl, CURLINFO_RESPONSE_CODE, &ugcurl->response); ugcurl->tested = TRUE; } while (ugcurl->restart); // free event if (ugcurl->event) { uget_event_free (ugcurl->event); ugcurl->event = NULL; } // HTTP response error code: 4xx Client Error, 5xx Server Error if (ugcurl->response >= 400 && ugcurl->scheme_type == SCHEME_HTTP) { ugcurl->state = UGET_CURL_ERROR; tempstr = ug_strdup_printf ("Server response code : %ld", ugcurl->response); ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_CUSTOM, tempstr); ug_free (tempstr); // discard data if remote site response error. ugcurl->pos = ugcurl->beg; ugcurl->size[0] = 0; goto exit; } switch (code) { case CURLE_OK: ugcurl->state = UGET_CURL_OK; break; // write error (out of disk space?) (exit) case CURLE_WRITE_ERROR: if (ugcurl->event_code > 0) { ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error (ugcurl->event_code, NULL); ugcurl->test_ok = FALSE; break; } // Don't break here // out of memory (exit) case CURLE_OUT_OF_MEMORY: ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_OUT_OF_RESOURCE, NULL); break; // abort download in progress callback case CURLE_ABORTED_BY_CALLBACK: // segment is completed or paused by user if (ugcurl->paused == FALSE) ugcurl->state = UGET_CURL_OK; else ugcurl->state = UGET_CURL_ABORT; break; // can resume (retry) case CURLE_RECV_ERROR: case CURLE_PARTIAL_FILE: case CURLE_OPERATION_TIMEDOUT: ugcurl->state = UGET_CURL_RETRY; break; // can't resume (retry) case CURLE_RANGE_ERROR: case CURLE_BAD_DOWNLOAD_RESUME: case CURLE_FTP_COULDNT_USE_REST: ugcurl->state = UGET_CURL_NOT_RESUMABLE; ugcurl->resumable = FALSE; break; #ifdef NO_RETRY_IF_CONNECT_FAILED // can't connect (error) case CURLE_COULDNT_CONNECT: ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_CONNECT_FAILED, ugcurl->error_string); goto exit; #else case CURLE_COULDNT_CONNECT: case CURLE_COULDNT_RESOLVE_HOST: #endif // retry case CURLE_SEND_ERROR: case CURLE_GOT_NOTHING: case CURLE_BAD_CONTENT_ENCODING: ugcurl->state = UGET_CURL_RETRY; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_CUSTOM, ugcurl->error_string); break; // too many redirection (exit) case CURLE_TOO_MANY_REDIRECTS: ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_CUSTOM, ugcurl->error_string); break; // exit case CURLE_UNSUPPORTED_PROTOCOL: ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_UNSUPPORTED_SCHEME, ugcurl->error_string); break; // other error (exit) #ifdef NO_RETRY_IF_CONNECT_FAILED case CURLE_COULDNT_RESOLVE_HOST: #endif case CURLE_COULDNT_RESOLVE_PROXY: case CURLE_FAILED_INIT: case CURLE_URL_MALFORMAT: case CURLE_FTP_WEIRD_SERVER_REPLY: case CURLE_REMOTE_ACCESS_DENIED: default: ugcurl->state = UGET_CURL_ERROR; ugcurl->event = uget_event_new_error ( UGET_EVENT_ERROR_CUSTOM, ugcurl->error_string); break; } exit: if (ugcurl->state == UGET_CURL_ERROR) ugcurl->test_ok = FALSE; ugcurl->stopped = TRUE; return UG_THREAD_RESULT; } void uget_curl_run (UgetCurl* ugcurl, int joinable) { CURL* curl; curl = ugcurl->curl; uget_curl_decide_login (ugcurl); ugcurl->pos = ugcurl->beg; ugcurl->state = UGET_CURL_READY; ugcurl->paused = FALSE; ugcurl->stopped = FALSE; // if thread stop, this value will be TRUE. ugcurl->response = 0; ugcurl->event_code = 0; ugcurl->progress_count = PROGRESS_COUNT_LIMIT; // reset download/upload speed ugcurl->speed[0] = 0; ugcurl->speed[1] = 0; // reset downloaded/uploaded size ugcurl->size[0] = 0; ugcurl->size[1] = 0; ug_free (ugcurl->header.uri); ug_free (ugcurl->header.filename); ugcurl->header.uri = NULL; ugcurl->header.filename = NULL; // Others ----------------------------------------------------------------- curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (curl, CURLOPT_FILETIME, 1L); // disable peer SSL certificate verification curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L); // SSL version and cipher // curl_easy_setopt (curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT); // curl_easy_setopt (curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_SSLv3); // curl_easy_setopt (curl, CURLOPT_SSL_CIPHER_LIST, "ALL:!aNULL:!LOW:!EXPORT:!SSLv2"); // curl_easy_setopt (curl, CURLOPT_SSL_CIPHER_LIST, "ALL"); // curl_easy_setopt (curl, CURLOPT_SSL_CIPHER_LIST, "SSLv3"); // low speed limit for unstable network curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT); curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME); // resume curl_easy_setopt (ugcurl->curl, CURLOPT_RESUME_FROM_LARGE, (curl_off_t) ugcurl->beg); // Progress -------------------------------------------------------------- curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, (curl_progress_callback) uget_curl_progress); curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, ugcurl); curl_easy_setopt (curl, CURLOPT_NOPROGRESS, FALSE); // Header ----------------------------------------------------------------- if (ugcurl->tested) { switch (ugcurl->scheme_type) { case SCHEME_HTTP: curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) uget_curl_header_http); curl_easy_setopt (curl, CURLOPT_HEADERDATA, ugcurl); break; default: curl_easy_setopt (curl, CURLOPT_POSTQUOTE, NULL); curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, NULL); curl_easy_setopt (curl, CURLOPT_HEADERDATA, NULL); break; } } else { // setup by scheme type switch (ugcurl->scheme_type) { case SCHEME_HTTP: curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) uget_curl_header_http0); curl_easy_setopt (curl, CURLOPT_HEADERDATA, ugcurl); break; case SCHEME_FTP: // curl_easy_setopt (curl, CURLOPT_POSTQUOTE, // ugcurl->ftp_command); curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) uget_curl_header_ftp0); curl_easy_setopt (curl, CURLOPT_HEADERDATA, ugcurl); break; default: curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, NULL); curl_easy_setopt (curl, CURLOPT_HEADERDATA, NULL); break; } } // Speed limit ------------------------------------------------------------ if (ugcurl->limit_changed) { curl_easy_setopt (ugcurl->curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) ugcurl->limit[0]); curl_easy_setopt (ugcurl->curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t) ugcurl->limit[1]); ugcurl->limit_changed = FALSE; } // Output ----------------------------------------------------------------- curl_easy_setopt (curl, CURLOPT_NOBODY, 0L); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, uget_curl_output_default); curl_easy_setopt (curl, CURLOPT_WRITEDATA, ugcurl); ug_thread_create (&ugcurl->thread, (UgThreadFunc)uget_curl_thread, ugcurl); if (joinable == FALSE) ug_thread_unjoin (&ugcurl->thread); } int uget_curl_open_file (UgetCurl* ugcurl, const char* file_path) { FILE* output_file; if (ugcurl->file.output) return TRUE; if (file_path) { output_file = ug_fopen (file_path, "rb+"); if (output_file == NULL) return FALSE; ugcurl->file.output = output_file; } return TRUE; } void uget_curl_close_file (UgetCurl* ugcurl) { if (ugcurl->file.output) { ug_fclose (ugcurl->file.output); ugcurl->file.output = NULL; } } void uget_curl_set_url (UgetCurl* ugcurl, const char* uri) { curl_easy_setopt (ugcurl->curl, CURLOPT_URL, uri); uget_curl_decide_scheme (ugcurl, uri); ugcurl->tested = FALSE; ugcurl->resumable = FALSE; } void uget_curl_set_speed (UgetCurl* ugcurl, int64_t dlspeed, int64_t ulspeed) { ugcurl->limit[0] = dlspeed; ugcurl->limit[1] = ulspeed; ugcurl->limit_changed = TRUE; } void uget_curl_set_common (UgetCurl* ugcurl, UgetCommon* common) { CURL* curl; curl = ugcurl->curl; ugcurl->common = common; if (common == NULL) return; curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, common->connect_timeout); curl_easy_setopt (curl, CURLOPT_URL, common->uri); uget_curl_decide_scheme (ugcurl, common->uri); // debug if (common->debug_level) curl_easy_setopt(ugcurl->curl, CURLOPT_VERBOSE, 1L); // speed control uget_curl_set_speed (ugcurl, common->max_download_speed, common->max_upload_speed); // curl_easy_setopt (curl, CURLOPT_MAX_RECV_SPEED_LARGE, // (curl_off_t) common->max_download_speed); // curl_easy_setopt (curl, CURLOPT_MAX_SEND_SPEED_LARGE, // (curl_off_t) common->max_upload_speed); // I don't set common->user & common->password here because // uget_curl_decide_login() will decide to use one of below login data // common->user & common->password // http->user & http->password // ftp->user & ftp->password } void uget_curl_set_proxy (UgetCurl* ugcurl, UgetProxy* proxy) { #ifdef HAVE_LIBPWMD if (proxy->type == UGET_PROXY_PWMD) { uget_curl_set_proxy_pwmd (ugcurl, proxy); return; } #endif ug_curl_set_proxy (ugcurl->curl, proxy); } int uget_curl_set_http (UgetCurl* ugcurl, UgetHttp* http) { CURL* curl; curl = ugcurl->curl; ugcurl->http = http; curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt (curl, CURLOPT_AUTOREFERER, 1L); curl_easy_setopt (curl, CURLOPT_MAXREDIRS, 30L); if (http) { // if (http->referrer == NULL && ugcurl->uri.part.fragment != -1) { // http->referrer = ug_strndup (temp.common->uri, // ugcurl->uri.part.fragment); // } curl_easy_setopt (curl, CURLOPT_REFERER, http->referrer); // if (http->redirection_limit) curl_easy_setopt (curl, CURLOPT_MAXREDIRS, http->redirection_limit); if (http->user_agent) curl_easy_setopt (curl, CURLOPT_USERAGENT, http->user_agent); // else { // curl_easy_setopt (curl, CURLOPT_USERAGENT, // "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"); // curl_easy_setopt (curl, CURLOPT_USERAGENT, // "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;" // " .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); // } // cookie if (http->cookie_data) curl_easy_setopt (curl, CURLOPT_COOKIE, http->cookie_data); else if (http->cookie_file) curl_easy_setopt (curl, CURLOPT_COOKIEFILE, http->cookie_file); else curl_easy_setopt (curl, CURLOPT_COOKIEFILE, ""); if (http->post_data) { curl_easy_setopt (curl, CURLOPT_POST, 1L); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, http->post_data); curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen (http->post_data)); } else if (http->post_file) { ugcurl->file.post = ug_fopen (http->post_file, "r"); if (ugcurl->file.post == NULL) return FALSE; curl_easy_setopt (curl, CURLOPT_POST, 1L); curl_easy_setopt (curl, CURLOPT_READDATA, ugcurl->file.post); #if defined(_MSC_VER) && !defined(__MINGW32__) // for MS VC only curl_easy_setopt (curl, CURLOPT_READFUNCTION , fread); #endif } } // I don't set http->user & http->password here because // uget_curl_decide_login() will decide to use one of below login data // common->user & common->password // http->user & http->password // ftp->user & ftp->password return TRUE; } void uget_curl_set_ftp (UgetCurl* ugcurl, UgetFtp* ftp) { CURL* curl; curl = ugcurl->curl; ugcurl->ftp = ftp; if (ftp && ftp->active_mode) { // FTP Active Mode // use EPRT and then LPRT before using PORT curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, TRUE); // '-' symbol to let the library use your system's default IP address. curl_easy_setopt (curl, CURLOPT_FTPPORT, "-"); } else { // FTP Passive Mode // use PASV command in IPv4 server. (Passive Mode) // don't use EPSV command. (Extended Passive Mode) curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, FALSE); // don't use EPRT and LPRT command. curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, FALSE); // don't use PORT command. curl_easy_setopt (curl, CURLOPT_FTPPORT, NULL); } // I don't set ftp->user & ftp->password here because // uget_curl_decide_login() will decide to use one of below login data // common->user & common->password // http->user & http->password // ftp->user & ftp->password } void uget_curl_decide_scheme (UgetCurl* ugcurl, const char* uri) { int length; ugcurl->scheme_type = SCHEME_UNKNOWN; if (uri == NULL) return; length = ug_uri_init (&ugcurl->uri.part, uri); if (length >= 3 && strncasecmp (uri, "ftp", 3) == 0) ugcurl->scheme_type = SCHEME_FTP; else if (length >= 4 && strncasecmp (uri, "http", 4) == 0) ugcurl->scheme_type = SCHEME_HTTP; } void uget_curl_decide_login (UgetCurl* ugcurl) { CURL* curl; union { UgetCommon* common; UgetHttp* http; UgetFtp* ftp; } temp; curl = ugcurl->curl; // curl_easy_setopt (curl, CURLOPT_LOGIN_OPTIONS, "AUTH=NTLM"); // ------------------------------------------------------------------------ // common temp.common = ugcurl->common; if (temp.common) { if ((temp.common->user && temp.common->user[0]) || (temp.common->password && temp.common->password[0])) { // set user & password by common data curl_easy_setopt (curl, CURLOPT_USERNAME, (temp.common->user) ? temp.common->user : ""); curl_easy_setopt (curl, CURLOPT_PASSWORD, (temp.common->password) ? temp.common->password : ""); // Don't set CURLOPT_HTTPAUTH to a bitmask // Don't use CURLAUTH_ANY, it causes authentication failed. // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); } else { // clear user & password (for HTTP redirection) curl_easy_setopt (curl, CURLOPT_USERNAME, NULL); curl_easy_setopt (curl, CURLOPT_PASSWORD, NULL); } } // ------------------------------------------------------------------------ // http temp.http = ugcurl->http; if (temp.http && ugcurl->scheme_type == SCHEME_HTTP) { if ((temp.http->user && temp.http->user[0]) || (temp.http->password && temp.http->password[0])) { curl_easy_setopt (curl, CURLOPT_USERNAME, (temp.http->user) ? temp.http->user : ""); curl_easy_setopt (curl, CURLOPT_PASSWORD, (temp.http->password) ? temp.http->password : ""); // Don't set CURLOPT_HTTPAUTH to a bitmask // Don't use CURLAUTH_ANY, it causes authentication failed. // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); // curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); return; } } // ------------------------------------------------------------------------ // ftp temp.ftp = ugcurl->ftp; if (temp.ftp && ugcurl->scheme_type == SCHEME_FTP) { // set FTP user & password if ((temp.ftp->user && temp.ftp->user[0]) || (temp.ftp->password && temp.ftp->password[0])) { curl_easy_setopt (curl, CURLOPT_USERNAME, (temp.ftp->user) ? temp.ftp->user : ""); curl_easy_setopt (curl, CURLOPT_PASSWORD, (temp.ftp->password) ? temp.ftp->password : ""); return; } } } void ug_curl_set_proxy (CURL* curl, UgetProxy* proxy) { if (proxy == NULL) return; // proxy type switch (proxy->type) { case UGET_PROXY_NONE: curl_easy_setopt (curl, CURLOPT_PROXYTYPE, 0); break; default: case UGET_PROXY_DEFAULT: case UGET_PROXY_HTTP: curl_easy_setopt (curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); break; case UGET_PROXY_SOCKS4: curl_easy_setopt (curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); break; case UGET_PROXY_SOCKS5: curl_easy_setopt (curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); break; } curl_easy_setopt (curl, CURLOPT_PROXY, proxy->host); if (proxy->port) curl_easy_setopt (curl, CURLOPT_PROXYPORT, proxy->port); else curl_easy_setopt (curl, CURLOPT_PROXYPORT, 80); // proxy user and password if ((proxy->user && proxy->user[0]) || (proxy->password && proxy->password[0]) || proxy->type == UGET_PROXY_SOCKS4 || proxy->type == UGET_PROXY_SOCKS5) { curl_easy_setopt (curl, CURLOPT_PROXYUSERNAME, (proxy->user) ? proxy->user : ""); curl_easy_setopt (curl, CURLOPT_PROXYPASSWORD, (proxy->password) ? proxy->password : ""); } else { curl_easy_setopt (curl, CURLOPT_PROXYUSERNAME, NULL); curl_easy_setopt (curl, CURLOPT_PROXYPASSWORD, NULL); } } // ---------------------------------------------------------------------------- // static functions static size_t uget_curl_header_http (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl) { long response; curl_easy_getinfo (ugcurl->curl, CURLINFO_RESPONSE_CODE, &response); // This will abort the transfer and return CURL_WRITE_ERROR. if (response >= 400) { ugcurl->response = response; return 0; } else { // It doesn't need to parse HTTP header now. curl_easy_setopt (ugcurl->curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) NULL); curl_easy_setopt (ugcurl->curl, CURLOPT_HEADERDATA, NULL); } return (size_t)(size * nmemb); } static size_t uget_curl_header_http0 (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl) { char* file; char* temp; int length; file = NULL; length = strlen (buffer); if (ugcurl->response == 0) { curl_easy_getinfo (ugcurl->curl, CURLINFO_RESPONSE_CODE, &ugcurl->response); // This will abort the transfer and return CURL_WRITE_ERROR. if (ugcurl->response >= 400) return 0; } if (length > 15 && strncasecmp (buffer, "Accept-Ranges: ", 15) == 0) { buffer += 15; if (strncasecmp (buffer, "none", 4) == 0) ugcurl->resumable = FALSE; else ugcurl->resumable = TRUE; } else if (length > 14 && strncasecmp (buffer, "Content-Type: ", 14) == 0) { buffer += 14; length = strcspn (buffer, "\r\n"); if (length >= 9 && strncasecmp (buffer, "text/html", 9) == 0) ugcurl->html = TRUE; else ugcurl->html = FALSE; } // handle HTTP header "Location:" else if (length > 10 && strncasecmp (buffer, "Location: ", 10) == 0) { // exclude header and character '\r', '\n' buffer += 10; length = strcspn (buffer, "\r\n"); if (ugcurl->header_store) { ug_free (ugcurl->header.uri); ugcurl->header.uri = ug_strndup (buffer, length); uget_curl_decide_scheme (ugcurl, ugcurl->header.uri); } else { temp = ug_strndup (buffer, length); uget_curl_decide_scheme (ugcurl, temp); ug_free (temp); } // decide login data (user & password) by scheme uget_curl_decide_login (ugcurl); // uget_curl_decide_scheme() has called ug_uri_init() // to initialize ugcurl->uri.part // ug_uri_init (&ugcurl->uri.part, ugcurl->header.uri); if (ugcurl->uri.part.file != -1 && ugcurl->header_store) { ug_free (ugcurl->header.filename); ugcurl->header.filename = ug_uri_get_file (&ugcurl->uri.part); } if (ugcurl->scheme_type == SCHEME_FTP) { curl_easy_setopt (ugcurl->curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) uget_curl_header_ftp0); } } // handle HTTP header "Content-Location:" else if (length > 18 && strncasecmp (buffer, "Content-Location: ", 18) == 0) { // exclude header and character '\r', '\n' buffer += 18; temp = ug_strndup (buffer, strcspn (buffer, "\r\n")); ug_uri_init (&ugcurl->uri.part, temp); if (ugcurl->uri.part.file != -1 && ugcurl->header_store) { ug_free (ugcurl->header.filename); ugcurl->header.filename = ug_uri_get_file (&ugcurl->uri.part); } ug_free (temp); } // handle HTTP header "Content-Disposition:" else if (length > 21 && strncasecmp (buffer, "Content-Disposition: ", 21) == 0) { // exclude header and character '\r', '\n' buffer += 21; buffer = ug_strndup (buffer, strcspn (buffer, "\r\n")); // grab filename file = strstr (buffer, "filename="); if (file) { file += 9; // value of "filename=" if (file[0] != '\"') temp = ug_strndup (file, strcspn (file, ";")); else { file += 1; temp = ug_strndup (file, strcspn (file, "\"")); } // grab filename ug_uri_init (&ugcurl->uri.part, temp); if (ugcurl->uri.part.file != -1 && ugcurl->header_store) { ug_free (ugcurl->header.filename); ugcurl->header.filename = ug_uri_get_file (&ugcurl->uri.part); } ug_free (temp); } ug_free (buffer); } return nmemb * size; } static size_t uget_curl_header_ftp0 (char *buffer, size_t size, size_t nmemb, UgetCurl* ugcurl) { // REST command response "350 xxxx" if FTP server support REST if (strncmp (buffer, "350", 3) == 0) { ugcurl->resumable = TRUE; curl_easy_setopt (ugcurl->curl, CURLOPT_HEADERFUNCTION, (curl_write_callback) uget_curl_output_none); curl_easy_setopt (ugcurl->curl, CURLOPT_HEADERDATA, NULL); } return nmemb * size; } static size_t uget_curl_output_none (char *buffer, size_t size, size_t nmemb, void* data) { return nmemb * size; } static size_t uget_curl_output_default (char *buffer, size_t size, size_t nmemb, void* data) { UgetCurl* ugcurl = data; FILE* file; ugcurl->tested = TRUE; // This URL was tested. // prepare if (ugcurl->prepare.func && ugcurl->prepare.func (ugcurl, ugcurl->prepare.data) == FALSE) { return 0; } ugcurl->test_ok = TRUE; // This URL is OK. file = ugcurl->file.output; if (file == NULL) { ugcurl->event_code = UGET_EVENT_ERROR_NO_OUTPUT_FILE; // This will abort the transfer and return CURL_WRITE_ERROR. return 0; } // file offset ug_fseek (file, ugcurl->pos, SEEK_SET); #if defined(_MSC_VER) && !defined(__MINGW32__) // for MS VC only curl_easy_setopt (ugcurl->curl, CURLOPT_WRITEFUNCTION, fwrite); #else curl_easy_setopt (ugcurl->curl, CURLOPT_WRITEFUNCTION, NULL); #endif curl_easy_setopt (ugcurl->curl, CURLOPT_WRITEDATA, file); return fwrite (buffer, size, nmemb, file); } static int uget_curl_progress (UgetCurl* ugcurl, double dltotal, double dlnow, double ultotal, double ulnow) { int64_t dlsize, ulsize; dlsize = (int64_t) dlnow; ulsize = (int64_t) ulnow; ugcurl->pos = ugcurl->beg + dlsize; ugcurl->size[1] = ulsize; if (dlsize > 0 || ulsize > 0) ugcurl->state = UGET_CURL_RUN; ugcurl->progress_count++; if (ugcurl->progress_count > PROGRESS_COUNT_LIMIT) { ugcurl->progress_count = 0; curl_easy_getinfo (ugcurl->curl, CURLINFO_SPEED_UPLOAD, &ulnow); curl_easy_getinfo (ugcurl->curl, CURLINFO_SPEED_DOWNLOAD, &dlnow); ugcurl->speed[0] = (int64_t) dlnow; ugcurl->speed[1] = (int64_t) ulnow; } // speed limit changed if (ugcurl->limit_changed) { curl_easy_setopt (ugcurl->curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) ugcurl->limit[0]); curl_easy_setopt (ugcurl->curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t) ugcurl->limit[1]); ugcurl->limit_changed = FALSE; } // Returning a non-zero value from this callback will cause libcurl // to abort the transfer and return CURLE_ABORTED_BY_CALLBACK. if (ugcurl->end > 0 && ugcurl->pos >= ugcurl->end) { ugcurl->pos = ugcurl->end; ugcurl->size[0] = ugcurl->pos - ugcurl->beg; return 1; } ugcurl->size[0] = ugcurl->pos - ugcurl->beg; if (ugcurl->paused) return 1; return 0; } // ---------------------------------------------------------------------------- // PWMD // #ifdef HAVE_LIBPWMD static int uget_curl_set_proxy_pwmd (UgetCurl* ugcurl, UgetProxy* proxy) { CURL* curl; struct pwmd_proxy_s pwmd; gpg_error_t rc; curl = ugcurl->curl; memset(&pwmd, 0, sizeof(pwmd)); rc = ug_set_pwmd_proxy_options(&pwmd, proxy); if (rc) goto fail; // proxy host and port curl_easy_setopt (curl, CURLOPT_PROXY, pwmd.hostname); curl_easy_setopt (curl, CURLOPT_PROXYPORT, pwmd.port); // proxy user and password if (pwmd.username || pwmd.password || !strcasecmp(pwmd.type, "socks4") || !strcasecmp(pwmd.type, "socks5")) { curl_easy_setopt (curl, CURLOPT_PROXYUSERNAME, (pwmd.username) ? pwmd.username : ""); curl_easy_setopt (curl, CURLOPT_PROXYPASSWORD, (pwmd.password) ? pwmd.password : ""); } else { curl_easy_setopt (curl, CURLOPT_PROXYUSERNAME, NULL); curl_easy_setopt (curl, CURLOPT_PROXYPASSWORD, NULL); } if (!strcasecmp(pwmd.type, "socks4")) curl_easy_setopt (curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); else if (!strcasecmp(pwmd.type, "socks5")) curl_easy_setopt (curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); ug_close_pwmd(&pwmd); return TRUE; fail: ug_close_pwmd(&pwmd); ugcurl->state = UGET_CURL_ERROR; gchar *e = ug_strdup_printf("Pwmd ERR %u: %s", rc, gpg_strerror(rc)); ugcurl->event = uget_event_new_error (UGET_EVENT_ERROR_CUSTOM, e); g_free(e); return FALSE; } #endif // HAVE_LIBPWMD uget-2.2.2/uget/UgetTask.c0000664000175000017500000002604413470304403012247 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // static function static int uget_task_dispatch1(UgetTask* task, UgetNode* node, UgetPlugin* plugin); void uget_task_init(UgetTask* task) { int count; ug_slinks_init((UgSLinks*) task, 32); for (count = 0; count < UGET_TASK_N_WATCH; count++) { task->watch[count].func = NULL; task->watch[count].data = NULL; } // current speed & speed limit task->speed.download = 0; task->speed.upload = 0; task->limit.download = 0; task->limit.upload = 0; } void uget_task_final(UgetTask* task) { uget_task_remove_all(task); // ug_slinks_final((UgSLinks*) task); ug_array_clear(task); } int uget_task_add(UgetTask* task, UgetNode* node, const UgetPluginInfo* info) { UgetRelation* relation; int dlul_int_array[2]; int temp_int_array[2]; union { UgetProgress* progress; UgetCommon* common; } temp; // UgetRelation: check exist plug-in relation = ug_info_realloc(node->info, UgetRelationInfo); if (relation->task) return FALSE; // UgetProgress: clear progress when it completed temp.progress = ug_info_get(node->info, UgetProgressInfo); if (temp.progress) { // reset progress if it's percent is 100%. if (temp.progress->percent == 100) { temp.progress->percent = 0; temp.progress->uploaded = 0; temp.progress->complete = 0; temp.progress->total = 0; } temp.progress->download_speed = 0; temp.progress->upload_speed = 0; } // UgetCommon: clear retry_count temp.common = ug_info_get(node->info, UgetCommonInfo); if (temp.common) temp.common->retry_count = 0; // create plug-in and control it relation->task = ug_malloc0(sizeof(struct UgetRelationTask)); relation->task->plugin = uget_plugin_new(info); uget_plugin_accept(relation->task->plugin, node->info); if (task->limit.download || task->limit.upload) { // backup current speed limit temp_int_array[0] = task->limit.download; temp_int_array[1] = task->limit.upload; // set speed limit for existing task dlul_int_array[0] = task->limit.download / (task->n_links + 1); dlul_int_array[1] = task->limit.upload / (task->n_links + 1); uget_task_set_speed(task, temp_int_array[0] - dlul_int_array[0], temp_int_array[1] - dlul_int_array[1]); // set speed limit for new task uget_plugin_ctrl_speed(relation->task->plugin, dlul_int_array); // restore current speed limit task->limit.download = temp_int_array[0]; task->limit.upload = temp_int_array[1]; } if (uget_plugin_start(relation->task->plugin) == FALSE) { // dispatch error message from plug-in uget_task_dispatch1(task, node, relation->task->plugin); // release plug-in uget_plugin_unref(relation->task->plugin); // free task runtime data ug_free(relation->task); relation->task = NULL; return FALSE; } ug_slinks_add((UgSLinks*) task, node); return TRUE; } int uget_task_remove(UgetTask* task, UgetNode* node) { UgSLink* prev; UgetRelation* relation; if (ug_slinks_find((UgSLinks*) task, node, &prev)) { ug_slinks_remove((UgSLinks*) task, node, prev); // UgetRelation relation = ug_info_get(node->info, UgetRelationInfo); if (relation) { // uget_plugin_post(relation->task->plugin, // uget_event_new_state(node, UGET_GROUP_QUEUING)); uget_plugin_stop(relation->task->plugin); uget_plugin_unref(relation->task->plugin); relation->group &= ~UGET_GROUP_ACTIVE; // free task runtime data ug_free(relation->task); relation->task = NULL; } return TRUE; } return FALSE; } void uget_task_remove_all(UgetTask* task) { while (task->used) uget_task_remove(task, task->used->data); } static int uget_task_dispatch1(UgetTask* task, UgetNode* node, UgetPlugin* plugin) { UgetRelation* relation; UgetEvent* event; UgetEvent* next; int active; union { int count; UgetLog* log; UgetFiles* files; } temp; active = uget_plugin_sync(plugin, node->info); // update UgetFiles temp.files = ug_info_get(node->info, UgetFilesInfo); if (temp.files) uget_files_erase_deleted(temp.files); // plug-in was paused by user (see function uget_app_pause_download) relation = ug_info_realloc(node->info, UgetRelationInfo); if (relation->group & UGET_GROUP_PAUSED) active = FALSE; // plug-in has stopped if uget_plugin_sync() return FALSE. if (active == FALSE) relation->group &= ~UGET_GROUP_ACTIVE; event = uget_plugin_pop(plugin); for (; event; event = next) { for (temp.count = 0; temp.count < UGET_TASK_N_WATCH; temp.count++) { if (task->watch[temp.count].func) { task->watch[temp.count].func(task, event, node, task->watch[temp.count].data); } } // unlink current UgetEvent next = event->next; event->next = NULL; event->prev = NULL; switch (event->type) { case UGET_EVENT_ERROR: relation->group |= UGET_GROUP_ERROR; // don't break here case UGET_EVENT_WARNING: case UGET_EVENT_NORMAL: temp.log = ug_info_realloc(node->info, UgetLogInfo); ug_list_prepend(&temp.log->messages, (UgLink*) event); break; case UGET_EVENT_START: relation->group |= UGET_GROUP_ACTIVE; uget_event_free(event); break; case UGET_EVENT_STOP: relation->group &= ~UGET_GROUP_ACTIVE; uget_event_free(event); active = FALSE; break; case UGET_EVENT_COMPLETED: relation->group |= UGET_GROUP_COMPLETED; uget_event_free(event); break; case UGET_EVENT_UPLOADING: relation->group |= UGET_GROUP_UPLOADING; uget_event_free(event); break; case UGET_EVENT_STOP_UPLOADING: relation->group &= ~UGET_GROUP_UPLOADING; uget_event_free(event); break; default: uget_event_free(event); break; } } return active; } void uget_task_dispatch(UgetTask* task) { UgSLink* link; UgetNode* node; UgetProgress* progress; UgetRelation* relation; task->speed.download = 0; task->speed.upload = 0; for (link = task->used; link; link = link->next) { node = link->data; relation = ug_info_get(node->info, UgetRelationInfo); if (uget_task_dispatch1(task, node, relation->task->plugin) == FALSE) continue; // speed progress = ug_info_get(node->info, UgetProgressInfo); if (progress) { task->speed.download += progress->download_speed; task->speed.upload += progress->upload_speed; relation->task->speed[0] = progress->download_speed; relation->task->speed[1] = progress->upload_speed; } } } void uget_task_add_watch(UgetTask* task, UgetWatchFunc func, void* data) { int count; for (count = 0; count < UGET_TASK_N_WATCH; count++) { if (task->watch[count].func) continue; task->watch[count].func = func; task->watch[count].data = data; break; } } // ---------------------------------------------------------------------------- // speed control #define SPEED_MIN 512 static void uget_task_disable_limit_index(UgetTask* task, int idx); static void uget_task_adjust_speed_index(UgetTask* task, int idx, int limit_new); void uget_task_set_speed(UgetTask* task, int dl_speed, int ul_speed) { // download task->limit.download = dl_speed; if (dl_speed == 0) uget_task_disable_limit_index(task, 0); else if (task->n_links > 0) uget_task_adjust_speed_index(task, 0, dl_speed - task->speed.download); // upload task->limit.upload = ul_speed; if (ul_speed == 0) uget_task_disable_limit_index(task, 1); else if (task->n_links > 0) uget_task_adjust_speed_index(task, 1, ul_speed - task->speed.upload); } void uget_task_adjust_speed(UgetTask* task) { if (task->n_links == 0) return; if (task->limit.download > 0) uget_task_adjust_speed_index(task, 0, task->limit.download - task->speed.download); if (task->limit.upload > 0) uget_task_adjust_speed_index(task, 1, task->limit.upload - task->speed.upload); } static void uget_task_adjust_speed_index(UgetTask* task, int idx, int remain) { UgSLink* link; UgetNode* node; UgetRelation* relation = NULL; UgetRelation* prev = NULL; int n_piece = 0; if (remain > 0) { // increase speed by priority for (link = task->used; link; link = link->next) { node = (UgetNode*) link->data; relation = ug_info_get(node->info, UgetRelationInfo); relation->task->prev = prev; prev = relation; n_piece += relation->priority + 1; } remain = remain / n_piece; for (; relation; relation = prev) { relation->task->limit[idx] = relation->task->speed[idx] + remain * (relation->priority+1); if (relation->task->limit[idx] < SPEED_MIN) relation->task->limit[idx] = SPEED_MIN; uget_plugin_ctrl_speed(relation->task->plugin, relation->task->limit); prev = relation->task->prev; relation->task->prev = NULL; } } else { // reduce speed remain = remain / task->n_links; for (link = task->used; link; link = link->next) { node = (UgetNode*) link->data; relation = ug_info_get(node->info, UgetRelationInfo); relation->task->limit[idx] = relation->task->speed[idx] + remain; if (relation->task->limit[idx] < SPEED_MIN) relation->task->limit[idx] = SPEED_MIN; uget_plugin_ctrl_speed(relation->task->plugin, relation->task->limit); } } } static void uget_task_disable_limit_index(UgetTask* task, int idx) { UgSLink* link; UgetNode* node; UgetRelation* relation; for (link = task->used; link; link = link->next) { node = (UgetNode*) link->data; relation = ug_info_get(node->info, UgetRelationInfo); relation->task->limit[idx] = 0; uget_plugin_ctrl_speed(relation->task->plugin, relation->task->limit); } } uget-2.2.2/uget/UgetPluginEmpty.h0000664000175000017500000000640013470304402013620 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_EMPTY_H #define UGET_PLUGIN_EMPTY_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginEmpty UgetPluginEmpty; extern const UgetPluginInfo* UgetPluginEmptyInfo; typedef enum { UGET_PLUGIN_EMPTY_GLOBAL = UGET_PLUGIN_GLOBAL_DERIVED, // begin // your setting ID... } UgetPluginEmptyCode; /* ---------------------------------------------------------------------------- UgetPluginEmpty: an empty plug-in. It derived from UgetPlugin. UgType | `--- UgetPlugin | `--- UgetPluginEmpty */ struct UgetPluginEmpty { UGET_PLUGIN_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; */ UgetCommon* common; // speed limit control // limit[0] = download speed limit // limit[1] = upload speed limit int limit[2]; uint8_t limit_changed; }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const PluginInfo* const PluginEmptyInfo = (const PluginInfo*) UgetPluginEmptyInfo; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginEmptyMethod : PluginMethod {}; // This one is for directly use only. You can NOT derived it. struct PluginEmpty : PluginEmptyMethod, UgetPluginEmpty { inline void* operator new(size_t size) { return uget_plugin_new(PluginEmptyInfo); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_EMPTY_H uget-2.2.2/uget/UgetRss.c0000664000175000017500000003463413470304403012120 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #define UGET_RSS_URL_STABLE "http://feeds.feedburner.com/uget/stable?format=xml" #define UGET_RSS_URL_DEVELMENT "http://feeds.feedburner.com/uget/development?format=xml" #define UGET_RSS_URL_NEWS "http://feeds.feedburner.com/uget/news?format=xml" #define UGET_RSS_URL_TUTORIALS "http://feeds.feedburner.com/uget/tutorials?format=xml" #define UGET_RSS_URL_ALL "http://feeds.feedburner.com/uget/all?format=xml" // ---------------------------------------------------------------------------- // link void ug_html_start_element_rss_link (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { const char* rel = NULL; const char* href = NULL; const char* type = NULL; int index; // if string already exist if (*(void**)dest) { ug_html_push (uhtml, &ug_html_parser_unknown, dest, NULL); return; } // RSS 2.0 if (attribute_names[0] == NULL) { ug_html_push (uhtml, &ug_html_parser_string, dest, NULL); return; } // Atom for (index = 0; attribute_names[index]; index++) { if (strcmp (attribute_names[index], "rel") == 0) rel = attribute_values[index]; else if (strcmp (attribute_names[index], "href") == 0) href = attribute_values[index]; else if (strcmp (attribute_names[index], "type") == 0) type = attribute_values[index]; if (type == NULL || href == NULL || rel == NULL) continue; if (strcmp (type, "text/html") != 0) continue; if (strcmp (rel, "alternate") != 0) continue; *(char**) dest = ug_strdup (href); } ug_html_push (uhtml, &ug_html_parser_unknown, NULL, NULL); } // ---------------------------------------------------------------------------- // Rss (ATOM ) const UgHtmlEntry UgHtmlEntryRssItem[] = { {"title", offsetof (UgetRssItem, title), &ug_html_parser_string, NULL, NULL}, {"link", offsetof (UgetRssItem, link), &ug_html_parser_custom, ug_html_start_element_rss_link, NULL}, {"updated", offsetof (UgetRssItem, updated), &ug_html_parser_time_rfc3339, NULL, NULL}, {"pubDate", offsetof (UgetRssItem, updated), &ug_html_parser_time_rfc822, NULL, NULL}, {NULL} }; void ug_html_start_element_rss_item (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { UgetRssItem* item; item = uget_rss_item_new (); ug_list_append ((UgList*) dest, (UgLink*) item); ug_html_push (uhtml, &ug_html_parser_entry, item, (void*) &UgHtmlEntryRssItem); } // ---------------------------------------------------------------------------- // RSS const UgHtmlEntry UgHtmlEntryRss[] = { {"title", offsetof (UgetRssFeed, title), &ug_html_parser_string, NULL, NULL}, {"link", offsetof (UgetRssFeed, link), &ug_html_parser_string, NULL, NULL}, {"updated", offsetof (UgetRssFeed, updated), &ug_html_parser_time_rfc3339, NULL, NULL}, {"pubDate", offsetof (UgetRssFeed, updated), &ug_html_parser_time_rfc822, NULL, NULL}, {"item", offsetof (UgetRssFeed, items), &ug_html_parser_custom, ug_html_start_element_rss_item, NULL}, {"entry", offsetof (UgetRssFeed, items), &ug_html_parser_custom, ug_html_start_element_rss_item, NULL}, {NULL} }; void ug_html_start_element_rss (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { if (strcmp (element_name, "channel") == 0 || strcmp (element_name, "feed") == 0) { ug_html_push (uhtml, &ug_html_parser_entry, dest, (void*) &UgHtmlEntryRss); } } void ug_html_end_element_rss (UgHtml* uhtml, const char* element_name, void* dest, void* data) { if (strcmp (element_name, "channel") == 0 || strcmp (element_name, "feed") == 0) ug_html_pop (uhtml); } const UgHtmlParser ug_html_parser_rss = { (void*) ug_html_start_element_rss, (void*) ug_html_end_element_rss, (void*) NULL }; // ---------------------------------------------------------------------------- // UgetRssItem UgetRssItem* uget_rss_item_new (void) { UgetRssItem* item; item = ug_malloc0 (sizeof (UgetRssItem)); item->self = item; return item; } void uget_rss_item_free (UgetRssItem* item) { ug_free (item->title); ug_free (item->link); ug_free (item); } // ---------------------------------------------------------------------------- // UgetRssFeed const UgEntry UgetRssFeedEntry[] = { {"type", offsetof (UgetRssFeed, type), UG_ENTRY_INT, NULL, NULL}, {"url", offsetof (UgetRssFeed, url), UG_ENTRY_STRING, NULL, NULL}, {"checked", offsetof (UgetRssFeed, checked), UG_ENTRY_CUSTOM, ug_json_parse_time_t, ug_json_write_time_t}, {NULL} }; UgetRssFeed* uget_rss_feed_new (void) { UgetRssFeed* feed; feed = ug_malloc0 (sizeof (UgetRssFeed)); feed->self = feed; feed->checked = -1; return feed; } void uget_rss_feed_free (UgetRssFeed* feed) { uget_rss_feed_clear (feed, FALSE); ug_free (feed); } void uget_rss_feed_clear (UgetRssFeed* feed, int reserve_user_data) { ug_free (feed->title); ug_free (feed->link); ug_list_foreach (&feed->items, (UgForeachFunc) uget_rss_item_free, NULL); ug_list_clear (&feed->items, FALSE); feed->title = NULL; feed->link = NULL; feed->updated = -1; if (reserve_user_data == FALSE) { ug_free (feed->url); feed->url = NULL; feed->type = 0; feed->checked = -1; } } void uget_rss_feed_move (UgetRssFeed* feed, UgetRssFeed* src) { uget_rss_feed_clear (feed, TRUE); feed->title = src->title; feed->link = src->link; feed->updated = src->updated; feed->items = src->items; src->title = NULL; src->link = NULL; src->updated = -1; ug_list_clear (&src->items, FALSE); } UgetRssItem* uget_rss_feed_find (UgetRssFeed* feed, time_t time_after) { UgetRssItem* item; UgetRssItem* result = NULL; if (time_after == -1) result = (UgetRssItem*) feed->items.head; else { for (item = (UgetRssItem*) feed->items.head; item; item = item->next) { if (item->updated > time_after) { if (result == NULL || result->updated > item->updated) result = item; } } } return result; } // ---------------------------------------------------------------------------- // UgetRss UgetRss* uget_rss_new (void) { UgetRss* urss; urss = ug_malloc (sizeof (UgetRss)); ug_html_init (&urss->uhtml); ug_list_init (&urss->feeds); urss->checked = NULL; urss->updating = FALSE; urss->ref_count = 1; return urss; } void uget_rss_ref (UgetRss* urss) { urss->ref_count++; } void uget_rss_unref (UgetRss* urss) { if (--urss->ref_count == 0) { ug_html_final (&urss->uhtml); ug_list_foreach (&urss->feeds, (UgForeachFunc) uget_rss_feed_free, NULL); ug_free (urss); } } void uget_rss_add (UgetRss* urss, UgetRssFeed* feed) { ug_list_append (&urss->feeds, (UgLink*) feed); } void uget_rss_add_builtin (UgetRss* urss, UgetRssType type) { UgetRssFeed* feed; const char* url; switch (type) { case UGET_RSS_STABLE: url = UGET_RSS_URL_STABLE; break; case UGET_RSS_DEVELMENT: url = UGET_RSS_URL_DEVELMENT; break; case UGET_RSS_NEWS: url = UGET_RSS_URL_NEWS; break; case UGET_RSS_TUTORIALS: url = UGET_RSS_URL_TUTORIALS; break; case UGET_RSS_ALL: url = UGET_RSS_URL_ALL; break; default: return; } for (feed = (UgetRssFeed*) urss->feeds.head; feed; feed = feed->next) { if (feed->type == type) { if (strcmp (feed->url, url)) { ug_free (feed->url); feed->url = ug_strdup (url); } return; } } feed = uget_rss_feed_new (); feed->type = type; feed->url = ug_strdup (url); uget_rss_add (urss, feed); } void uget_rss_add_url (UgetRss* urss, const char* url) { UgetRssFeed* feed; feed = uget_rss_feed_new (); feed->url = ug_strdup (url); feed->type = UGET_RSS_USER; ug_list_append (&urss->feeds, (UgLink*) feed); } /* static size_t uget_rss_curl_check (void *ptr, size_t size, size_t nmemb, UgHtml* uhtml) { return nmemb; } */ static size_t uget_rss_curl_write (void *ptr, size_t size, size_t nmemb, UgHtml* uhtml) { ug_html_parse (uhtml, (char*) ptr, size * nmemb); return nmemb; } static UgThreadResult uget_rss_thread (UgetRss* urss) { CURL* curl; CURLcode res; long response_code = 0; UgetRssFeed* feed; UgetRssFeed* temp; UgetRssItem* item; curl = curl_easy_init(); // disable peer SSL certificate verification curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, FALSE); // others curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (curl_write_callback) uget_rss_curl_write); curl_easy_setopt (curl, CURLOPT_WRITEDATA, &urss->uhtml); temp = uget_rss_feed_new (); for (feed = (UgetRssFeed*) urss->feeds.head; feed; feed = feed->next) { if (feed->url == NULL) continue; uget_rss_feed_clear (temp, FALSE); ug_html_push (&urss->uhtml, &ug_html_parser_rss, temp, NULL); ug_html_begin_parse (&urss->uhtml); curl_easy_setopt (curl, CURLOPT_URL, feed->url); res = curl_easy_perform (curl); curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &response_code); ug_html_end_parse (&urss->uhtml); if (res != CURLE_OK || response_code >= 400) continue; uget_rss_feed_move (feed, temp); // check item item = (UgetRssItem*) feed->items.head; if (item && item->updated > feed->checked) urss->n_updated++; } uget_rss_feed_free (temp); curl_easy_cleanup (curl); urss->updating = FALSE; uget_rss_unref (urss); return UG_THREAD_RESULT; } void uget_rss_update (UgetRss* urss, int joinable) { if (urss->updating == TRUE) return; urss->n_updated = 0; urss->updating = TRUE; uget_rss_ref (urss); ug_thread_create (&urss->thread, (UgThreadFunc) uget_rss_thread, urss); if (joinable == FALSE) ug_thread_unjoin (&urss->thread); } UgetRssFeed* uget_rss_find_updated (UgetRss* urss, UgetRssFeed* feed_after) { UgetRssItem* item; if (feed_after == NULL) { if (urss->checked) feed_after = urss->checked->next; } if (feed_after == NULL) feed_after = (UgetRssFeed*) urss->feeds.head; for (; feed_after; feed_after = feed_after->next) { item = (UgetRssItem*) feed_after->items.head; if (item && item->updated > feed_after->checked) break; } urss->checked = feed_after; return feed_after; } int uget_rss_save_feeds (UgetRss* urss, const char* path) { UgJsonFile* jfile; jfile = ug_json_file_new (4096); if (ug_json_file_begin_write (jfile, path, UG_JSON_FORMAT_ALL)) { // ug_json_write_array_head (&jfile->json); ug_json_write_entry (&jfile->json, urss, UgetRssEntry); // ug_json_write_array_tail (&jfile->json); ug_json_file_end_write (jfile); ug_json_file_free (jfile); return TRUE; } ug_json_file_free (jfile); return FALSE; } int uget_rss_load_feeds (UgetRss* urss, const char* path) { UgJsonFile* jfile; jfile = ug_json_file_new (0); if (ug_json_file_begin_parse (jfile, path)) { ug_json_push (&jfile->json, ug_json_parse_entry, urss, (void*) UgetRssEntry); // ug_json_push (&jfile->json, ug_json_parse_array, urss, NULL); ug_json_file_end_parse (jfile); ug_json_file_free (jfile); return TRUE; } ug_json_file_free (jfile); return FALSE; } // ------------------------------------ static UgJsonError ug_json_parse_uget_rss_feeds (UgJson* json, const char* name, const char* value, void* rss, void* none) { UgetRss* urss = rss; UgetRssFeed* feed; if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } feed = uget_rss_feed_new (); ug_list_append (&urss->feeds, (UgLink*) feed); ug_json_push (json, ug_json_parse_entry, feed, (void*)UgetRssFeedEntry); return UG_JSON_ERROR_NONE; } static void ug_json_write_uget_rss_feeds (UgJson* json, const UgetRss* urss) { UgetRssFeed* feed; for (feed = (UgetRssFeed*) urss->feeds.head; feed; feed = feed->next) { ug_json_write_object_head (json); ug_json_write_entry (json, (void*) feed, UgetRssFeedEntry); ug_json_write_object_tail (json); } } const UgEntry UgetRssEntry[] = { {NULL, 0, UG_ENTRY_ARRAY, ug_json_parse_uget_rss_feeds, ug_json_write_uget_rss_feeds}, {NULL} }; uget-2.2.2/uget/UgetMedia.c0000664000175000017500000001211313470304402012353 00000000000000/* * * Copyright (C) 2015-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #ifndef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) #endif // ---------------------------------------------------------------------------- // UgetMedia int uget_media_grab_youtube(UgetMedia* umedia, UgetProxy* proxy); UgetMedia* uget_media_new(const char* url, UgetSiteId site_id) { UgetMedia* umedia; umedia = ug_malloc0(sizeof(UgetMedia)); umedia->url = ug_strdup(url); if (site_id == UGET_SITE_UNKNOWN) site_id = uget_site_get_id(url); umedia->site_id = site_id; return umedia; } void uget_media_free(UgetMedia* umedia) { uget_media_clear(umedia, TRUE); ug_free(umedia); } void uget_media_clear(UgetMedia* umedia, int free_items) { if (free_items== TRUE) { ug_list_foreach((UgList*) umedia, (UgForeachFunc) uget_media_item_free, NULL); ug_list_clear((UgList*) umedia, FALSE); } ug_free(umedia->url); umedia->url = NULL; ug_free(umedia->title); umedia->title = NULL; if (umedia->event) { uget_event_free(umedia->event); umedia->event = NULL; } } int uget_media_grab_items(UgetMedia* umedia, UgetProxy* proxy) { int n_items = 0; switch (umedia->site_id) { case UGET_SITE_YOUTUBE: n_items = uget_media_grab_youtube(umedia, proxy); break; case UGET_SITE_UNKNOWN: default: break; } return n_items; } UgetMediaItem* uget_media_match(UgetMedia* umedia, UgetMediaMatchMode mode, UgetMediaQuality quality, UgetMediaType type) { UgetMediaItem* cur; UgetMediaItem* prev; UgetMediaItem* result = NULL; int abs_cur, abs_res; int count_cur, count_res; if (mode == UGET_MEDIA_MATCH_0) return umedia->head; for (cur = umedia->tail; cur; cur = prev) { prev = cur->prev; count_cur = 0; if (cur->quality == quality) count_cur++; if (cur->type == type) count_cur++; if ((mode == UGET_MEDIA_MATCH_1 && count_cur >= 1) || (mode == UGET_MEDIA_MATCH_2 && count_cur >= 2)) { // move matched items to tail of list ug_list_remove((UgList*) umedia, (UgLink*) cur); ug_list_append((UgList*) umedia, (UgLink*) cur); if (result == NULL) result = cur; } else if (mode == UGET_MEDIA_MATCH_NEAR) { if (result == NULL) { result = cur; count_res = count_cur; continue; } abs_res = ABS(quality - result->quality); abs_cur = ABS(quality - cur->quality); if (abs_res == abs_cur) { if (count_res < count_cur) { result = cur; count_res = count_cur; } // choose near (or less) quality media file. else if (result->quality > cur->quality) { result = cur; count_res = count_cur; } } else if (abs_res > abs_cur) { result = cur; count_res = count_cur; } } } if (mode == UGET_MEDIA_MATCH_NEAR && result) { // move matched items to tail of list ug_list_remove((UgList*) umedia, (UgLink*) result); ug_list_append((UgList*) umedia, (UgLink*) result); } return result; } // ---------------------------------------------------------------------------- // UgetMediaItem UgetMediaItem* uget_media_item_new(UgetMedia* umedia) { UgetMediaItem* umitem; umitem = ug_malloc0(sizeof(UgetMediaItem)); umitem->self = umitem; umitem->type = UGET_MEDIA_TYPE_UNKNOWN; umitem->quality = UGET_MEDIA_QUALITY_UNKNOWN; ug_list_append((UgList*) umedia, (UgLink*) umitem); return umitem; } void uget_media_item_free(UgetMediaItem* umitem) { ug_free(umitem->url); ug_free(umitem); } uget-2.2.2/uget/UgetSite.h0000664000175000017500000000410713470304403012252 00000000000000/* * * Copyright (C) 2017-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_SITE_H #define UGET_SITE_H #include #ifdef __cplusplus extern "C" { #endif typedef enum UgetSiteId { UGET_SITE_UNKNOWN = 0, // storage UGET_SITE_MEGA, // media UGET_SITE_MEDIA = 0x10000000, UGET_SITE_YOUTUBE = UGET_SITE_MEDIA, } UgetSiteId; // return UgetSiteId int uget_site_get_id (const char* url); // return TRUE or FALSE int uget_site_is_mega (UgUri* uuri); int uget_site_is_youtube (UgUri* uuri); #ifdef __cplusplus } #endif // __cplusplus #endif // UGET_SITE_H uget-2.2.2/uget/UgetFiles.h0000664000175000017500000001376613470304402012422 00000000000000/* * * Copyright (C) 2018-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_FILES_H #define UGET_FILES_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetFile UgetFile; typedef struct UgetFiles UgetFiles; extern const UgDataInfo* UgetFilesInfo; enum UgetFileType { UGET_FILE_REGULAR, UGET_FILE_FOLDER, UGET_FILE_ATTACHMENT, // torrent, metalink, or HTTP POST file UGET_FILE_TEMPORARY, // temporary file. UGET_FILE_ALL, }; enum UgetFileState { // state for torrent or metalink // UGET_FILE_STATE_IGNORE = 0x0001, // UGET_FILE_STATE_SOURCE = 0x0002, // state for output (actually write into storage device) UGET_FILE_STATE_DELETED = 0x0004, // this file was deleted/renamed UGET_FILE_STATE_COMPLETED = 0x0008, UGET_FILE_STATE_ALL = 0x00FF, }; // ---------------------------------------------------------------------------- // UgetFile functions UgetFile* uget_file_new(void); void uget_file_free(UgetFile* file); /* ---------------------------------------------------------------------------- UgetFiles: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetFiles */ struct UgetFiles { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member UgList list; int sync_count; }; int uget_files_assign(UgetFiles* files, UgetFiles* src); void uget_files_clear(UgetFiles* files); // sync elements from 'src' to 'files. // 1. all elements in 'src' will insert/replace into 'files'. // 2. remove deleted (state == UGET_FILE_STATE_DELETED) elements in 'src'. // return TRUE if 'files' have added or removed elements. int uget_files_sync(UgetFiles* files, UgetFiles* src); UgetFile* uget_files_find(UgetFiles* files, const char* path, UgetFile** sibling); // realloc struct UgetFile by 'path' in array. UgetFile* uget_files_realloc(UgetFiles* files, const char* path); UgetFile* uget_files_replace(UgetFiles* files, const char* path, int type, int state); // apply state to element if type is matched. void uget_files_apply(UgetFiles* files, int type, int state); // erase element by state if type is matched. void uget_files_erase(UgetFiles* files, int type, int state); #define uget_files_apply_deleted(files) \ uget_files_apply(files, UGET_FILE_ALL, UGET_FILE_STATE_DELETED) #define uget_files_erase_deleted(files) \ uget_files_erase(files, UGET_FILE_ALL, UGET_FILE_STATE_DELETED) #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgetFile structure: file information with list link struct UgetFile { UG_LINK_MEMBERS(UgetFile, char, path); /* // ------ UgLink members ------ char* path; // absolute file path UgetFile* next; UgetFile* prev; */ int16_t type; // UgetFileType int16_t state; // UgetFileState // save original index in torrent and metalink file. // int32_t order; // progress int64_t total; int64_t complete; #ifdef __cplusplus inline void* operator new(size_t size) { return uget_file_new(); } inline void operator delete(void* p) { uget_file_free((UgetFile*)p); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const UgDataInfo* const FilesInfo = UgetFilesInfo; // These are for directly use only. You can NOT derived it. typedef struct UgetFile File; struct Files : Ug::DataMethod, UgetFiles { inline void* operator new(size_t size) { return ug_data_new(UgetFilesInfo); } inline int sync(UgetFiles* src) { return uget_files_sync(this, src); } inline UgetFile* find(const char* path, UgetFile** sibling) { return uget_files_find(this, path, sibling); } inline UgetFile* realloc(const char* path) { return uget_files_realloc(this, path); } inline UgetFile* replace(const char* path,int type, int state) { return uget_files_replace(this, path, type, state); } inline void apply(int type, int state) { uget_files_apply(this, type, state); } inline void erase(int type, int state) { uget_files_erase(this, type, state); } inline void apply_deleted(void) { uget_files_apply(this, UGET_FILE_ALL, UGET_FILE_STATE_DELETED); } inline void erase_deleted(void) { uget_files_erase(this, UGET_FILE_ALL, UGET_FILE_STATE_DELETED); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_FILES_H uget-2.2.2/uget/UgetNode-filter.c0000664000175000017500000001574413470304402013521 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #define N_SPLIT_GROUPS 4 static int split_groups[N_SPLIT_GROUPS] = { UGET_GROUP_ACTIVE, UGET_GROUP_QUEUING, UGET_GROUP_FINISHED, UGET_GROUP_RECYCLED, }; // ---------------------------------------------------------------------------- // callback functions for UgetNode.control.filter // sibling_real, child_real void uget_node_filter_split (UgetNode* node, UgetNode* sibling, UgetNode* child_real) { UgetRelation* relation; UgetNode* child; int group; if (node->parent == NULL) { // node is root. child_real is category for (group=0; group < N_SPLIT_GROUPS; group++) { child = uget_node_new (child_real); uget_node_prepend (node, child); } } else if (node->parent->parent == NULL) { // node is category. child_real is download child = child_real->base; relation = ug_info_realloc(child->info, UgetRelationInfo); group = uget_node_get_group(node); if ((relation->group & UGET_GROUP_MAJOR) == 0) relation->group |= UGET_GROUP_QUEUING; if (group & relation->group) { // insert sorted if (node->control->sort.compare) { uget_node_insert_sorted (node, uget_node_new (child_real)); return; } // original order if (sibling) { for (sibling = sibling->fake; sibling; sibling = sibling->peer) { if (sibling->parent == node) break; } } uget_node_insert (node, sibling, uget_node_new (child_real)); } } } void uget_node_filter_sorted (UgetNode* node, UgetNode* sibling, UgetNode* child) { child = uget_node_new (child); if (node->parent == NULL) { // node is root. uget_node_append (node, child); } else if (node->parent->parent == NULL) { // node is category. // insert sorted if (node->control->sort.compare) { uget_node_insert_sorted (node, child); return; } // original order if (sibling) { for (sibling = sibling->fake; sibling; sibling = sibling->peer) { if (sibling->parent == node) break; } } uget_node_insert (node, sibling, child); } } // sibling_real, child_real void uget_node_filter_mix (UgetNode* node, UgetNode* sibling, UgetNode* child) { UgetNode* fake; UgetRelation* relation_child; UgetRelation* relation_sibling; child = uget_node_new (child); if (node->parent == NULL) { // node is root. uget_node_append (node, child); } else if (node->parent->parent == NULL) { // node is category. // insert sorted node = node->parent->children; if (node->control->sort.compare) { // add all download to first category uget_node_insert_sorted (node, child); return; } // reorder by group relation_child = ug_info_realloc(child->info, UgetRelationInfo); if (sibling) { relation_sibling = ug_info_realloc(sibling->info, UgetRelationInfo); if ((relation_sibling->group & UGET_GROUP_MAJOR) != (relation_child->group & UGET_GROUP_MAJOR)) { sibling = NULL; } } // get inserting position by group if (node->fake && sibling == NULL) { switch (relation_child->group & UGET_GROUP_MAJOR) { case UGET_GROUP_ACTIVE: fake = uget_node_get_split(node, UGET_GROUP_QUEUING); if (fake == NULL || fake->children == NULL) fake = uget_node_get_split(node, UGET_GROUP_FINISHED); if (fake == NULL || fake->children == NULL) fake = uget_node_get_split(node, UGET_GROUP_RECYCLED); break; case UGET_GROUP_QUEUING: default: fake = uget_node_get_split(node, UGET_GROUP_FINISHED); if (fake == NULL || fake->children == NULL) fake = uget_node_get_split(node, UGET_GROUP_RECYCLED); break; case UGET_GROUP_FINISHED: fake = uget_node_get_split(node, UGET_GROUP_RECYCLED); break; case UGET_GROUP_RECYCLED: fake = NULL; break; } // insert into specified position by group if (fake && fake->children) { uget_node_insert (node, fake->children->real, child); return; } } // original order if (sibling) { for (sibling = sibling->fake; sibling; sibling = sibling->peer) { if (sibling->parent == node) break; } } // insert childNode to first (mixed) category uget_node_insert (node, sibling, child); } } void uget_node_filter_mix_split (UgetNode* node, UgetNode* sibling, UgetNode* child_real) { UgetNode* real; // if REAL category node is not first child, this function do nothing. real = node->real; if (real->parent == NULL && real->children != child_real) return; uget_node_filter_split (node, sibling, child_real); } // ---------------------------------------------------------------------------- // helper functions for uget_node_filter_split(), uget_node_filter_mix_split() UgetNode* uget_node_get_split(UgetNode* node, int group) { UgetNodeFunc filter; int nth; for (nth = 0, node = node->fake; node; node = node->peer) { filter = node->control->filter; if (filter == uget_node_filter_split || filter == uget_node_filter_mix_split) { if (split_groups[nth] & group) return node; nth++; // must place here } } return NULL; } int uget_node_get_group(UgetNode* node) { UgetNodeFunc filter; UgetNode* fake; int nth; if (node->real == NULL) return UGET_GROUP_NULL; for (nth = 0, fake = node->real->fake; fake; fake = fake->peer) { filter = fake->control->filter; if (filter == uget_node_filter_split || filter == uget_node_filter_mix_split) { if (fake == node) return split_groups[nth]; nth++; // must place here } } return UGET_GROUP_NULL; } uget-2.2.2/uget/UgetPluginAgent.h0000664000175000017500000001324413470304402013564 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_AGENT_H #define UGET_PLUGIN_AGENT_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginAgent UgetPluginAgent; typedef enum { UGET_PLUGIN_AGENT_GLOBAL = UGET_PLUGIN_GLOBAL_DERIVED, // begin UGET_PLUGIN_AGENT_GLOBAL_PLUGIN, // set parameter = (UgetPluginInfo*) UGET_PLUGIN_AGENT_GLOBAL_DERIVED, } UgetPluginAgentGlobalCode; /* ---------------------------------------------------------------------------- UgetPluginAgent: It derived from UgetPlugin. It use other(curl/aria2) plug-in to download file. UgType | `--- UgetPlugin | `--- UgetPluginAgent */ #define UGET_PLUGIN_AGENT_MEMBERS \ UGET_PLUGIN_MEMBERS; \ UgInfo* target_info; \ UgetPlugin* target_plugin; \ int limit[2]; \ uint8_t limit_changed:1; \ uint8_t paused:1; \ uint8_t stopped:1 struct UgetPluginAgent { UGET_PLUGIN_AGENT_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; // ------ UgetPluginAgent members ------ // This plug-in use other plug-in to download files, // so we need extra UgetPlugin and UgInfo. // plugin->target_info is a copy of UgInfo that store in UgetApp UgInfo* target_info; // target_plugin use target_info to download UgetPlugin* target_plugin; // speed limit control // limit[0] = download speed limit // limit[1] = upload speed limit int limit[2]; uint8_t limit_changed:1; // speed limit changed by user or program // control flags uint8_t paused:1; // paused by user or program uint8_t stopped:1; // all downloading thread are stopped */ }; #ifdef __cplusplus } #endif // global functions ------------------- UgetResult uget_plugin_agent_global_init (void); void uget_plugin_agent_global_ref (void); void uget_plugin_agent_global_unref (void); UgetResult uget_plugin_agent_global_set (int option, void* parameter); UgetResult uget_plugin_agent_global_get (int option, void* parameter); // instance functions ----------------- void uget_plugin_agent_init (UgetPluginAgent* plugin); void uget_plugin_agent_final (UgetPluginAgent* plugin); int uget_plugin_agent_ctrl (UgetPluginAgent* plugin, int code, void* data); int uget_plugin_agent_ctrl_speed (UgetPluginAgent* plugin, int* speed); // sync functions --------------------- // sync common data (include speed limit) between 'common' and 'target' // if parameter 'target' is NULL, it get/alloc 'target' from plugin->target_info void uget_plugin_agent_sync_common (UgetPluginAgent* plugin, UgetCommon* common, UgetCommon* target); // sync progress data from 'target' to 'progress' // if parameter 'target' is NULL, it get/alloc 'target' from plugin->target_info void uget_plugin_agent_sync_progress (UgetPluginAgent* plugin, UgetProgress* progress, UgetProgress* target); // thread functions ------------------- int uget_plugin_agent_start (UgetPluginAgent* plugin, UgThreadFunc thread_func); // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginAgentMethod : Uget::PluginMethod { inline void syncCommon(UgetCommon* common, UgetCommon* target) { uget_plugin_agent_sync_common((UgetPluginAgent*)this, common, target); } inline void syncProgress(UgetProgress* progress, UgetProgress* target) { uget_plugin_agent_sync_progress((UgetPluginAgent*)this, progress, target); } }; // This one is for directly use only. You can NOT derived it. struct PluginAgent : Uget::PluginAgentMethod, UgetPluginAgent {}; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_AGENT_H uget-2.2.2/uget/UgetHash.c0000664000175000017500000004033113470304402012222 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #ifdef NO_URI_HASH #else #if defined HAVE_GLIB #define ug_hash_table_destroy g_hash_table_destroy #define ug_hash_table_lookup g_hash_table_lookup #define ug_hash_table_insert g_hash_table_insert #define ug_hash_table_remove g_hash_table_remove #else // modify GHashTable from GLib #include #include #include typedef struct UgHashTable UgHashTable; typedef unsigned int (*UgHashFunc) (const void* v); UgHashTable* ug_hash_table_new (UgHashFunc hash, UgCompareFunc compare); void ug_hash_table_destroy (UgHashTable* hash_table); void* ug_hash_table_lookup (UgHashTable* hash_table, const void* key); void ug_hash_table_insert (UgHashTable* hash_table, void* key, void* value); int ug_hash_table_remove (UgHashTable* hash_table, const void* key); unsigned int ug_hash_str (const void* v); // port GHashTable to Android... struct UgHashTable { int size; int mod; unsigned int mask; int nnodes; int noccupied; // nnodes + tombstones void** keys; void** values; unsigned int* hashes; int ref_count; UgHashFunc hash_func; UgCompareFunc compare_func; UgNotifyFunc key_destroy_func; UgNotifyFunc value_destroy_func; }; // ---------------------------------------------------------------------------- #undef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define HASH_TABLE_MIN_SHIFT 3 // 1 << 3 == 8 buckets #define UNUSED_HASH_VALUE 0 #define TOMBSTONE_HASH_VALUE 1 #define HASH_IS_UNUSED(h_) ((h_) == UNUSED_HASH_VALUE) #define HASH_IS_TOMBSTONE(h_) ((h_) == TOMBSTONE_HASH_VALUE) #define HASH_IS_REAL(h_) ((h_) >= 2) static const int prime_mod [] = { 1, /* For 1 << 0 */ 2, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, /* For 1 << 16 */ 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647 /* For 1 << 31 */ }; static void ug_hash_table_set_shift (UgHashTable *hash_table, int shift) { int i; unsigned int mask = 0; hash_table->size = 1 << shift; hash_table->mod = prime_mod [shift]; for (i = 0; i < shift; i++) { mask <<= 1; mask |= 1; } hash_table->mask = mask; } static int ug_hash_table_find_closest_shift (int n) { int i; for (i = 0; n; i++) n >>= 1; return i; } static void ug_hash_table_set_shift_from_size (UgHashTable *hash_table, int size) { int shift; shift = ug_hash_table_find_closest_shift (size); shift = MAX (shift, HASH_TABLE_MIN_SHIFT); ug_hash_table_set_shift (hash_table, shift); } static unsigned int ug_hash_table_lookup_node (UgHashTable* hash_table, const void* key, unsigned int* hash_return) { unsigned int node_index; unsigned int node_hash; unsigned int hash_value; unsigned int first_tombstone = 0; int have_tombstone = FALSE; unsigned int step = 0; hash_value = hash_table->hash_func (key); if (!HASH_IS_REAL (hash_value)) hash_value = 2; *hash_return = hash_value; node_index = hash_value % hash_table->mod; node_hash = hash_table->hashes[node_index]; while (!HASH_IS_UNUSED (node_hash)) { /* We first check if our full hash values * are equal so we can avoid calling the full-blown * key equality function in most cases. */ if (node_hash == hash_value) { void* node_key = hash_table->keys[node_index]; if (hash_table->compare_func) { if (hash_table->compare_func (node_key, key) == 0) return node_index; } else if (node_key == key) { return node_index; } } else if (HASH_IS_TOMBSTONE (node_hash) && !have_tombstone) { first_tombstone = node_index; have_tombstone = TRUE; } step++; node_index += step; node_index &= hash_table->mask; node_hash = hash_table->hashes[node_index]; } if (have_tombstone) return first_tombstone; return node_index; } static void ug_hash_table_remove_node (UgHashTable* hash_table, int i, int notify) { void* key; void* value; key = hash_table->keys[i]; value = hash_table->values[i]; /* Erect tombstone */ hash_table->hashes[i] = TOMBSTONE_HASH_VALUE; /* Be GC friendly */ hash_table->keys[i] = NULL; hash_table->values[i] = NULL; hash_table->nnodes--; if (notify && hash_table->key_destroy_func) hash_table->key_destroy_func (key); if (notify && hash_table->value_destroy_func) hash_table->value_destroy_func (value); } static void ug_hash_table_remove_all_nodes (UgHashTable* hash_table, int notify) { int i; void* key; void* value; hash_table->nnodes = 0; hash_table->noccupied = 0; if (!notify || (hash_table->key_destroy_func == NULL && hash_table->value_destroy_func == NULL)) { memset (hash_table->hashes, 0, hash_table->size * sizeof (unsigned int)); memset (hash_table->keys, 0, hash_table->size * sizeof (void*)); memset (hash_table->values, 0, hash_table->size * sizeof (void*)); return; } for (i = 0; i < hash_table->size; i++) { if (HASH_IS_REAL (hash_table->hashes[i])) { key = hash_table->keys[i]; value = hash_table->values[i]; hash_table->hashes[i] = UNUSED_HASH_VALUE; hash_table->keys[i] = NULL; hash_table->values[i] = NULL; if (hash_table->key_destroy_func != NULL) hash_table->key_destroy_func (key); if (hash_table->value_destroy_func != NULL) hash_table->value_destroy_func (value); } else if (HASH_IS_TOMBSTONE (hash_table->hashes[i])) { hash_table->hashes[i] = UNUSED_HASH_VALUE; } } } static void ug_hash_table_resize (UgHashTable *hash_table) { void** new_keys; void** new_values; unsigned int* new_hashes; int old_size; int i; old_size = hash_table->size; ug_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2); new_keys = ug_malloc0 (sizeof (void*) * hash_table->size); if (hash_table->keys == hash_table->values) new_values = new_keys; else new_values = ug_malloc0 (sizeof (void*) * hash_table->size); new_hashes = ug_malloc0 (sizeof (unsigned int) * hash_table->size); for (i = 0; i < old_size; i++) { unsigned int node_hash = hash_table->hashes[i]; unsigned int hash_val; unsigned int step = 0; if (!HASH_IS_REAL (node_hash)) continue; hash_val = node_hash % hash_table->mod; while (!HASH_IS_UNUSED (new_hashes[hash_val])) { step++; hash_val += step; hash_val &= hash_table->mask; } new_hashes[hash_val] = hash_table->hashes[i]; new_keys[hash_val] = hash_table->keys[i]; new_values[hash_val] = hash_table->values[i]; } if (hash_table->keys != hash_table->values) ug_free (hash_table->values); ug_free (hash_table->keys); ug_free (hash_table->hashes); hash_table->keys = new_keys; hash_table->values = new_values; hash_table->hashes = new_hashes; hash_table->noccupied = hash_table->nnodes; } static inline void ug_hash_table_maybe_resize (UgHashTable *hash_table) { int noccupied = hash_table->noccupied; int size = hash_table->size; if ((size > hash_table->nnodes * 4 && size > 1 << HASH_TABLE_MIN_SHIFT) || (size <= noccupied + (noccupied / 16))) ug_hash_table_resize (hash_table); } UgHashTable* ug_hash_table_new (UgHashFunc hash_func, UgCompareFunc compare_func) { UgHashTable* hash_table; hash_table = ug_malloc (sizeof (UgHashTable)); ug_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT); hash_table->nnodes = 0; hash_table->noccupied = 0; hash_table->hash_func = hash_func ? hash_func : NULL; hash_table->compare_func = compare_func; hash_table->ref_count = 1; hash_table->key_destroy_func = NULL; hash_table->value_destroy_func = NULL; hash_table->keys = ug_malloc0 (sizeof (void*) * hash_table->size); hash_table->values = hash_table->keys; hash_table->hashes = ug_malloc0 (sizeof (unsigned int) * hash_table->size); return hash_table; } static void ug_hash_table_insert_node (UgHashTable* hash_table, unsigned int node_index, unsigned int key_hash, void* key, void* value, int keep_new_key, int reusing_key) { unsigned int old_hash; void* old_key; void* old_value; if (hash_table->keys == hash_table->values && key != value) { hash_table->values = ug_malloc0 (sizeof (void*) * hash_table->size); memcpy (hash_table->values, hash_table->keys, sizeof (void*) * hash_table->size); } old_hash = hash_table->hashes[node_index]; old_key = hash_table->keys[node_index]; old_value = hash_table->values[node_index]; if (HASH_IS_REAL (old_hash)) { if (keep_new_key) hash_table->keys[node_index] = key; hash_table->values[node_index] = value; } else { hash_table->keys[node_index] = key; hash_table->values[node_index] = value; hash_table->hashes[node_index] = key_hash; hash_table->nnodes++; if (HASH_IS_UNUSED (old_hash)) { /* We replaced an empty node, and not a tombstone */ hash_table->noccupied++; ug_hash_table_maybe_resize (hash_table); } } if (HASH_IS_REAL (old_hash)) { if (hash_table->key_destroy_func && !reusing_key) hash_table->key_destroy_func (keep_new_key ? old_key : key); if (hash_table->value_destroy_func) hash_table->value_destroy_func (old_value); } } void ug_hash_table_destroy (UgHashTable *hash_table) { // ug_hash_table_remove_all (hash_table); ug_hash_table_remove_all_nodes (hash_table, TRUE); ug_hash_table_maybe_resize (hash_table); // ug_hash_table_unref (hash_table); ug_hash_table_remove_all_nodes (hash_table, TRUE); if (hash_table->keys != hash_table->values) ug_free (hash_table->values); ug_free (hash_table->keys); ug_free (hash_table->hashes); ug_free (hash_table); } void* ug_hash_table_lookup (UgHashTable* hash_table, const void* key) { unsigned int node_index; unsigned int node_hash; node_index = ug_hash_table_lookup_node (hash_table, key, &node_hash); return HASH_IS_REAL (hash_table->hashes[node_index]) ? hash_table->values[node_index] : NULL; } void ug_hash_table_insert (UgHashTable *hash_table, void* key, void* value) { // g_hash_table_insert_internal (hash_table, key, value, FALSE); unsigned int key_hash; unsigned int node_index; node_index = ug_hash_table_lookup_node (hash_table, key, &key_hash); // g_hash_table_insert_node (hash_table, node_index, key_hash, key, value, keep_new_key, FALSE); ug_hash_table_insert_node (hash_table, node_index, key_hash, key, value, FALSE, FALSE); } int ug_hash_table_remove (UgHashTable* hash_table, const void* key) { // return g_hash_table_remove_internal (hash_table, key, TRUE); unsigned int node_index; unsigned int node_hash; node_index = ug_hash_table_lookup_node (hash_table, key, &node_hash); if (!HASH_IS_REAL (hash_table->hashes[node_index])) return FALSE; ug_hash_table_remove_node (hash_table, node_index, TRUE); ug_hash_table_maybe_resize (hash_table); return TRUE; } unsigned int ug_hash_str (const void* v) { const signed char *p; uint32_t h = 5381; for (p = v; *p != '\0'; p++) h = (h << 5) + h + *p; return h; } #endif // HAVE_GLIB // ---------------------------------------------------------------------------- void* uget_uri_hash_new (void) { #if defined HAVE_GLIB return g_hash_table_new_full (g_str_hash, g_str_equal, ug_free, NULL); #else UgHashTable* uuhash; uuhash = ug_hash_table_new (ug_hash_str, (UgCompareFunc) strcmp); uuhash->key_destroy_func = ug_free; return uuhash; #endif // HAVE_GLIB } void uget_uri_hash_free (void* uuhash) { if (uuhash) ug_hash_table_destroy (uuhash); } int uget_uri_hash_find (void* uuhash, const char* uri) { if (uuhash && ug_hash_table_lookup (uuhash, uri)) return TRUE; else return FALSE; } void uget_uri_hash_add (void* uuhash, const char* uri) { uintptr_t counts; if (uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, uri); ug_hash_table_insert (uuhash, ug_strdup (uri), (void*) (++counts)); } } void uget_uri_hash_remove (void* uuhash, const char* uri) { uintptr_t counts; if (uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, uri); if (counts > 1) ug_hash_table_insert (uuhash, ug_strdup (uri), (void*) (--counts)); else ug_hash_table_remove (uuhash, uri); } } void uget_uri_hash_add_download (void* uuhash, UgInfo* dnode_info) { UgetCommon* common; uintptr_t counts; if (uuhash == NULL) return; common = ug_info_get(dnode_info, UgetCommonInfo); if (common && common->uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, common->uri); ug_hash_table_insert (uuhash, ug_strdup (common->uri), (void*) (++counts)); } } void uget_uri_hash_remove_download (void* uuhash, UgInfo* dnode_info) { UgetCommon* common; uintptr_t counts; if (uuhash == NULL) return; common = ug_info_get(dnode_info, UgetCommonInfo); if (common && common->uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, common->uri); if (counts > 1) ug_hash_table_insert (uuhash, ug_strdup (common->uri), (void*) (--counts)); else ug_hash_table_remove (uuhash, common->uri); } } void uget_uri_hash_add_category (void* uuhash, UgetNode* cnode) { UgetNode* dnode; UgetCommon* common; uintptr_t counts; if (uuhash == NULL) return; for (dnode = cnode->children; dnode; dnode = dnode->next) { common = ug_info_get (dnode->info, UgetCommonInfo); if (common && common->uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, common->uri); ug_hash_table_insert (uuhash, ug_strdup (common->uri), (void*) (++counts)); } } } void uget_uri_hash_remove_category (void* uuhash, UgetNode* cnode) { UgetNode* dnode; UgetCommon* common; uintptr_t counts; if (uuhash == NULL) return; for (dnode = cnode->children; dnode; dnode = dnode->next) { common = ug_info_get (dnode->info, UgetCommonInfo); if (common && common->uri) { counts = (uintptr_t) ug_hash_table_lookup (uuhash, common->uri); if (counts > 1) ug_hash_table_insert (uuhash, ug_strdup (common->uri), (void*) (--counts)); else ug_hash_table_remove (uuhash, common->uri); } } } #endif // NO_URI_HASH uget-2.2.2/uget/UgetData.c0000664000175000017500000006267113470304402012223 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include // ---------------------------------------------------------------------------- // UgetCommon static void uget_common_init(UgetCommon* common); static void uget_common_final(UgetCommon* common); static int uget_common_assign(UgetCommon* common, UgetCommon* src); static const UgEntry UgetCommonEntry[] = { {"name", offsetof(UgetCommon, name), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"uri", offsetof(UgetCommon, uri), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"mirrors", offsetof(UgetCommon, mirrors), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"file", offsetof(UgetCommon, file), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"folder", offsetof(UgetCommon, folder), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"user", offsetof(UgetCommon, user), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"password", offsetof(UgetCommon, password), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"connect-timeout", offsetof(UgetCommon, connect_timeout), UG_ENTRY_UINT, NULL, NULL}, {"transmit-timeout", offsetof(UgetCommon, transmit_timeout), UG_ENTRY_UINT, NULL, NULL}, {"retry-delay", offsetof(UgetCommon, retry_delay), UG_ENTRY_INT, NULL, NULL}, {"retry-limit", offsetof(UgetCommon, retry_limit), UG_ENTRY_INT, NULL, NULL}, {"retry-count", offsetof(UgetCommon, retry_count), UG_ENTRY_INT, NULL, NULL}, {"max-connections", offsetof(UgetCommon, max_connections), UG_ENTRY_UINT, NULL, NULL}, {"max-upload-speed", offsetof(UgetCommon, max_upload_speed), UG_ENTRY_INT, NULL, NULL}, {"max-download-speed", offsetof(UgetCommon, max_download_speed), UG_ENTRY_INT, NULL, NULL}, {"timestamp", offsetof(UgetCommon, timestamp), UG_ENTRY_INT, NULL, NULL}, {NULL} // null-terminated }; static const UgDataInfo UgetCommonInfoStatic = { "common", // name sizeof(UgetCommon), // size (UgInitFunc) uget_common_init, (UgFinalFunc) uget_common_final, (UgAssignFunc) uget_common_assign, UgetCommonEntry, }; // extern const UgDataInfo* UgetCommonInfo = &UgetCommonInfoStatic; static void uget_common_init(UgetCommon* common) { common->connect_timeout = 15; common->transmit_timeout = 30; common->retry_delay = 6; common->retry_limit = 99; common->max_connections = 1; common->timestamp = TRUE; #ifndef NDEBUG common->debug_level = 1; #endif } static void uget_common_final(UgetCommon* common) { ug_free(common->name); ug_free(common->uri); ug_free(common->mirrors); ug_free(common->file); ug_free(common->folder); ug_free(common->user); ug_free(common->password); } static int uget_common_assign(UgetCommon* common, UgetCommon* src) { #if 0 // Program can NOT copy UgetCommon::name to other one. if (common->keeping.enable == FALSE || common->keeping.name == FALSE) { ug_free(common->name); common->name = (src->name) ? ug_strdup(src->name) : NULL; } #endif if (common->keeping.enable == FALSE || common->keeping.uri == FALSE) { ug_free(common->uri); common->uri = (src->uri) ? ug_strdup(src->uri) : NULL; common->keeping.uri = src->keeping.uri; } if (common->keeping.enable == FALSE || common->keeping.mirrors == FALSE) { ug_free(common->mirrors); common->mirrors = (src->mirrors) ? ug_strdup(src->mirrors) : NULL; common->keeping.mirrors = src->keeping.mirrors; } if (common->keeping.enable == FALSE || common->keeping.file == FALSE) { ug_free(common->file); common->file = (src->file) ? ug_strdup(src->file) : NULL; common->keeping.file = src->keeping.file; } if (common->keeping.enable == FALSE || common->keeping.folder == FALSE) { ug_free(common->folder); common->folder = (src->folder) ? ug_strdup(src->folder) : NULL; common->keeping.folder = src->keeping.folder; } if (common->keeping.enable == FALSE || common->keeping.user == FALSE) { ug_free(common->user); common->user = (src->user) ? ug_strdup(src->user) : NULL; common->keeping.user = src->keeping.user; } if (common->keeping.enable == FALSE || common->keeping.password == FALSE) { ug_free(common->password); common->password = (src->password) ? ug_strdup(src->password) : NULL; common->keeping.password = src->keeping.password; } // timeout if (common->keeping.enable == FALSE || common->keeping.connect_timeout == FALSE) { common->connect_timeout = src->connect_timeout; common->keeping.connect_timeout = src->keeping.connect_timeout; } if (common->keeping.enable == FALSE || common->keeping.transmit_timeout == FALSE) { common->transmit_timeout = src->transmit_timeout; common->keeping.transmit_timeout = src->keeping.transmit_timeout; } // retry if (common->keeping.enable == FALSE || common->keeping.retry_delay == FALSE) { common->retry_delay = src->retry_delay; common->keeping.retry_delay = src->keeping.retry_delay; } if (common->keeping.enable == FALSE || common->keeping.retry_limit == FALSE) { common->retry_limit = src->retry_limit; common->keeping.retry_limit = src->keeping.retry_limit; } // max connections if (common->keeping.enable == FALSE || common->keeping.max_connections == FALSE) { common->max_connections = src->max_connections; common->keeping.max_connections = src->keeping.max_connections; } // speed if (common->keeping.enable == FALSE || common->keeping.max_upload_speed == FALSE) { common->max_upload_speed = src->max_upload_speed; common->keeping.max_upload_speed = src->keeping.max_upload_speed; } if (common->keeping.enable == FALSE || common->keeping.max_download_speed == FALSE) { common->max_download_speed = src->max_download_speed; common->keeping.max_download_speed = src->keeping.max_download_speed; } // timestamp if (common->keeping.enable == FALSE || common->keeping.timestamp == FALSE) { common->timestamp = src->timestamp; common->keeping.timestamp = src->keeping.timestamp; } if (common->keeping.enable == FALSE || common->keeping.debug_level == FALSE) { common->debug_level = src->debug_level; common->keeping.debug_level = src->keeping.debug_level; } if (common->keeping.enable == FALSE) common->keeping = src->keeping; return TRUE; } // helper functions char* uget_name_from_uri_str(const char* uri) { UgUri uuri; ug_uri_init(&uuri, uri); return uget_name_from_uri(&uuri); } char* uget_name_from_uri(UgUri* uuri) { const char* filename; char* name = NULL; int length; if (uuri->scheme_len == 6 && strncmp(uuri->uri, "magnet", 6) == 0) { length = 0; filename = strstr(uuri->uri + uuri->file, "dn="); if (filename) { filename = filename + 3; length = strcspn(filename, "&"); name = ug_malloc(length + 1); ug_decode_uri(filename, length, name); if (ug_utf8_get_invalid(name, NULL) != -1) name = ug_strndup(filename, length); } } if (name == NULL) { length = ug_uri_file(uuri, &filename); if (length == 0) name = ug_strdup(uuri->uri); else name = ug_uri_get_file(uuri); } return name; } // ---------------------------------------------------------------------------- // UgetProgress static const UgEntry UgetProgressEntry[] = { {"complete", offsetof(UgetProgress, complete), UG_ENTRY_INT64, NULL, NULL}, {"total", offsetof(UgetProgress, total), UG_ENTRY_INT64, NULL, NULL}, {"elapsed", offsetof(UgetProgress, elapsed), UG_ENTRY_INT64, NULL, NULL}, {"uploaded", offsetof(UgetProgress, uploaded), UG_ENTRY_INT64, NULL, NULL}, {"percent", offsetof(UgetProgress, percent), UG_ENTRY_INT, NULL, NULL}, // {"ratio", offsetof(UgetProgress, ratio), UG_ENTRY_DOUBLE, NULL, NULL}, {NULL} // null-terminated }; static const UgDataInfo UgetProgressInfoStatic = { "progress", // name sizeof(UgetProgress), // size (UgInitFunc) NULL, (UgFinalFunc) NULL, (UgAssignFunc) NULL, UgetProgressEntry, }; // extern const UgDataInfo* UgetProgressInfo = &UgetProgressInfoStatic; // ---------------------------------------------------------------------------- // UgetProxy static void uget_proxy_final (UgetProxy* proxy); static int uget_proxy_assign (UgetProxy* proxy, UgetProxy* src); #ifdef HAVE_LIBPWMD static const UgEntry UgetProxyPwmdEntry[] = { {"socket", offsetof(struct UgetProxyPwmd, socket), UG_ENTRY_STRING, NULL, NULL}, {"socket-args", offsetof(struct UgetProxyPwmd, socket_args), UG_ENTRY_STRING, NULL, NULL}, {"file", offsetof(struct UgetProxyPwmd, file), UG_ENTRY_STRING, NULL, NULL}, {"element", offsetof(struct UgetProxyPwmd, element), UG_ENTRY_STRING, NULL, NULL}, }; #endif // End of HAVE_LIBPWMD static const UgEntry UgetProxyEntry[] = { {"host", offsetof(UgetProxy, host), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"port", offsetof(UgetProxy, port), UG_ENTRY_UINT, NULL, NULL}, {"type", offsetof(UgetProxy, type), UG_ENTRY_UINT, NULL, NULL}, {"user", offsetof(UgetProxy, user), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"password", offsetof(UgetProxy, password), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, #ifdef HAVE_LIBPWMD {"pwmd", offsetof(UgetProxy, pwmd), UG_ENTRY_OBJECT, (void*) UgetProxyPwmdEntry, NULL}, #endif {NULL}, // null-terminated }; static const UgDataInfo UgetProxyInfoStatic = { "proxy", // name sizeof(UgetProxy), // size (UgInitFunc) NULL, (UgFinalFunc) uget_proxy_final, (UgAssignFunc) uget_proxy_assign, UgetProxyEntry, // entry }; // extern const UgDataInfo* UgetProxyInfo = &UgetProxyInfoStatic; static void uget_proxy_final(UgetProxy* proxy) { ug_free(proxy->host); ug_free(proxy->user); ug_free(proxy->password); #ifdef HAVE_LIBPWMD ug_free(proxy->pwmd.socket); ug_free(proxy->pwmd.socket_args); ug_free(proxy->pwmd.file); ug_free(proxy->pwmd.element); #endif // HAVE_LIBPWMD } static int uget_proxy_assign(UgetProxy* proxy, UgetProxy* src) { if (proxy->keeping.enable == FALSE || proxy->keeping.host == FALSE) { ug_free(proxy->host); proxy->host = (src->host) ? ug_strdup(src->host) : NULL; proxy->keeping.host = src->keeping.host; } if (proxy->keeping.enable == FALSE || proxy->keeping.port == FALSE) { proxy->port = src->port; proxy->keeping.port = src->keeping.port; } if (proxy->keeping.enable == FALSE || proxy->keeping.type == FALSE) { proxy->type = src->type; proxy->keeping.type = src->keeping.type; } if (proxy->keeping.enable == FALSE || proxy->keeping.user == FALSE) { ug_free(proxy->user); proxy->user = (src->user) ? ug_strdup(src->user) : NULL; proxy->keeping.user = src->keeping.user; } if (proxy->keeping.enable == FALSE || proxy->keeping.password == FALSE) { ug_free(proxy->password); proxy->password = (src->password) ? ug_strdup(src->password) : NULL; proxy->keeping.password = src->keeping.password; } #ifdef HAVE_LIBPWMD if (proxy->keeping.enable == FALSE || proxy->pwmd.keeping.socket == FALSE) { ug_free(proxy->pwmd.socket); proxy->pwmd.socket = (src->pwmd.socket) ? ug_strdup(src->pwmd.socket) : NULL; proxy->pwmd.keeping.socket = src->pwmd.keeping.socket; } if (proxy->keeping.enable == FALSE || proxy->pwmd.keeping.socket_args == FALSE) { ug_free(proxy->pwmd.socket_args); proxy->pwmd.socket_args = (src->pwmd.socket_args) ? ug_strdup(src->pwmd.socket_args) : NULL; proxy->pwmd.keeping.socket_args = src->pwmd.keeping.socket_args; } if (proxy->keeping.enable == FALSE || proxy->pwmd.keeping.file == FALSE) { ug_free(proxy->pwmd.file); proxy->pwmd.file = (src->pwmd.file) ? ug_strdup(src->pwmd.file) : NULL; proxy->pwmd.keeping.file = src->pwmd.keeping.file; } if (proxy->keeping.enable == FALSE || proxy->pwmd.keeping.element == FALSE) { ug_free(proxy->pwmd.element); proxy->pwmd.element = (src->pwmd.element) ? ug_strdup(src->pwmd.element) : NULL; proxy->pwmd.keeping.element = src->pwmd.keeping.element; } #endif // HAVE_LIBPWMD if (proxy->keeping.enable == FALSE) proxy->keeping = src->keeping; return TRUE; } // --------------------------------------------------------------------------- // UgetHttp static void uget_http_init (UgetHttp* http); static void uget_http_final (UgetHttp* http); static int uget_http_assign (UgetHttp* http, UgetHttp* src); static const UgEntry UgetHttpEntry[] = { {"user", offsetof(UgetHttp, user), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"password", offsetof(UgetHttp, password), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"referrer", offsetof(UgetHttp, referrer), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"user-agent", offsetof(UgetHttp, user_agent), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"post-data", offsetof(UgetHttp, post_data), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"post-file", offsetof(UgetHttp, post_file), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"cookie-data", offsetof(UgetHttp, cookie_data), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"cookie-file", offsetof(UgetHttp, cookie_file), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"redirection-limit", offsetof(UgetHttp, redirection_limit),UG_ENTRY_UINT, NULL, NULL}, {NULL}, // null-terminated }; static const UgDataInfo UgetHttpInfoStatic = { "http", // name sizeof(UgetHttp), // size (UgInitFunc) uget_http_init, (UgFinalFunc) uget_http_final, (UgAssignFunc) uget_http_assign, UgetHttpEntry, // entry }; // extern const UgDataInfo* UgetHttpInfo = &UgetHttpInfoStatic; static void uget_http_init(UgetHttp* http) { http->redirection_limit = 30; } static void uget_http_final(UgetHttp* http) { ug_free(http->user); ug_free(http->password); ug_free(http->referrer); ug_free(http->user_agent); ug_free(http->post_data); ug_free(http->post_file); ug_free(http->cookie_data); ug_free(http->cookie_file); } static int uget_http_assign(UgetHttp* http, UgetHttp* src) { if (http->keeping.enable == FALSE || http->keeping.user == FALSE) { ug_free(http->user); http->user = (src->user) ? ug_strdup(src->user) : NULL; http->keeping.user = src->keeping.user; } if (http->keeping.enable == FALSE || http->keeping.password == FALSE) { ug_free(http->password); http->password = (src->password) ? ug_strdup(src->password) : NULL; http->keeping.password = src->keeping.password; } if (http->keeping.enable == FALSE || http->keeping.referrer == FALSE) { ug_free(http->referrer); http->referrer = (src->referrer) ? ug_strdup(src->referrer) : NULL; http->keeping.referrer = src->keeping.referrer; } if (http->keeping.enable == FALSE || http->keeping.user_agent == FALSE) { ug_free(http->user_agent); http->user_agent = (src->user_agent) ? ug_strdup(src->user_agent) : NULL; http->keeping.user_agent = src->keeping.user_agent; } if (http->keeping.enable == FALSE || http->keeping.post_data == FALSE) { ug_free(http->post_data); http->post_data = (src->post_data) ? ug_strdup(src->post_data) : NULL; http->keeping.post_data = src->keeping.post_data; } if (http->keeping.enable == FALSE || http->keeping.post_file == FALSE) { ug_free(http->post_file); http->post_file = (src->post_file) ? ug_strdup(src->post_file) : NULL; http->keeping.post_file = src->keeping.post_file; } if (http->keeping.enable == FALSE || http->keeping.cookie_data == FALSE) { ug_free (http->cookie_data); http->cookie_data = (src->cookie_data) ? ug_strdup(src->cookie_data) : NULL; http->keeping.cookie_data = src->keeping.cookie_data; } if (http->keeping.enable == FALSE || http->keeping.cookie_file == FALSE) { ug_free(http->cookie_file); http->cookie_file = (src->cookie_file) ? ug_strdup(src->cookie_file) : NULL; http->keeping.cookie_file = src->keeping.cookie_file; } if (http->keeping.enable == FALSE || http->keeping.redirection_limit == FALSE) { http->redirection_limit = src->redirection_limit; http->keeping.redirection_limit = src->keeping.redirection_limit; } if (http->keeping.enable == FALSE) http->keeping = src->keeping; return TRUE; } // --------------------------------------------------------------------------- // UgetFtp static void uget_ftp_final (UgetFtp* ftp); static int uget_ftp_assign (UgetFtp* ftp, UgetFtp* src); static const UgEntry UgetFtpEntry[] = { {"user", offsetof(UgetFtp, user), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"password", offsetof(UgetFtp, password), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"active-mode", offsetof(UgetFtp, active_mode), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; static const UgDataInfo UgetFtpInfoStatic = { "ftp", // name sizeof(UgetFtp), // size (UgInitFunc) NULL, (UgFinalFunc) uget_ftp_final, (UgAssignFunc) uget_ftp_assign, UgetFtpEntry, // entry }; // extern const UgDataInfo* UgetFtpInfo = &UgetFtpInfoStatic; static void uget_ftp_final(UgetFtp* ftp) { ug_free(ftp->user); ug_free(ftp->password); } static int uget_ftp_assign(UgetFtp* ftp, UgetFtp* src) { if (ftp->keeping.enable == FALSE || ftp->keeping.user == FALSE) { ug_free(ftp->user); ftp->user = (src->user) ? ug_strdup(src->user) : NULL; ftp->keeping.user = src->keeping.user; } if (ftp->keeping.enable == FALSE || ftp->keeping.password == FALSE) { ug_free(ftp->password); ftp->password = (src->password) ? ug_strdup(src->password) : NULL; ftp->keeping.password = src->keeping.password; } if (ftp->keeping.enable == FALSE || ftp->keeping.active_mode == FALSE) { ftp->active_mode = src->active_mode; ftp->keeping.active_mode = src->keeping.active_mode; } if (ftp->keeping.enable == FALSE) ftp->keeping = src->keeping; return TRUE; } // --------------------------------------------------------------------------- // UgetLog static void uget_log_final(UgetLog* log); static void ug_json_write_list_message(UgJson* json, UgList* list); static UgJsonError ug_json_parse_list_message(UgJson* json, const char* name, const char* value, void* list, void* none); static const UgEntry UgetLogEntry[] = { {"added-time", offsetof(UgetLog, added_time), UG_ENTRY_CUSTOM, ug_json_parse_time_t, ug_json_write_time_t}, {"completed-time", offsetof(UgetLog, completed_time), UG_ENTRY_CUSTOM, ug_json_parse_time_t, ug_json_write_time_t}, {"messages", offsetof(UgetLog, messages), UG_ENTRY_ARRAY, ug_json_parse_list_message, ug_json_write_list_message}, {NULL}, // null-terminated }; static const UgDataInfo UgetLogInfoStatic = { "log", // name sizeof(UgetLog), // size (UgInitFunc) NULL, (UgFinalFunc) uget_log_final, (UgAssignFunc) NULL, UgetLogEntry, // entry }; // extern const UgDataInfo* UgetLogInfo = &UgetLogInfoStatic; static void uget_log_final(UgetLog* log) { ug_list_foreach(&log->messages, (UgForeachFunc) uget_event_free, NULL); } static UgJsonError ug_json_parse_list_message(UgJson* json, const char* name, const char* value, void* list, void* none) { UgetEvent* event; if (json->type != UG_JSON_OBJECT) return UG_JSON_ERROR_TYPE_NOT_MATCH; event = uget_event_new(UGET_EVENT_EMPTY); ug_list_append(list, (UgLink*) event); ug_json_push(json, ug_json_parse_entry, event, (void*) UgetEventEntry); return UG_JSON_ERROR_NONE; } void ug_json_write_list_message(UgJson* json, UgList* list) { UgetEvent* link; for (link = (void*)list->head; link; link = link->next) { ug_json_write_object_head(json); ug_json_write_entry(json, link, UgetEventEntry); ug_json_write_object_tail(json); } } // ---------------------------------------------------------------------------- // UgetRelation static void uget_relation_init(UgetRelation* relation); static void uget_relation_final(UgetRelation* relation); // deprecated static UgJsonError ug_json_parse_task_priority (UgJson* json, const char* name, const char* value, void* prelation, void* none); static const UgEntry UgetRelationEntry[] = { {"group", offsetof(UgetRelation, group), UG_ENTRY_INT, NULL, NULL}, {"priority", offsetof(UgetRelation, priority), UG_ENTRY_INT, NULL, NULL}, // deprecated {"task", 0, UG_ENTRY_CUSTOM, ug_json_parse_task_priority, NULL}, {NULL} // null-terminated }; static const UgDataInfo UgetRelationInfoStatic = { "relation", // name sizeof(UgetRelation), // size (UgInitFunc) uget_relation_init, (UgFinalFunc) uget_relation_final, (UgAssignFunc) NULL, UgetRelationEntry, }; // extern const UgDataInfo* UgetRelationInfo = &UgetRelationInfoStatic; static void uget_relation_init(UgetRelation* relation) { relation->priority = UGET_PRIORITY_NORMAL; } static void uget_relation_final(UgetRelation* relation) { ug_free(relation->task); } // deprecated - convert old format to new static UgJsonError ug_json_parse_task_priority (UgJson* json, const char* name, const char* value, void* prelation, void* none) { UgetRelation* relation = prelation; if (strcmp(name, "task") == 0 && json->type == UG_JSON_OBJECT) ug_json_push(json, ug_json_parse_task_priority, relation, none); else if (strcmp(name, "priority") == 0 && json->type == UG_JSON_NUMBER) relation->priority = strtol(value, NULL, 10); return UG_JSON_ERROR_NONE; } // ---------------------------------------------------------------------------- // UgetCategory static void uget_category_init(UgetCategory* category); static void uget_category_final(UgetCategory* category); static int uget_category_assign(UgetCategory* category, UgetCategory* src); static void ug_array_str_copy(UgArrayStr* dest, UgArrayStr* src); static const UgEntry UgetCategoryEntry[] = { {"hosts", offsetof(UgetCategory, hosts), UG_ENTRY_ARRAY, ug_json_parse_array_string, ug_json_write_array_string}, {"schemes", offsetof(UgetCategory, schemes), UG_ENTRY_ARRAY, ug_json_parse_array_string, ug_json_write_array_string}, {"file-exts", offsetof(UgetCategory, file_exts), UG_ENTRY_ARRAY, ug_json_parse_array_string, ug_json_write_array_string}, {"active-limit", offsetof(UgetCategory, active_limit), UG_ENTRY_INT, NULL, NULL}, {"finished-limit", offsetof(UgetCategory, finished_limit), UG_ENTRY_INT, NULL, NULL}, {"recycled-limit", offsetof(UgetCategory, recycled_limit), UG_ENTRY_INT, NULL, NULL}, {NULL} // null-terminated }; static const UgDataInfo UgetCategoryInfoStatic = { "category", // name sizeof(UgetCategory), // size (UgInitFunc) uget_category_init, (UgFinalFunc) uget_category_final, (UgAssignFunc) uget_category_assign, UgetCategoryEntry, }; // extern const UgDataInfo* UgetCategoryInfo = &UgetCategoryInfoStatic; static void uget_category_init(UgetCategory* category) { ug_array_init(&category->hosts, sizeof(char*), 8); ug_array_init(&category->schemes, sizeof(char*), 8); ug_array_init(&category->file_exts, sizeof(char*), 8); category->active_limit = 3; category->finished_limit = 300; category->recycled_limit = 300; } static void uget_category_final(UgetCategory* category) { ug_array_foreach_str(&category->hosts, (UgForeachFunc) ug_free, NULL); ug_array_foreach_str(&category->schemes, (UgForeachFunc) ug_free, NULL); ug_array_foreach_str(&category->file_exts, (UgForeachFunc) ug_free, NULL); ug_array_clear(&category->hosts); ug_array_clear(&category->schemes); ug_array_clear(&category->file_exts); } static int uget_category_assign(UgetCategory* category, UgetCategory* src) { category->active_limit = src->active_limit; category->finished_limit = src->finished_limit; category->recycled_limit = src->recycled_limit; ug_array_str_copy(&category->schemes, &src->schemes); ug_array_str_copy(&category->hosts, &src->hosts); ug_array_str_copy(&category->file_exts, &src->file_exts); return TRUE; } static void ug_array_str_copy(UgArrayStr* dest, UgArrayStr* src) { int index; ug_array_foreach_str(dest, (UgForeachFunc) ug_free, NULL); dest->length = 0; for (index = 0; index < src->length; index++) *(char**) ug_array_alloc(dest, 1) = ug_strdup(src->at[index]); } uget-2.2.2/uget/UgetPluginEmpty.c0000664000175000017500000001621513470304402013620 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // ---------------------------------------------------------------------------- // UgetPluginInfo (derived from UgTypeInfo) static void plugin_init (UgetPluginEmpty* plugin); static void plugin_final(UgetPluginEmpty* plugin); static int plugin_ctrl (UgetPluginEmpty* plugin, int code, void* data); static int plugin_accept(UgetPluginEmpty* plugin, UgInfo* node_info); static int plugin_sync (UgetPluginEmpty* plugin, UgInfo* node_info); static UgetResult global_set(int code, void* parameter); static UgetResult global_get(int code, void* parameter); static const char* schemes[] = {"http", "ftp", NULL}; static const char* types[] = {"torrent", NULL}; static const UgetPluginInfo UgetPluginEmptyInfoStatic = { "empty", sizeof(UgetPluginEmpty), (UgInitFunc) plugin_init, (UgFinalFunc) plugin_final, (UgetPluginSyncFunc) plugin_accept, (UgetPluginSyncFunc) plugin_sync, (UgetPluginCtrlFunc) plugin_ctrl, NULL, schemes, types, (UgetPluginGlobalFunc) global_set, (UgetPluginGlobalFunc) global_get }; // extern const UgetPluginInfo* UgetPluginEmptyInfo = &UgetPluginEmptyInfoStatic; // ---------------------------------------------------------------------------- // global data and it's functions. static struct { int initialized; int ref_count; } global = {0, 0}; static UgetResult global_init(void) { if (global.initialized == FALSE) { // // your global initialized code // if initialization failed, // return UGET_RESULT_ERROR; // global.initialized = TRUE; puts("UgetPluginEmpty global initialize"); } global.ref_count++; return UGET_RESULT_OK; } static void global_ref(void) { global.ref_count++; } static void global_unref(void) { if (global.initialized == FALSE) return; global.ref_count--; if (global.ref_count == 0) { global.initialized = FALSE; // // your global finalized code // puts("UgetPluginEmpty global finalize"); } } static UgetResult global_set(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: // do global initialize/uninitialize here if (parameter) return global_init(); else global_unref(); break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } static UgetResult global_get(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: if (parameter) *(int*)parameter = global.initialized; break; case UGET_PLUGIN_GLOBAL_ERROR_CODE: if (parameter) *(int*)parameter = 0; break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } // ---------------------------------------------------------------------------- // control functions static void plugin_init(UgetPluginEmpty* plugin) { if (global.initialized == FALSE) global_init(); else global_ref(); // // your initialized code. // } static void plugin_final(UgetPluginEmpty* plugin) { // // your finalized code. // // clear UgetCommon if (plugin->common) ug_data_free(plugin->common); global_unref(); } // ---------------------------------------------------------------------------- // plugin_ctrl static int plugin_ctrl_speed(UgetPluginEmpty* plugin, int* speed); static int plugin_start(UgetPluginEmpty* plugin); static void plugin_stop(UgetPluginEmpty* plugin); static int plugin_ctrl(UgetPluginEmpty* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: if (plugin->common) return plugin_start(plugin); break; case UGET_PLUGIN_CTRL_STOP: plugin_stop(plugin); return TRUE; case UGET_PLUGIN_CTRL_SPEED: // speed control return plugin_ctrl_speed(plugin, data); // state ---------------- case UGET_PLUGIN_GET_STATE: *(int*)data = FALSE; return TRUE; default: break; } return FALSE; } static int plugin_ctrl_speed(UgetPluginEmpty* plugin, int* speed) { UgetCommon* common; int value; // notify plug-in that speed limit has been changed if (plugin->limit[0] != speed[0] || plugin->limit[1] != speed[1]) plugin->limit_changed = TRUE; // decide speed limit by user specified data. if (plugin->common == NULL) { plugin->limit[0] = speed[0]; plugin->limit[1] = speed[1]; } else { common = plugin->common; // download value = speed[0]; if (common->max_download_speed) { if (value > common->max_download_speed || value == 0) { value = common->max_download_speed; plugin->limit_changed = TRUE; } } plugin->limit[0] = value; // upload value = speed[1]; if (common->max_upload_speed) { if (value > common->max_upload_speed || value == 0) { value = common->max_upload_speed; plugin->limit_changed = TRUE; } } plugin->limit[1] = value; } return plugin->limit_changed; } // ---------------------------------------------------------------------------- // plugin_accept/plugin_sync // return TRUE if UgInfo was accepted by plug-in. // return FALSE if UgInfo is lack of necessary data. static int plugin_accept(UgetPluginEmpty* plugin, UgInfo* node_info) { UgetCommon* common; common = ug_info_get(node_info, UgetCommonInfo); if (common == NULL || common->uri == NULL) return FALSE; plugin->common = ug_data_copy(plugin->common); return TRUE; } // return TRUE if plug-in is running or some data need to sync. // return FALSE if plug-in was stopped and no data need to sync. static int plugin_sync(UgetPluginEmpty* plugin, UgInfo* node_info) { return FALSE; } // ---------------------------------------------------------------------------- static int plugin_start(UgetPluginEmpty* plugin) { return TRUE; } static void plugin_stop(UgetPluginEmpty* plugin) { } uget-2.2.2/uget/UgetEvent.h0000664000175000017500000001204313470304402012424 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_EVENT_H #define UGET_EVENT_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetEvent UgetEvent; typedef enum { UGET_EVENT_EMPTY = 0, // message log UGET_EVENT_WARNING, UGET_EVENT_NORMAL, // e.g. connecting to host UGET_EVENT_ERROR, // plug-in notifition UGET_EVENT_STOP, UGET_EVENT_START, UGET_EVENT_COMPLETED, // Download completed UGET_EVENT_UPLOADING, // Uploading UGET_EVENT_STOP_UPLOADING, // events for uget_task_dispatch() UGET_EVENT_NAME, // UgetNode's name changed } UgetEventType; typedef enum { UGET_EVENT_NORMAL_CUSTOM = 0, // must be 0 UGET_EVENT_NORMAL_CONNECT, UGET_EVENT_NORMAL_TRANSMIT, UGET_EVENT_NORMAL_RETRY, UGET_EVENT_NORMAL_COMPLETE, // download completed UGET_EVENT_NORMAL_FINISH, // completed, it will not be used in future. // resumable UGET_EVENT_NORMAL_RESUMABLE, UGET_EVENT_NORMAL_NOT_RESUMABLE, } UgetEventNormal; typedef enum { UGET_EVENT_WARNING_CUSTOM = 0, // must be 0 UGET_EVENT_WARNING_FILE_RENAME_FAILED, } UgetEventWarning; typedef enum { UGET_EVENT_ERROR_CUSTOM = 0, // must be 0 UGET_EVENT_ERROR_CONNECT_FAILED, UGET_EVENT_ERROR_FOLDER_CREATE_FAILED, UGET_EVENT_ERROR_FILE_CREATE_FAILED, UGET_EVENT_ERROR_FILE_OPEN_FAILED, UGET_EVENT_ERROR_THREAD_CREATE_FAILED, UGET_EVENT_ERROR_INCORRECT_SOURCE, UGET_EVENT_ERROR_OUT_OF_RESOURCE, // disk full or out of memory UGET_EVENT_ERROR_NO_OUTPUT_FILE, UGET_EVENT_ERROR_NO_OUTPUT_SETTING, UGET_EVENT_ERROR_TOO_MANY_RETRIES, UGET_EVENT_ERROR_UNSUPPORTED_SCHEME, UGET_EVENT_ERROR_UNSUPPORTED_PROTOCOL = UGET_EVENT_ERROR_UNSUPPORTED_SCHEME, UGET_EVENT_ERROR_UNSUPPORTED_FILE, UGET_EVENT_ERROR_POST_FILE_NOT_FOUND, UGET_EVENT_ERROR_COOKIE_FILE_NOT_FOUND, // plug-in error code // UGET_EVENT_ERROR_PLUGIN_INITIALIZE_FAILED = 10000, } UgetEventError; extern const UgEntry UgetEventEntry[]; // ---------------------------------------------------------------------------- // UgetEvent: It can store in UgetLog. struct UgetEvent { UG_LINK_MEMBERS (UgetEvent, UgetEvent, self); /* // ------ UgLink members ------ UgetEvent* self; UgetEvent* next; UgetEvent* prev; */ int type; // UgetEventType time_t time; // date & time (seconds) char* string; // User readable string or name parameter for UGET_EVENT_RENAME. // extra data union { void* data; int code; // UGET_EVENT_ERROR, UGET_EVENT_WARNING, UGET_EVENT_NORMAL } value; // } value[3]; }; UgetEvent* uget_event_new (UgetEventType type, ...); void uget_event_free (UgetEvent* event); #define uget_event_new_error(code, string) uget_event_new (UGET_EVENT_ERROR, code, string) #define uget_event_new_normal(code, string) uget_event_new (UGET_EVENT_NORMAL, code, string) #define uget_event_new_warning(code, string) uget_event_new (UGET_EVENT_WARNING, code, string) /* UgetEvent* uget_event_new_error (int code, const char* string); UgetEvent* uget_event_new_normal (int code, const char* string); UgetEvent* uget_event_new_warning (int code, const char* string); */ #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { // This one is for directly use only. You can NOT derived it. struct Event : UgetEvent {}; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_EVENT_H uget-2.2.2/uget/UgetData.h0000664000175000017500000002515513470304402012224 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_DATA_H #define UGET_DATA_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif // group data typedef struct UgetCommon UgetCommon; typedef struct UgetProgress UgetProgress; typedef struct UgetProxy UgetProxy; typedef struct UgetHttp UgetHttp; typedef struct UgetFtp UgetFtp; typedef struct UgetLog UgetLog; typedef struct UgetRelation UgetRelation; typedef struct UgetCategory UgetCategory; extern const UgDataInfo* UgetCommonInfo; extern const UgDataInfo* UgetProgressInfo; extern const UgDataInfo* UgetProxyInfo; extern const UgDataInfo* UgetHttpInfo; extern const UgDataInfo* UgetFtpInfo; extern const UgDataInfo* UgetLogInfo; extern const UgDataInfo* UgetRelationInfo; extern const UgDataInfo* UgetCategoryInfo; /* ---------------------------------------------------------------------------- UgetCommon: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetCommon */ struct UgetCommon { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member char* name; char* uri; char* mirrors; char* file; char* folder; char* user; char* password; // timeout unsigned int connect_timeout; // second unsigned int transmit_timeout; // second // retry int retry_delay; // second int retry_limit; // limit of retry_count int retry_count; unsigned int max_connections; // max connections per server int max_upload_speed; // bytes per seconds int max_download_speed; // bytes per seconds // retrieve timestamp of the remote file if it is available. int timestamp; // retrieve file timestamp // debug int debug_level; // keeping flags used by ug_data_assign () // They works like read-only struct { uint8_t enable:1; uint8_t name:1; uint8_t uri:1; uint8_t mirrors:1; uint8_t file:1; uint8_t folder:1; uint8_t user:1; uint8_t password:1; uint8_t timestamp:1; uint8_t connect_timeout:1; uint8_t transmit_timeout:1; uint8_t retry_delay:1; uint8_t retry_limit:1; uint8_t max_connections:1; uint8_t max_upload_speed:1; uint8_t max_download_speed:1; uint8_t discard_timestamp:1; uint8_t debug_level:1; } keeping; }; // helper functions for UgetCommon::name char* uget_name_from_uri(UgUri* uri); char* uget_name_from_uri_str(const char* uri); /* ---------------------------------------------------------------------------- UgetProgress: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetProgress */ struct UgetProgress { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member int64_t elapsed; // consume time (seconds) int64_t left; // remain time (seconds) int64_t complete; // complete size int64_t total; // total size // torrent - upload int64_t uploaded; double ratio; int upload_speed; // other int download_speed; int percent; }; /* ---------------------------------------------------------------------------- UgetProxy: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetProxy */ typedef enum { UGET_PROXY_NONE, UGET_PROXY_DEFAULT, // Decided by plug-ins UGET_PROXY_HTTP, UGET_PROXY_SOCKS4, UGET_PROXY_SOCKS5, #ifdef HAVE_LIBPWMD UGET_PROXY_PWMD, #endif UGET_PROXY_N_TYPE, } UgetProxyType; struct UgetProxy { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member char* host; unsigned int port; UgetProxyType type; char* user; char* password; struct { uint8_t enable:1; uint8_t host:1; uint8_t port:1; uint8_t type:1; uint8_t user:1; uint8_t password:1; } keeping; #ifdef HAVE_LIBPWMD struct UgetProxyPwmd { char* socket; char* socket_args; char* file; char* element; struct { uint8_t socket:1; uint8_t socket_args:1; uint8_t file:1; uint8_t element:1; } keeping; } pwmd; #endif // HAVE_LIBPWMD }; /* ---------------------------------------------------------------------------- UgetHttp: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetHttp */ struct UgetHttp { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member char* user; char* password; char* referrer; char* user_agent; char* post_data; char* post_file; char* cookie_data; char* cookie_file; unsigned int redirection_limit; // limit of redirection_count unsigned int redirection_count; // count of redirection struct { uint8_t enable:1; uint8_t user:1; uint8_t password:1; uint8_t referrer:1; uint8_t user_agent:1; uint8_t post_data:1; uint8_t post_file:1; uint8_t cookie_data:1; uint8_t cookie_file:1; uint8_t redirection_limit:1; } keeping; }; /* ---------------------------------------------------------------------------- UgetFtp: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetFtp */ struct UgetFtp { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member char* user; char* password; int active_mode; struct { uint8_t enable:1; uint8_t user:1; uint8_t password:1; uint8_t active_mode:1; } keeping; }; /* --------------------------------------------------------------------------- UgetLog UgType | `-- UgData | `-- UgetLog */ struct UgetLog { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member time_t added_time; time_t completed_time; UgList messages; // List for UgetEvent }; /* ---------------------------------------------------------------------------- UgetRelation: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetRelation */ typedef enum { UGET_PRIORITY_LOW, // 0 UGET_PRIORITY_NORMAL, // default UGET_PRIORITY_HIGH } UgetPriority; struct UgetRelation { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member int group; // UgetGroup int priority; // UgetPriority // used by UgetTask struct UgetRelationTask { UgetRelation* prev; UgetPlugin* plugin; // speed control int speed[2]; // current speed int limit[2]; // current speed limit }* task; }; /* ---------------------------------------------------------------------------- UgetCategory: It derived from UgData and store in UgInfo. UgType | `-- UgData | `-- UgetCategory */ struct UgetCategory { UG_DATA_MEMBERS; // const UgDataInfo* info; // UgData(UgType) member // use these to classify download UgArrayStr hosts; UgArrayStr schemes; UgArrayStr file_exts; // limit int active_limit; int finished_limit; // finished: completed and stopped int recycled_limit; // subcategory in UgetNode::fake UgetNode* active; UgetNode* queuing; UgetNode* finished; UgetNode* recycled; }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const UgDataInfo* const CommonInfo = UgetCommonInfo; const UgDataInfo* const ProgressInfo = UgetProgressInfo; const UgDataInfo* const ProxyInfo = UgetProxyInfo; const UgDataInfo* const HttpInfo = UgetHttpInfo; const UgDataInfo* const FtpInfo = UgetFtpInfo; const UgDataInfo* const LogInfo = UgetLogInfo; const UgDataInfo* const RelationInfo = UgetRelationInfo; const UgDataInfo* const CategoryInfo = UgetCategoryInfo; // These are for directly use only. You can NOT derived it. struct Common : Ug::DataMethod, UgetCommon { inline void* operator new(size_t size) { return ug_data_new(UgetCommonInfo); } }; struct Progress : Ug::DataMethod, UgetProgress { inline void* operator new(size_t size) { return ug_data_new(UgetProgressInfo); } }; struct Proxy : Ug::DataMethod, UgetProxy { inline void* operator new(size_t size) { return ug_data_new(UgetProxyInfo); } }; struct Http : Ug::DataMethod, UgetHttp { inline void* operator new(size_t size) { return ug_data_new(UgetHttpInfo); } }; struct Ftp : Ug::DataMethod, UgetFtp { inline void* operator new(size_t size) { return ug_data_new(UgetFtpInfo); } }; struct Log : Ug::DataMethod, UgetLog { inline void* operator new(size_t size) { return ug_data_new(UgetLogInfo); } }; struct Relation : Ug::DataMethod, UgetRelation { inline void* operator new(size_t size) { return ug_data_new(UgetRelationInfo); } }; struct Category : Ug::DataMethod, UgetCategory { inline void* operator new(size_t size) { return ug_data_new(UgetCategoryInfo); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_DATA_H uget-2.2.2/uget/UgetApp.c0000664000175000017500000014021313470304402012057 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include #ifdef HAVE_CONFIG_H #include #endif #if defined _WIN32 || defined _WIN64 #include // Sleep() #define ug_sleep Sleep #else #include // sleep(), usleep() #define ug_sleep(millisecond) usleep (millisecond * 1000) #endif // _WIN32 || _WIN64 #ifdef HAVE_GLIB #include #else #define _(x) x #endif static struct UgetNodeControl control_real = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; NULL, // UgetNodeFunc filter; }; static struct UgetNodeControl control_split = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; uget_node_filter_split, // UgetNodeFunc filter; }; static struct UgetNodeControl control_sorted = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; uget_node_filter_sorted, // UgetNodeFunc filter; }; static struct UgetNodeControl control_sorted_split = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; uget_node_filter_split, // UgetNodeFunc filter; }; static struct UgetNodeControl control_mix = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; uget_node_filter_mix, // UgetNodeFunc filter; }; static struct UgetNodeControl control_mix_split = { // NULL, // struct UgetNodeControl* children; &uget_node_default_notifier, // struct UgetNodeNotifier* notifier; {NULL, FALSE}, // struct UgetNodeSort sort; uget_node_filter_mix_split, // UgetNodeFunc filter; }; void uget_app_init (UgetApp* app) { UgetCommon* common; UgetNode* node; // real and virtual root nodes uget_node_init (&app->real, NULL); uget_node_init (&app->split, &app->real); uget_node_init (&app->sorted, &app->real); uget_node_init (&app->sorted_split, &app->sorted); uget_node_init (&app->mix, &app->real); uget_node_init (&app->mix_split, &app->mix); app->real.control = &control_real; app->split.control = &control_split; app->sorted.control = &control_sorted; app->sorted_split.control = &control_sorted_split; app->mix.control = &control_mix; app->mix_split.control = &control_mix_split; // add virtual category - "All Category" node = uget_node_new (NULL); common = ug_info_realloc(node->info, UgetCommonInfo); common->name = ug_strdup (_("All Category")); uget_node_append (&app->mix, node); uget_task_init (&app->task); ug_array_init (&app->nodes, sizeof (void*), 32); app->uri_hash = NULL; app->config_dir = NULL; // plug-in registry app->plugin_default = NULL; ug_registry_init (&app->plugins); // info registry ug_registry_init (&app->infos); ug_registry_add (&app->infos, UgetCommonInfo); ug_registry_add (&app->infos, UgetFilesInfo); ug_registry_add (&app->infos, UgetProgressInfo); ug_registry_add (&app->infos, UgetProxyInfo); ug_registry_add (&app->infos, UgetHttpInfo); ug_registry_add (&app->infos, UgetFtpInfo); ug_registry_add (&app->infos, UgetLogInfo); ug_registry_add (&app->infos, UgetRelationInfo); ug_registry_add (&app->infos, UgetCategoryInfo); ug_registry_sort (&app->infos); ug_info_set_registry (&app->infos); // counter app->n_error = 0; app->n_moved = 0; app->n_deleted = 0; app->n_completed = 0; } void uget_app_final (UgetApp* app) { ug_array_clear (&app->nodes); uget_task_final (&app->task); uget_app_clear_plugins (app); // clear app->plugins uget_node_clear_children (&app->mix_split); uget_node_clear_children (&app->mix); uget_node_clear_children (&app->sorted_split); uget_node_clear_children (&app->sorted); uget_node_clear_children (&app->split); uget_node_clear_children (&app->real); ug_registry_final (&app->plugins); ug_registry_final (&app->infos); uget_uri_hash_free (app->uri_hash); app->uri_hash = NULL; ug_free(app->config_dir); app->config_dir = NULL; } static UgArrayPtr* uget_app_store_nodes (UgetApp* app, UgetNode* parent) { UgetNode* dnode; UgArrayPtr* array; int index; array = &app->nodes; // array->length = 0; ug_array_alloc (array, parent->n_children); for (index = 0, dnode = parent->children; dnode; dnode = dnode->next) array->at[index++] = dnode->base; return array; } static void uget_app_clear_nodes (UgetApp* app) { app->nodes.length = 0; } static int uget_app_activate (UgetApp* app, UgetNode* cnode, UgetCategory* category) { UgetRelation* relation; UgetNode* dnode; UgetNode* sibling; UgetLog* log; UgArrayPtr* array; int index; // Because this function will change node linking, // program must store active nodes to array. array = uget_app_store_nodes (app, category->active); for (index = 0; index < array->length; index++) { dnode = array->at[index]; uget_node_updated (dnode); relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_ACTIVE) { // remove node and insert it again to sort node if (app->mix.control->sort.compare) { sibling = dnode->next; uget_node_remove (cnode, dnode); uget_node_clear_fake (dnode); uget_node_insert (cnode, sibling, dnode); app->n_moved++; } continue; } uget_task_remove (&app->task, dnode); uget_node_remove (cnode, dnode); uget_node_clear_fake (dnode); if (relation->group & UGET_GROUP_COMPLETED) { relation->group |= UGET_GROUP_FINISHED; sibling = category->finished->children; // completed time log = ug_info_realloc (dnode->info, UgetLogInfo); log->completed_time = time(NULL); // get current time app->n_completed++; } else { relation->group |= UGET_GROUP_QUEUING; sibling = category->queuing->children; if (relation->group & UGET_GROUP_ERROR) app->n_error++; } // try to insert download before finished & recycled if (sibling == NULL) sibling = category->finished->children; if (sibling == NULL) sibling = category->recycled->children; // get real sibling if (sibling) sibling = sibling->real; uget_node_insert (cnode, sibling, dnode); app->n_moved++; } uget_app_clear_nodes (app); // clear stored nodes return category->active->n_children; } static void uget_app_queuing (UgetApp* app, UgetNode* cnode, UgetCategory* category) { UgetRelation* relation; UgetNode* dnode; UgArrayPtr* array; int index; // Because uget_app_activate_download() will change node linking, // program must store queuing nodes to array before calling uget_app_activate_download() array = uget_app_store_nodes (app, category->queuing); for (index = 0; index < array->length; index++) { dnode = array->at[index]; if (category->active->n_children >= category->active_limit) break; relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_INACTIVE) continue; uget_app_activate_download (app, dnode); app->n_moved++; } uget_app_clear_nodes (app); // clear stored nodes } // return number of active download int uget_app_grow (UgetApp* app, int no_queuing) { UgetCategory* category; UgetNode* cnode; int n_active = 0; // dispatch plug-in event, calc speed uget_task_dispatch (&app->task); // active, queuing, finished, recycled for (cnode = app->real.children; cnode; cnode = cnode->next) { category = ug_info_realloc (cnode->info, UgetCategoryInfo); if (category == NULL) continue; uget_app_activate (app, cnode, category); if (no_queuing == FALSE) uget_app_queuing (app, cnode, category); n_active += category->active->n_children; } return n_active; } int uget_app_trim(UgetApp* app, UgArrayPtr* deleted_nodes) { UgetCategory* category; UgetNode* cnode; UgetNode* dnode; int n_deleted_prev = app->n_deleted; for (cnode = app->real.children; cnode; cnode = cnode->next) { category = ug_info_realloc(cnode->info, UgetCategoryInfo); if (category == NULL) continue; while (category->finished->n_children > category->finished_limit) { dnode = category->finished->last->real; uget_uri_hash_remove_download(app->uri_hash, dnode->info); uget_node_remove(cnode, dnode); uget_node_free(dnode); app->n_deleted++; // add deleted nodes to array if (deleted_nodes) *(void**)ug_array_alloc(deleted_nodes, 1) = dnode; } while (category->recycled->n_children > category->recycled_limit) { dnode = category->recycled->last->real; uget_uri_hash_remove_download(app->uri_hash, dnode->info); uget_node_remove(cnode, dnode); uget_node_free(dnode); app->n_deleted++; // add deleted nodes to array if (deleted_nodes) *(void**)ug_array_alloc(deleted_nodes, 1) = dnode; } } return app->n_deleted - n_deleted_prev; } void uget_app_set_config_dir (UgetApp* app, const char* dir) { ug_free (app->config_dir); app->config_dir = (dir) ? ug_strdup(dir) : NULL; } void uget_app_set_sorting (UgetApp* app, UgCompareFunc compare, int reversed) { UgetNode* node; UgetNode* real; node = app->mix.children; if (app->mix.control->sort.reverse != reversed) { app->mix.control->sort.reverse = reversed; app->mix_split.control->sort.reverse = reversed; app->sorted.control->sort.reverse = reversed; app->sorted_split.control->sort.reverse = reversed; if (app->mix.control->sort.compare == compare && compare) { // reverse first category in app->mix ug_node_reverse ((UgNode*) node); // reverse each category in app->mix_split for (node = app->mix_split.children; node; node = node->next) ug_node_reverse ((UgNode*) node); // reverse each category in app->sorted for (node = app->sorted.children; node; node = node->next) ug_node_reverse ((UgNode*) node); // reverse each category in app->sorted_split for (node = app->sorted_split.children; node; node = node->next) ug_node_reverse ((UgNode*) node); return; } } if (app->mix.control->sort.compare != compare) { app->mix.control->sort.compare = compare; app->mix_split.control->sort.compare = compare; app->sorted.control->sort.compare = compare; app->sorted_split.control->sort.compare = compare; if (compare == NULL) { // reorder first category in app->mix for (real = app->real.last; real; real = real->prev) uget_node_reorder_by_real (node, real); // reorder each category in app->mix_split for (node = app->mix_split.children; node; node = node->next) { uget_node_reorder_by_real (node, NULL); // reorder app->mix by state uget_node_reorder_by_fake (app->mix.children, node); } // reorder each category in app->sorted for (node = app->sorted.children; node; node = node->next) uget_node_reorder_by_real (node, NULL); // reorder each category in app->sorted_split for (node = app->sorted_split.children; node; node = node->next) uget_node_reorder_by_real (node, NULL); } else { // sort first category in app->mix uget_node_sort (node, compare, reversed); // reorder each category in app->mix_split for (node = app->mix_split.children; node; node = node->next) uget_node_reorder_by_real (node, NULL); // sort each category in app->sorted for (node = app->sorted.children; node; node = node->next) uget_node_sort (node, compare, reversed); // reorder each category in app->sorted_split for (node = app->sorted_split.children; node; node = node->next) uget_node_reorder_by_real (node, NULL); } } } void uget_app_set_notification (UgetApp* app, void* data, UgetNodeFunc inserted, UgetNodeFunc removed, UgNotifyFunc updated) { uget_node_default_notifier.inserted = inserted; uget_node_default_notifier.removed = removed; uget_node_default_notifier.updated = updated; uget_node_default_notifier.data = data; } void uget_app_add_category (UgetApp* app, UgetNode* cnode, int save_file) { UgetCategory* category; UgetNode* node; char* path_base; char* path; uget_node_append (&app->real, cnode); uget_uri_hash_add_category (app->uri_hash, cnode); category = ug_info_realloc (cnode->info, UgetCategoryInfo); for (node = cnode->fake; node; node = node->peer) { switch (uget_node_get_group(node)) { case UGET_GROUP_ACTIVE: category->active = node; break; case UGET_GROUP_QUEUING: category->queuing = node; break; case UGET_GROUP_FINISHED: category->finished = node; break; case UGET_GROUP_RECYCLED: category->recycled = node; break; default: break; } } // save new category if (save_file) { path_base = ug_build_filename (app->config_dir, "category", NULL); #if defined _WIN32 || defined _WIN64 path = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', uget_node_child_position (&app->real, cnode)); #else path = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', uget_node_child_position (&app->real, cnode)); #endif // defined uget_app_save_category ((UgetApp*) app, cnode, path, NULL); ug_free (path_base); ug_free (path); } } int uget_app_move_category (UgetApp* app, UgetNode* cnode, UgetNode* position) { char* path1; char* path2; char* path3; char* path_base; int from_nth; int to_nth; from_nth = uget_node_child_position (&app->real, cnode); if (position) to_nth = uget_node_child_position (&app->real, position); else to_nth = app->real.n_children - 1; if (from_nth == -1 || to_nth == -1) return FALSE; uget_node_move (&app->real, position, cnode); if (app->config_dir == NULL) path_base = ug_strdup ("category"); else path_base = ug_build_filename (app->config_dir, "category", NULL); #if defined _WIN32 || defined _WIN64 path1 = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', from_nth); path2 = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', to_nth); path3 = ug_strdup_printf ("%s%cTemp.json", path_base, '\\'); #else path1 = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', from_nth); path2 = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', to_nth); path3 = ug_strdup_printf ("%s%cTemp.json", path_base, '/'); #endif // _WIN32 || _WIN64 ug_rename (path1, path3); ug_rename (path2, path1); ug_rename (path3, path2); ug_free (path1); ug_free (path2); ug_free (path3); ug_free (path_base); return TRUE; } void uget_app_delete_category (UgetApp* app, UgetNode* cnode) { char* path1; char* path2; char* path_base; int position; int count; position = ug_node_child_position ((UgNode*)&app->real, (UgNode*)cnode); if (position == -1) return; uget_app_stop_category (app, cnode); uget_uri_hash_remove_category (app->uri_hash, cnode); uget_node_remove (&app->real, cnode); uget_node_free (cnode); if (app->config_dir == NULL) path_base = ug_strdup ("category"); else path_base = ug_build_filename (app->config_dir, "category", NULL); for (count = position; ; count++) { #if defined _WIN32 || defined _WIN64 path1 = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', count); path2 = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', count+1); #else path1 = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', count); path2 = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', count+1); #endif // _WIN32 || _WIN64 ug_unlink (path1); if (ug_rename (path2, path1) == -1) { ug_free (path1); ug_free (path2); break; } ug_free (path1); ug_free (path2); } ug_free (path_base); } // move downloads from active to queuing void uget_app_stop_category (UgetApp* app, UgetNode* cnode) { UgetCategory* category; UgetNode* dnode; UgArrayPtr* array; int index; category = ug_info_realloc (cnode->info, UgetCategoryInfo); // Because uget_app_queue_download() will change node linking, // program must store active nodes to array before calling uget_app_queue_download() array = uget_app_store_nodes (app, category->active); for (index = array->length-1; index >= 0; index--) { dnode = array->at[index]; uget_app_queue_download (app, dnode); } uget_app_clear_nodes (app); // clear stored nodes } // pause active and queuing downloads void uget_app_pause_category (UgetApp* app, UgetNode* cnode) { UgetCategory* category; UgetNode* dnode; UgArrayPtr* array; int index; category = ug_info_realloc (cnode->info, UgetCategoryInfo); // Because uget_app_queue_download() will change node linking, // program must store active nodes to array before calling uget_app_queue_download() // pause all download in queuing ------------ array = uget_app_store_nodes (app, category->queuing); for (index = array->length-1; index >= 0; index--) { dnode = array->at[index]; uget_app_pause_download (app, dnode); } uget_app_clear_nodes (app); // clear stored nodes // pause all download in active ------------- array = uget_app_store_nodes (app, category->active); for (index = array->length-1; index >= 0; index--) { dnode = array->at[index]; uget_app_pause_download (app, dnode); } uget_app_clear_nodes (app); // clear stored nodes } // set (error and paused) downloads in queuing runnable void uget_app_resume_category (UgetApp* app, UgetNode* cnode) { UgetCategory* category; UgetNode* dnode; UgArrayPtr* array; int index; category = ug_info_realloc (cnode->info, UgetCategoryInfo); // Because uget_app_queue_download() will change node linking, // program must store active nodes to array before calling uget_app_queue_download() array = uget_app_store_nodes (app, category->queuing); for (index = array->length-1; index >= 0; index--) { dnode = array->at[index]; uget_app_queue_download (app, dnode); } uget_app_clear_nodes (app); // clear stored nodes } static int ug_match_file_exts (const char* file, char** exts) { const char* beg = NULL; const char* end; int index; // get file ext for (end = file + strlen (file) - 1; end >= file; end--) { if (end[0] == '.') { beg = end + 1; // + '.' break; } } if (beg == NULL) return -1; for (index = 0; *exts; exts++, index++) { if (strcasecmp (beg, *exts) == 0) return index; } return -1; } UgetNode* uget_app_match_category (UgetApp* app, UgUri* uuri, const char* file) { UgetCategory* category; UgetNode* cnode; int count; struct { UgetNode* cnode; int count; } matched; matched.cnode = NULL; matched.count = 0; for (cnode = app->real.children; cnode; cnode = cnode->next) { category = ug_info_realloc (cnode->info, UgetCategoryInfo); if (category == NULL) continue; // null-terminated *(char**)ug_array_alloc (&category->hosts, 1) = NULL; *(char**)ug_array_alloc (&category->schemes, 1) = NULL; *(char**)ug_array_alloc (&category->file_exts, 1) = NULL; category->hosts.length--; category->schemes.length--; category->file_exts.length--; // match download and category count = 0; if (ug_uri_match_hosts (uuri, category->hosts.at) >= 0) count++; if (ug_uri_match_schemes (uuri, category->schemes.at) >= 0) count++; if (ug_uri_match_file_exts (uuri, category->file_exts.at) >= 0) count++; else if (file && ug_match_file_exts (file, category->file_exts.at) >= 0) count++; if (matched.count < count) { matched.count = count; matched.cnode = cnode; if (matched.count == 3) break; } } return matched.cnode; } int uget_app_add_download_uri (UgetApp* app, const char* uri, UgetNode* cnode, int apply) { UgetNode* dnode; UgetCommon* common; dnode = uget_node_new (NULL); common = ug_info_realloc (dnode->info, UgetCommonInfo); common->uri = ug_strdup (uri); return uget_app_add_download (app, dnode, cnode, apply); } int uget_app_add_download (UgetApp* app, UgetNode* dnode, UgetNode* cnode, int apply) { UgetRelation* relation; UgetRelation* relation_c; UgetNode* sibling; UgetLog* log; UgUri* uuri; char* fattch; int value; struct { UgetCommon* common; UgetCategory* category; } temp; temp.common = ug_info_realloc (dnode->info, UgetCommonInfo); // replace invalid characters \/:*?"<>| by _ in filename. if (temp.common->file) ug_str_replace_chars (temp.common->file, "\\/:*?\"<>|", '_'); // decode name, filename, and category if (temp.common->uri) { uuri = ug_malloc(sizeof (UgUri)); ug_uri_init(uuri, temp.common->uri); // set UgetCommon::name if it's name is NULL if (temp.common->name == NULL) { if (temp.common->file) temp.common->name = ug_strdup(temp.common->file); else temp.common->name = uget_name_from_uri(uuri); } // backup file if (ug_uri_is_file(uuri)) { fattch = uget_app_save_attachment(app, dnode->info, temp.common->uri + uuri->path, NULL); if (fattch) { // uuri will failure ug_free(temp.common->uri); temp.common->uri = fattch; } } ug_free(uuri); // if (cnode == NULL) cnode = uget_app_match_category (app, uuri, temp.common->file); } if (cnode == NULL) cnode = app->real.children; if (cnode) { relation = ug_info_realloc(dnode->info, UgetRelationInfo); relation->group &= UGET_GROUP_MAJOR | UGET_GROUP_PAUSED; relation->group |= UGET_GROUP_QUEUING; log = ug_info_realloc (dnode->info, UgetLogInfo); log->added_time = time (NULL); // get current time if (apply) { value = temp.common->keeping.enable; temp.common->keeping.enable = TRUE; temp.common->keeping.uri = TRUE; ug_info_assign (dnode->info, cnode->info, UgetCategoryInfo); temp.common->keeping.enable = value; relation_c = ug_info_realloc(cnode->info, UgetRelationInfo); if (relation_c->group & UGET_GROUP_PAUSED) relation->group |= UGET_GROUP_PAUSED; } temp.category = ug_info_realloc (cnode->info, UgetCategoryInfo); // try to insert download before finished and recycled sibling = temp.category->finished->children; if (sibling == NULL) sibling = temp.category->recycled->children; // get real sibling if (sibling) sibling = sibling->real; uget_node_insert (cnode, sibling, dnode); uget_uri_hash_add_download(app->uri_hash, dnode->info); return TRUE; } return FALSE; } int uget_app_move_download (UgetApp* app, UgetNode* dnode, UgetNode* dnode_position) { UgetNode* cnode; cnode = dnode->parent; if (dnode_position) { if (cnode != dnode_position->parent) return FALSE; } else if (dnode->next == NULL) { return FALSE; } uget_node_move (cnode, dnode_position, dnode); return TRUE; } int uget_app_move_download_to (UgetApp* app, UgetNode* dnode, UgetNode* cnode) { UgetNode* sibling; UgetCategory* category; UgetRelation* relation; if (dnode->parent == cnode) return FALSE; category = ug_info_realloc(cnode->info, UgetCategoryInfo); relation = ug_info_realloc(dnode->info, UgetRelationInfo); switch (relation->group & UGET_GROUP_MAJOR) { case UGET_GROUP_ACTIVE: sibling = category->queuing->children; if (sibling == NULL) sibling = category->finished->children; if (sibling == NULL) sibling = category->recycled->children; break; default: case UGET_GROUP_QUEUING: case UGET_GROUP_FINISHED: sibling = category->finished->children; if (sibling == NULL) sibling = category->recycled->children; break; case UGET_GROUP_RECYCLED: sibling = category->recycled->children; break; } if (sibling) sibling = sibling->real; uget_node_remove (dnode->parent, dnode); uget_node_clear_fake (dnode); uget_node_insert (cnode, sibling, dnode); return TRUE; } // used by uget_app_delete_download() static int delete_files(UgetFiles* files, int has_temp_file) { UgetFile* file1; int n_error; for (n_error = 0, file1 = (UgetFile*)files->list.head; file1; file1 = file1->next) { if (file1->state & UGET_FILE_STATE_DELETED) continue; if (ug_file_is_exist(file1->path) == FALSE) file1->state |= UGET_FILE_STATE_DELETED; else if (ug_remove(file1->path) != 0) n_error++; else if (file1->type != UGET_FILE_TEMPORARY) file1->state |= UGET_FILE_STATE_DELETED; } return (n_error == 0) ? TRUE : FALSE; } // used by uget_app_delete_download() static UgThreadResult delete_files_thread(UgetFiles* files) { int count; #ifdef USE__ANDROID__SAF if (delete_files(files, TRUE) == FALSE) #endif for (count = 0; count < 3; count++) { ug_sleep(2 * 1000); // sleep 2 seconds if (delete_files(files, FALSE)) break; } ug_data_free(files); return UG_THREAD_RESULT; } int uget_app_delete_download (UgetApp* app, UgetNode* dnode, int delete_file) { UgThread thread; UgetFiles* files; int is_active; is_active = uget_task_remove(&app->task, dnode); #ifdef USE__ANDROID__SAF is_active = TRUE; // delete files in thread if program use Android SAF #endif uget_uri_hash_remove_download(app->uri_hash, dnode->info); files = ug_info_set(dnode->info, UgetFilesInfo, NULL); uget_node_free(dnode); if (delete_file == TRUE && files) { if (is_active == TRUE || delete_files(files, TRUE) == FALSE) { // delete files and free 'files' in thread ug_thread_create(&thread, (UgThreadFunc) delete_files_thread, files); ug_thread_unjoin(&thread); return FALSE; } } if (files) ug_data_free(files); return TRUE; } int uget_app_recycle_download (UgetApp* app, UgetNode* dnode) { UgetNode* cnode; UgetNode* sibling; UgetCategory* category; UgetRelation* relation; cnode = dnode->parent; uget_task_remove (&app->task, dnode); uget_node_remove (cnode, dnode); relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_RECYCLED) { uget_node_free (dnode); return FALSE; } else { relation->group &= ~UGET_GROUP_MAJOR; relation->group |= UGET_GROUP_RECYCLED; uget_node_clear_fake (dnode); category = ug_info_realloc (cnode->info, UgetCategoryInfo); // try to insert download before recycled sibling = category->recycled->children; if (sibling) sibling = sibling->base; uget_node_insert (cnode, sibling, dnode); return TRUE; } } int uget_app_activate_download (UgetApp* app, UgetNode* dnode) { UgetLog* log; UgetCommon* common; UgetRelation* relation; UgetNode* cnode; UgetNode* sibling; union { UgetCategory* category; UgetPluginInfo* pinfo; } temp; relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_ACTIVE) return FALSE; common = ug_info_get (dnode->info, UgetCommonInfo); if (common == NULL || common->uri == NULL) return FALSE; // match plug-in log = ug_info_realloc (dnode->info, UgetLogInfo); temp.pinfo = uget_app_match_plugin (app, common->uri, NULL); if (temp.pinfo == NULL) { // no plug-in support uget_app_queue_download (app, dnode); relation->group |= UGET_GROUP_ERROR; ug_list_prepend (&log->messages, (UgLink*) uget_event_new_error ( UGET_EVENT_ERROR_UNSUPPORTED_SCHEME, NULL)); uget_node_updated (dnode); return FALSE; } else { // clear event message before starting ug_list_foreach (&log->messages, (UgForeachFunc) uget_event_free, NULL); log->messages.size = 0; log->messages.head = NULL; log->messages.tail = NULL; } // start node with plug-in cnode = dnode->parent; if (uget_task_add (&app->task, dnode, temp.pinfo) == FALSE) { // plug-in start failed. uget_app_queue_download (app, dnode); relation->group |= UGET_GROUP_ERROR; uget_node_updated (dnode); return FALSE; } // change node state and move node position uget_node_remove (cnode, dnode); uget_node_clear_fake (dnode); relation->group = UGET_GROUP_ACTIVE; temp.category = ug_info_realloc (cnode->info, UgetCategoryInfo); // try to insert download before queuing, finished, and recycled sibling = temp.category->queuing->children; if (sibling == NULL) sibling = temp.category->finished->children; if (sibling == NULL) sibling = temp.category->recycled->children; // get real sibling if (sibling) sibling = sibling->real; uget_node_insert (cnode, sibling, dnode); return TRUE; } int uget_app_pause_download (UgetApp* app, UgetNode* dnode) { #if 0 UgetCategory* category; UgetRelation* relation; UgetNode* sibling; UgetNode* cnode; UgetNode* fake; relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_UNRUNNABLE) return FALSE; uget_task_remove (&app->task, dnode); relation->group |= UGET_GROUP_PAUSED; cnode = dnode->parent; category = ug_info_realloc (cnode->info, UgetCategoryInfo); for (fake = dnode->fake; fake; fake = fake->peer) { if (fake->parent == category->active) { uget_node_remove (cnode, dnode); uget_node_clear_fake (dnode); relation->group |= UGET_GROUP_QUEUING; // try to insert download before queuing, finished, and recycled sibling = category->queuing->children; if (sibling == NULL) sibling = category->finished->children; if (sibling == NULL) sibling = category->recycled->children; // get real sibling if (sibling) sibling = sibling->real; uget_node_insert (cnode, sibling, dnode); break; } } #else UgetRelation* relation; relation = ug_info_realloc(dnode->info, UgetRelationInfo); if (relation->group & UGET_GROUP_ACTIVE) { // uget_task_remove (&app->task, dnode); if (relation && relation->task) uget_plugin_stop (relation->task->plugin); relation->group &= ~UGET_GROUP_ACTIVE; } else if (relation->group & UGET_GROUP_UNRUNNABLE) return FALSE; relation->group |= UGET_GROUP_PAUSED; #endif return TRUE; } int uget_app_queue_download (UgetApp* app, UgetNode* dnode) { UgetNode* cnode; UgetNode* sibling; UgetCategory* category; UgetRelation* relation; relation = ug_info_realloc(dnode->info, UgetRelationInfo); if ((relation->group & UGET_GROUP_ACTIVE) == 0 && (relation->group & UGET_GROUP_UNRUNNABLE) == 0) return FALSE; if (relation->group & UGET_GROUP_QUEUING) relation->group = UGET_GROUP_QUEUING; else { cnode = dnode->parent; uget_node_remove (cnode, dnode); uget_node_clear_fake (dnode); // --- decide sibling position & insert before it --- // if current download is in active, insert it before queuing, // otherwise insert it before finished and recycled. category = ug_info_realloc (cnode->info, UgetCategoryInfo); sibling = NULL; if (relation->group & UGET_GROUP_ACTIVE) { uget_task_remove (&app->task, dnode); sibling = category->queuing->children; } if (sibling == NULL) sibling = category->finished->children; if (sibling == NULL) sibling = category->recycled->children; // get real sibling if (sibling) sibling = sibling->real; relation->group = UGET_GROUP_QUEUING; uget_node_insert (cnode, sibling, dnode); } return TRUE; } void uget_app_reset_download_name (UgetApp* app, UgetNode* dnode) { UgetCommon* common; UgetNode* sibling; UgetNode* cnode = NULL; common = ug_info_realloc(dnode->info, UgetCommonInfo); if (common->file) { if (common->name && strcmp(common->file, common->name) == 0) return; ug_free(common->name); common->name = ug_strdup(common->file); cnode = dnode->parent; } else if (common->uri) { if (common->name && strcmp(common->uri, common->name) == 0) return; common->name = uget_name_from_uri_str(common->uri); cnode = dnode->parent; } // reinsert && resort fake nodes if (cnode) { // cnode = dnode->parent; sibling = dnode->next; uget_node_remove(cnode, dnode); uget_node_clear_fake(dnode); uget_node_insert(cnode, sibling, dnode); } } #ifndef NO_URI_HASH void uget_app_use_uri_hash (UgetApp* app) { UgetNode* cnode; if (app->uri_hash == NULL) app->uri_hash = uget_uri_hash_new (); for (cnode = app->real.children; cnode; cnode = cnode->next) uget_uri_hash_add_category (app->uri_hash, cnode); } char* uget_app_save_attachment(UgetApp* app, UgInfo* info, const char* src_path, const char* rename) { char* dest_path; int count; UgetFile* file1; UgetFiles* files; if (rename == NULL) { rename = strrchr(src_path, UG_DIR_SEPARATOR); #if defined _WIN32 || defined _WIN64 if (rename == NULL) rename = strrchr(src_path, '/'); #endif if (rename == NULL) rename = src_path; else rename++; } dest_path = ug_strdup_printf( "%s" UG_DIR_SEPARATOR_S "attachment" UG_DIR_SEPARATOR_S "%s", app->config_dir, rename); for (count = 0; ug_file_is_exist(dest_path); count++) { ug_free(dest_path); dest_path = ug_strdup_printf( "%s" UG_DIR_SEPARATOR_S "attachment" UG_DIR_SEPARATOR_S "%d) %s", app->config_dir, count, rename); } if (ug_file_copy(src_path, dest_path) == -1) { ug_free(dest_path); return NULL; } // add new path to UgetFiles files = ug_info_realloc(info, UgetFilesInfo); file1 = uget_files_realloc(files, dest_path); file1->type = UGET_FILE_ATTACHMENT; return dest_path; } /* void uget_app_store_attachment(UgetApp* app, UgInfo* info) { int num; char* fname; char* fattch; UgUri* uuri; union { UgetHttp* http; UgetCommon* common; } tmp; tmp.common = ug_info_get(info, UgetCommonInfo); if (tmp.common && tmp.common->uri) { uuri = ug_malloc(sizeof(UgUri)); ug_uri_init(uuri, tmp.common->uri); if (ug_uri_is_file(uuri)) { fattch = uget_app_save_attachment(app, info, tmp.common->uri + uuri->path, NULL); if (fattch) { ug_free(tmp.common->uri); tmp.common->uri = fattch; } } ug_free(uuri); } srand((unsigned int) time(NULL)); num = rand(); tmp.http = ug_info_get(info, UgetHttpInfo); // backup cookie file if (tmp.http && tmp.http->cookie_file) { fname = ug_strdup_printf("%X.cookie", num); fattch = uget_app_save_attachment(app, info, tmp.http->cookie_file, fname); ug_free(fname); if (fattch) { ug_free(tmp.http->cookie_file); tmp.http->cookie_file = fattch; } } // backup post file if (tmp.http && tmp.http->post_file) { fname = ug_strdup_printf("%X.post", num); fattch = uget_app_save_attachment(app, info, tmp.http->post_file, fname); ug_free(fname); if (fattch) { ug_free(tmp.http->post_file); tmp.http->post_file = fattch; } } } */ void uget_app_clear_attachment (UgetApp* app) { UgetNode* dnode; UgetHttp* http; UgetFiles* files; UgetFile* file1; UgDir* dir; void* hash; const char* name; char* folder; char* path; hash = uget_uri_hash_new (); // add attachment for (dnode = app->mix.children->children; dnode; dnode = dnode->next) { // UgetFiles if ((files = ug_info_get(dnode->info, UgetFilesInfo)) != NULL ) { for (file1 = (UgetFile*)files->list.head; file1; file1 = file1->next) { if (file1->type == UGET_FILE_ATTACHMENT) uget_uri_hash_add(hash, file1->path); } } // UgetHttp if ((http = ug_info_get(dnode->info, UgetHttpInfo)) != NULL) { if (http->cookie_file) uget_uri_hash_add(hash, http->cookie_file); if (http->post_file) uget_uri_hash_add(hash, http->post_file); } } folder = ug_build_filename (app->config_dir, "attachment", NULL); #ifdef HAVE_GLIB path = g_filename_from_utf8 (folder, -1, NULL, NULL, NULL); dir = ug_dir_open (path); g_free (path); #else dir = ug_dir_open (folder); #endif // HAVE_GLIB if (dir == NULL) ug_create_dir_all (folder, -1); else { while ((name = ug_dir_read (dir)) != NULL) { path = ug_strdup_printf ("%s" UG_DIR_SEPARATOR_S "%s", folder, name); if (uget_uri_hash_find (hash, path) == FALSE) ug_unlink (path); ug_free (path); } ug_dir_close (dir); } ug_free (folder); uget_uri_hash_free (hash); } #endif // NO_URI_HASH // ---------------------------------------------------------------------------- // plug-in void uget_app_clear_plugins (UgetApp* app) { UgPair* pair; UgPair* pend; pair = app->plugins.at; pend = app->plugins.at + app->plugins.length; for (pair = app->plugins.at; pair < pend; pair++) { if (pair->data) { uget_plugin_global_set(pair->data, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); pair->data = NULL; } } ug_array_clear (&app->plugins); } void uget_app_add_plugin (UgetApp* app, const UgetPluginInfo* pinfo) { UgPair* pair; pair = ug_registry_find (&app->plugins, pinfo->name, NULL); if (pair == NULL || pair->data == NULL) uget_plugin_global_set(pinfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); if (pair == NULL) ug_registry_add (&app->plugins, (const UgTypeInfo*)pinfo); } void uget_app_remove_plugin (UgetApp* app, const UgetPluginInfo* pinfo) { UgPair* pair; pair = ug_registry_find (&app->plugins, pinfo->name, NULL); if (pair && pair->data) { uget_plugin_global_set(pair->data, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); pair->data = NULL; } } int uget_app_find_plugin (UgetApp* app, const char* name, const UgetPluginInfo** pinfo) { UgPair* pair; pair = ug_registry_find (&app->plugins, name, NULL); if (pair && pair->data) { if (pinfo) *pinfo = pair->data; return TRUE; } return FALSE; } void uget_app_set_default_plugin (UgetApp* app, const UgetPluginInfo* pinfo) { uget_app_add_plugin (app, pinfo); app->plugin_default = (UgetPluginInfo*) pinfo; } UgetPluginInfo* uget_app_match_plugin (UgetApp* app, const char* uri, const UgetPluginInfo* exclude) { UgetPluginInfo* info; int count; UgUri uuri; int index; struct { UgetPluginInfo* info; int count; } matched = {NULL, 0}; if (uri == NULL) return NULL; ug_uri_init (&uuri, uri); if (app->plugin_default && app->plugin_default != exclude) { matched.info = app->plugin_default; matched.count = uget_plugin_match (matched.info, &uuri); if (matched.count >= 3) return matched.info; } for (index = 0; index < app->plugins.length; index++) { info = app->plugins.at[index].data; if (info != exclude) { count = uget_plugin_match (info, &uuri); if (matched.count < count) { matched.count = count; matched.info = info; if (matched.count >= 3) break; } } } // detect file type by plug-in if (matched.count == 0) { if (matched.info->file_exts == NULL || matched.info->file_exts[0] == NULL) { return NULL; } } return matched.info; } // ---------------------------------------------------------------------------- // save/load categories // convert old format to new static void remove_file_node(UgetNode* cnode) { UgetNode* dnode; for (dnode = cnode->children; dnode; dnode = dnode->next) { while (dnode->children) uget_node_free(dnode->children); } } int uget_app_save_category (UgetApp* app, UgetNode* cnode, const char* filename, void* jsonfile) { int fd; // fd = open (filename, O_CREAT | O_WRONLY | O_TRUNC, // S_IREAD | S_IWRITE | S_IRGRP | S_IROTH); fd = ug_open (filename, UG_O_CREAT | UG_O_WRONLY | UG_O_TRUNC | UG_O_TEXT, UG_S_IREAD | UG_S_IWRITE | UG_S_IRGRP | UG_S_IROTH); if (fd == -1) return FALSE; return uget_app_save_category_fd (app, cnode, fd, jsonfile); } UgetNode* uget_app_load_category (UgetApp* app, const char* filename, void* jsonfile) { int fd; // fd = open (filename, O_RDONLY, 0); fd = ug_open (filename, UG_O_RDONLY | UG_O_TEXT, 0); if (fd == -1) return NULL; return uget_app_load_category_fd (app, fd, jsonfile); } int uget_app_save_category_fd (UgetApp* app, UgetNode* cnode, int fd, void* jsonfile) { UgJsonFile* jfile; if (jsonfile == NULL) jfile = ug_json_file_new (4096); else jfile = jsonfile; if (ug_json_file_begin_write_fd (jfile, fd, UG_JSON_FORMAT_ALL) == FALSE) { if (jsonfile == NULL) ug_json_file_free (jfile); return FALSE; } ug_json_write_object_head (&jfile->json); ug_json_write_entry (&jfile->json, cnode, UgetNodeEntry); ug_json_write_object_tail (&jfile->json); ug_json_file_end_write (jfile); if (jsonfile == NULL) ug_json_file_free (jfile); return TRUE; } UgetNode* uget_app_load_category_fd (UgetApp* app, int fd, void* jsonfile) { UgJsonFile* jfile; UgJsonError error; UgetNode* cnode; if (jsonfile == NULL) jfile = ug_json_file_new (4096); else jfile = jsonfile; if (ug_json_file_begin_parse_fd (jfile, fd) == FALSE) { if (jsonfile == NULL) ug_json_file_free (jfile); return FALSE; } cnode = uget_node_new (NULL); ug_json_push (&jfile->json, ug_json_parse_entry, cnode, (void*)UgetNodeEntry); ug_json_push (&jfile->json, ug_json_parse_object, NULL, NULL); error = ug_json_file_end_parse (jfile); if (jsonfile == NULL) ug_json_file_free (jfile); if (error == UG_JSON_ERROR_NONE) { uget_app_add_category (app, cnode, FALSE); // create fake node uget_node_make_fake (cnode); // move all downloads from active to queuing in this category uget_app_stop_category (app, cnode); // convert old format to new remove_file_node(cnode); return cnode; } else { uget_node_free (cnode); return NULL; } } int uget_app_save_categories (UgetApp* app, const char* folder) { int count; char* path; char* path_base; char* path_new; UgetNode* cnode; UgJsonFile* jfile; if (folder) path_base = ug_build_filename (folder, "category", NULL); else if (app->config_dir) path_base = ug_build_filename (app->config_dir, "category", NULL); else path_base = ug_strdup ("category"); ug_create_dir_all (path_base, -1); jfile = ug_json_file_new (4096); cnode = app->real.children; for (count = 0; cnode; cnode = cnode->next, count++) { #if defined _WIN32 || defined _WIN64 path = ug_strdup_printf ("%s%c%.4d.temp", path_base, '\\', count); #else path = ug_strdup_printf ("%s%c%.4d.temp", path_base, '/', count); #endif // _WIN32 || _WIN64 uget_app_save_category (app, cnode, path, jfile); #if defined _WIN32 || defined _WIN64 path_new = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', count); #else path_new = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', count); #endif // _WIN32 || _WIN64 ug_unlink (path_new); ug_rename (path, path_new); ug_free (path_new); ug_free (path); } ug_free (path_base); ug_json_file_free (jfile); return count; } int uget_app_load_categories (UgetApp* app, const char* folder) { int count, fd; char* path; char* path_base; char* path_temp; UgJsonFile* jfile; if (folder) path_base = ug_build_filename (folder, "category", NULL); else if (app->config_dir) path_base = ug_build_filename (app->config_dir, "category", NULL); else path_base = ug_strdup ("category"); jfile = ug_json_file_new (4096); for (count = 0; ; count++) { #if defined _WIN32 || defined _WIN64 path = ug_strdup_printf ("%s%c%.4d.json", path_base, '\\', count); path_temp = ug_strdup_printf ("%s%c%.4d.temp", path_base, '\\', count); #else path = ug_strdup_printf ("%s%c%.4d.json", path_base, '/', count); path_temp = ug_strdup_printf ("%s%c%.4d.temp", path_base, '/', count); #endif // _WIN32 || _WIN64 // fd = open (filename, O_RDONLY, 0); fd = ug_open (path, UG_O_RDONLY | UG_O_TEXT, 0); if (fd != -1) ug_unlink (path_temp); else if (ug_rename (path_temp, path) != -1) fd = ug_open (path, UG_O_RDONLY | UG_O_TEXT, 0); ug_free (path_temp); ug_free (path); if (fd == -1) break; uget_app_load_category_fd (app, fd, jfile); } ug_json_file_free (jfile); ug_free (path_base); return count; } // ---------------------------------------------------------------------------- // keeping status void uget_node_set_keeping (UgetNode* node, int enable) { union { UgetCommon* common; UgetProxy* proxy; UgetHttp* http; UgetFtp* ftp; } temp; temp.common = ug_info_realloc (node->info, UgetCommonInfo); if (temp.common) { temp.common->keeping.enable = enable; if (enable) { if (temp.common->uri) temp.common->keeping.uri = TRUE; if (temp.common->mirrors) temp.common->keeping.mirrors = TRUE; if (temp.common->file) temp.common->keeping.file = TRUE; if (temp.common->folder) temp.common->keeping.folder = TRUE; if (temp.common->user) temp.common->keeping.user = TRUE; if (temp.common->password) temp.common->keeping.password = TRUE; // if (temp.common->connect_timeout) // temp.common->keeping.connect_timeout = TRUE; // if (temp.common->transmit_timeout) // temp.common->keeping.transmit_timeout = TRUE; // if (temp.common->retry_delay) // temp.common->keeping.retry_delay = TRUE; // if (temp.common->retry_limit) // temp.common->keeping.retry_limit = TRUE; // if (temp.common->max_connections) // temp.common->keeping.max_connections = TRUE; if (temp.common->max_upload_speed) temp.common->keeping.max_upload_speed = TRUE; if (temp.common->max_download_speed) temp.common->keeping.max_download_speed = TRUE; if (temp.common->timestamp) temp.common->keeping.timestamp = TRUE; if (temp.common->debug_level) temp.common->keeping.debug_level = TRUE; } } temp.proxy = ug_info_get (node->info, UgetProxyInfo); if (temp.proxy) { temp.proxy->keeping.enable = enable; if (enable) { if (temp.proxy->host) temp.proxy->keeping.host = TRUE; if (temp.proxy->port) temp.proxy->keeping.port = TRUE; if (temp.proxy->type) temp.proxy->keeping.type = TRUE; if (temp.proxy->user) temp.proxy->keeping.user = TRUE; if (temp.proxy->password) temp.proxy->keeping.password = TRUE; } } temp.http = ug_info_get (node->info, UgetHttpInfo); if (temp.http) { temp.http->keeping.enable = enable; if (enable) { if (temp.http->user) temp.http->keeping.user = TRUE; if (temp.http->password) temp.http->keeping.password = TRUE; if (temp.http->referrer) temp.http->keeping.referrer = TRUE; if (temp.http->user_agent) temp.http->keeping.user_agent = TRUE; if (temp.http->post_data) temp.http->keeping.post_data = TRUE; if (temp.http->post_file) temp.http->keeping.post_file = TRUE; if (temp.http->cookie_data) temp.http->keeping.cookie_data = TRUE; if (temp.http->cookie_file) temp.http->keeping.cookie_file = TRUE; // if (temp.http->redirection_limit) // temp.http->keeping.redirection_limit = TRUE; } } temp.ftp = ug_info_get (node->info, UgetFtpInfo); if (temp.ftp) { temp.ftp->keeping.enable = enable; if (enable) { if (temp.ftp->user) temp.ftp->keeping.user = TRUE; if (temp.ftp->password) temp.ftp->keeping.password = TRUE; if (temp.ftp->active_mode) temp.ftp->keeping.active_mode = TRUE; } } } uget-2.2.2/uget/UgetOption.h0000664000175000017500000000525113470304402012616 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_OPTION_H #define UGET_OPTION_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetOptionValue UgetOptionValue; extern UgOptionEntry uget_option_entry[]; struct UgetOptionValue { int version; int quiet; int category_index; // default = -1 char* input_file; struct { int offline; // default = -1 } ctrl; struct { char* folder; char* file; char* user; char* password; } common; struct { int type; char* host; int port; char* user; char* password; } proxy; struct { char* user; char* password; char* referrer; char* user_agent; char* cookie_data; char* cookie_file; char* post_data; char* post_file; } http; struct { char* user; char* password; } ftp; }; void uget_option_value_init (UgetOptionValue* value); void uget_option_value_clear (UgetOptionValue* value); int uget_option_value_has_ctrl (UgetOptionValue* value); int uget_option_value_to_info (UgetOptionValue* ivalue, UgInfo* info); #ifdef __cplusplus } #endif #endif // UGET_OPTION_H uget-2.2.2/uget/UgetPluginCurl.h0000664000175000017500000001153113470304402013430 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_CURL_H #define UGET_PLUGIN_CURL_H #include #include #include #include #include //#include // curl_slist #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginCurl UgetPluginCurl; extern const UgetPluginInfo* UgetPluginCurlInfo; /* ---------------------------------------------------------------------------- UgetPluginCurl: libcurl plug-in that derived from UgetPlugin. UgType | `---UgetPlugin | `--- UgetPluginCurl */ struct UgetPluginCurl { UGET_PLUGIN_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; */ // copy these UgData from UgInfo that store in UgetApp UgetCommon* common; UgetFiles* files; UgetProxy* proxy; UgetHttp* http; UgetFtp* ftp; // run-time data // struct curl_slist* ftp_command; struct { char* path; // folder int length; } folder; struct { char* name_fmt; // printf() format string char* path; // folder + filename time_t time; // date and time int64_t size; // total size (0 if size unknown) } file; // aria2 control file struct { char* path; // folder + filename + ".aria2" UgetA2cf ctrl; } aria2; // URI and it's mirror struct { UgList list; UgLink* link; } uri; // segment (split download) struct { UgList list; // list of segment (UgetCurl) int64_t beg; // beginning of undownloaded position int n_max; int n_active; } segment; // progress for uget_plugin_sync() time_t start_time; // base.download = base downloaded size (existing downloaded size) // base.upload = base uploaded size (existing uploaded size) // size.download = downloaded size (base + threads downloaded size) // size.upload = uploaded size (base + threads uploaded size) // speed.download = downloading speed // speed.upload = uploading speed // limit.download = download speed limit // limit.upload = upload speed limit struct { int64_t upload; int64_t download; } base, size, speed, limit; // flags uint8_t limit_changed:1; // speed limit changed by user or program uint8_t file_renamed:1; // has file path? uint8_t synced:1; uint8_t paused:1; // paused by user or program uint8_t stopped:1; // all of downloading thread are stopped uint8_t prepared:1; // prepare to download }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const PluginInfo* const PluginCurlInfo = (const PluginInfo*) UgetPluginCurlInfo; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginCurlMethod : PluginMethod {}; // This one is for directly use only. You can NOT derived it. struct PluginCurl : PluginCurlMethod, UgetPluginCurl { inline void* operator new(size_t size) { return uget_plugin_new(PluginCurlInfo); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_CURL_H uget-2.2.2/uget/UgetSequence.h0000664000175000017500000000617113470304403013121 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_SEQUENCE_H #define UGET_SEQUENCE_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetSequence UgetSequence; typedef struct UgetSeqRange UgetSeqRange; struct UgetSeqRange { // [first, last] // e.g. 0-9, A-Z, a-z, or Unicode uint32_t first; uint32_t last; uint32_t cur; // if digits == 0, use ASCII or Unicode to generate string. int digits; }; struct UgetSequence { UG_ARRAY_MEMBERS (UgetSeqRange); /* // ------ UgArray members ------ UgetSeqRange* at; int length; int allocated; int element_size; */ UgetSeqRange* range_last; // used by uget_sequence_get_list() UgBuffer buf; }; void uget_sequence_init (UgetSequence* useq); void uget_sequence_final (UgetSequence* useq); void uget_sequence_add (UgetSequence* useq, uint32_t first, uint32_t last, int digits); void uget_sequence_clear (UgetSequence* useq); int uget_sequence_count (UgetSequence* useq, const char* pattern); // call uget_sequence_clear_result() to clear result list int uget_sequence_get_list (UgetSequence* useq, const char* pattern, UgList* result); int uget_sequence_get_preview (UgetSequence* useq, const char* pattern, UgList* result); void uget_sequence_clear_result (UgList* result); /* param: pattern is a string that contain wildcard character *. e.g. Number-*.jpg Number-0.jpg, Number-1.jpg ...etc Number-a.jpg, Number-b.jpg ...etc Number-A.jpg, Number-B.jpg ...etc */ #ifdef __cplusplus } #endif #endif // UGET_SEQUENCE_H uget-2.2.2/uget/UgetRss.h0000664000175000017500000001051113470304403012111 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_RSS_H #define UGET_RSS_H //#include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetRss UgetRss; typedef struct UgetRssFeed UgetRssFeed; typedef struct UgetRssItem UgetRssItem; typedef enum { UGET_RSS_USER = 0, UGET_RSS_STABLE = 1, // http://feeds.feedburner.com/uget/stable?format=xml UGET_RSS_DEVELMENT = 2, // http://feeds.feedburner.com/uget/development?format=xml UGET_RSS_NEWS = 3, // http://feeds.feedburner.com/uget/news?format=xml UGET_RSS_TUTORIALS = 4, // http://feeds.feedburner.com/uget/tutorials?format=xml UGET_RSS_ALL = 5, // http://feeds.feedburner.com/uget/all?format=xml } UgetRssType; // ---------------------------------------------------------------------------- struct UgetRssItem { UG_LINK_MEMBERS (UgetRssItem, UgetRssItem, self); /* // ------ UgLink members ------ UgetRssItem* self; UgetRssItem* next; UgetRssItem* prev; */ char* title; char* link; time_t updated; // pubDate }; UgetRssItem* uget_rss_item_new (void); void uget_rss_item_free (UgetRssItem* item); // ---------------------------------------------------------------------------- extern const UgEntry UgetRssFeedEntry[]; struct UgetRssFeed { UG_LINK_MEMBERS (UgetRssFeed, UgetRssFeed, self); /* // ------ UgLink members ------ UgetRssFeed* self; UgetRssFeed* next; UgetRssFeed* prev; */ char* title; char* link; time_t updated; // pubDate UgList items; // user data char* url; int type; time_t checked; // don't care item before checked }; UgetRssFeed* uget_rss_feed_new (void); void uget_rss_feed_free (UgetRssFeed* feed); UgetRssItem* uget_rss_feed_find (UgetRssFeed* feed, time_t after_time); void uget_rss_feed_clear (UgetRssFeed* feed, int reserve_user_data); // ---------------------------------------------------------------------------- extern const UgEntry UgetRssEntry[]; struct UgetRss { UgThread thread; UgHtml uhtml; UgList feeds; UgetRssFeed* checked; uint8_t updating; int n_updated; int ref_count; }; UgetRss* uget_rss_new (void); void uget_rss_ref (UgetRss* urss); void uget_rss_unref (UgetRss* urss); void uget_rss_add (UgetRss* urss, UgetRssFeed* feed); void uget_rss_add_url (UgetRss* urss, const char* url); void uget_rss_add_builtin (UgetRss* urss, UgetRssType type); void uget_rss_update (UgetRss* urss, int joinable); UgetRssFeed* uget_rss_find_updated (UgetRss* urss, UgetRssFeed* after_feed); int uget_rss_save_feeds (UgetRss* urss, const char* path); int uget_rss_load_feeds (UgetRss* urss, const char* path); #ifdef __cplusplus } #endif #endif // End of UGET_RSS_H uget-2.2.2/uget/UgetOption.c0000664000175000017500000002473613470304402012622 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif //#include #include #include // ---------------------------------------------------------------------------- void uget_option_value_init (UgetOptionValue* value) { memset (value, 0, sizeof (UgetOptionValue)); value->category_index = -1; value->ctrl.offline = -1; } void uget_option_value_clear (UgetOptionValue* value) { ug_free (value->input_file); ug_free (value->common.folder); ug_free (value->common.file); ug_free (value->common.user); ug_free (value->common.password); ug_free (value->proxy.host); ug_free (value->proxy.user); ug_free (value->proxy.password); ug_free (value->http.user); ug_free (value->http.password); ug_free (value->http.referrer); ug_free (value->http.user_agent); ug_free (value->http.cookie_data); ug_free (value->http.cookie_file); ug_free (value->http.post_data); ug_free (value->http.post_file); ug_free (value->ftp.user); ug_free (value->ftp.password); uget_option_value_init (value); } static int mem_is_zero (char* beg, int len) { char* end; for (end = beg + len; beg < end; beg++) { if (beg[0]) return FALSE; } return TRUE; } int uget_option_value_has_ctrl (UgetOptionValue* value) { if (mem_is_zero ((char*) &value->ctrl, sizeof (value->ctrl)) == FALSE) return TRUE; else return FALSE; } int uget_option_value_to_info (UgetOptionValue* ivalue, UgInfo* info) { union { UgetCommon* common; UgetProxy* proxy; UgetHttp* http; UgetFtp* ftp; } temp; if (mem_is_zero((char*) &ivalue->common, sizeof(ivalue->common)) == FALSE) { temp.common = ug_info_realloc(info, UgetCommonInfo); temp.common->keeping.enable = TRUE; if (ivalue->common.folder) { ug_free(temp.common->folder); temp.common->folder = ivalue->common.folder; temp.common->keeping.folder = TRUE; ivalue->common.folder = NULL; } if (ivalue->common.file) { ug_free(temp.common->file); temp.common->file = ivalue->common.file; temp.common->keeping.file = TRUE; ivalue->common.file = NULL; } if (ivalue->common.user) { ug_free(temp.common->user); temp.common->user = ivalue->common.user; temp.common->keeping.user = TRUE; ivalue->common.user = NULL; } if (ivalue->common.password) { ug_free(temp.common->password); temp.common->password = ivalue->common.password; temp.common->keeping.password = TRUE; ivalue->common.password = NULL; } } if (mem_is_zero((char*) &ivalue->proxy, sizeof(ivalue->proxy)) == FALSE) { temp.proxy = ug_info_realloc(info, UgetProxyInfo); temp.proxy->keeping.enable = TRUE; if (ivalue->proxy.type) { temp.proxy->type = ivalue->proxy.type; temp.proxy->keeping.type = TRUE; ivalue->proxy.type = 0; } if (ivalue->proxy.host) { ug_free(temp.proxy->host); temp.proxy->host = ivalue->proxy.host; temp.proxy->keeping.host = TRUE; ivalue->proxy.host = NULL; } if (ivalue->proxy.port) { temp.proxy->port = ivalue->proxy.port; temp.proxy->keeping.port = TRUE; ivalue->proxy.port = 0; } if (ivalue->proxy.user) { ug_free(temp.proxy->user); temp.proxy->user = ivalue->proxy.user; temp.proxy->keeping.user = TRUE; ivalue->proxy.user = NULL; } if (ivalue->proxy.password) { ug_free(temp.proxy->password); temp.proxy->password = ivalue->proxy.password; temp.proxy->keeping.password = TRUE; ivalue->proxy.password = NULL; } } if (mem_is_zero((char*) &ivalue->http, sizeof(ivalue->http)) == FALSE) { temp.http = ug_info_realloc(info, UgetHttpInfo); temp.http->keeping.enable = TRUE; if (ivalue->http.user) { ug_free(temp.http->user); temp.http->user = ivalue->http.user; temp.http->keeping.user = TRUE; ivalue->http.user = NULL; } if (ivalue->http.password) { ug_free(temp.http->password); temp.http->password = ivalue->http.password; temp.http->keeping.password = TRUE; ivalue->http.password = NULL; } if (ivalue->http.referrer) { ug_free(temp.http->referrer); temp.http->referrer = ivalue->http.referrer; temp.http->keeping.referrer = TRUE; ivalue->http.referrer = NULL; } if (ivalue->http.user_agent) { ug_free(temp.http->user_agent); temp.http->user_agent = ivalue->http.user_agent; temp.http->keeping.user_agent = TRUE; ivalue->http.user_agent = NULL; } if (ivalue->http.cookie_data) { ug_free(temp.http->cookie_data); temp.http->cookie_data = ivalue->http.cookie_data; temp.http->keeping.cookie_data = TRUE; ivalue->http.cookie_data = NULL; } if (ivalue->http.cookie_file) { ug_free(temp.http->cookie_file); temp.http->cookie_file = ivalue->http.cookie_file; temp.http->keeping.cookie_file = TRUE; ivalue->http.cookie_file = NULL; } if (ivalue->http.post_data) { ug_free(temp.http->post_data); temp.http->post_data = ivalue->http.post_data; temp.http->keeping.post_data = TRUE; ivalue->http.post_data = NULL; } if (ivalue->http.post_file) { ug_free(temp.http->post_file); temp.http->post_file = ivalue->http.post_file; temp.http->keeping.post_file = TRUE; ivalue->http.post_file = NULL; } } if (mem_is_zero((char*) &ivalue->ftp, sizeof(ivalue->ftp)) == FALSE) { temp.ftp = ug_info_realloc(info, UgetFtpInfo); temp.ftp->keeping.enable = TRUE; if (ivalue->ftp.user) { ug_free(temp.ftp->user); temp.ftp->user = ivalue->ftp.user; temp.ftp->keeping.user = TRUE; ivalue->ftp.user = NULL; } if (ivalue->ftp.password) { ug_free(temp.ftp->password); temp.ftp->password = ivalue->ftp.password; temp.ftp->keeping.password = TRUE; ivalue->ftp.password = NULL; } } return TRUE; } UgOptionEntry uget_option_entry[] = { {"help", "?", offsetof (UgetOptionValue, version), UG_ENTRY_BOOL, "Show help options", NULL, NULL}, {"version", "V", offsetof (UgetOptionValue, version), UG_ENTRY_BOOL, "display the version of uGet and exit.", NULL, NULL}, {"quiet", NULL, offsetof (UgetOptionValue, quiet), UG_ENTRY_BOOL, "add download directly. Don't show dialog.", NULL, NULL}, {"category-index", NULL, offsetof (UgetOptionValue, category_index), UG_ENTRY_INT, "add download to Nth category.", "N", NULL}, {"input-file", "i", offsetof (UgetOptionValue, input_file), UG_ENTRY_STRING, "add URLs found in FILE.", "FILE", NULL}, {"set-offline", NULL, offsetof (UgetOptionValue, ctrl.offline), UG_ENTRY_INT, "set offline mode to N. (0=Disable)", "N", NULL}, {"folder", NULL, offsetof (UgetOptionValue, common.folder), UG_ENTRY_STRING, "placed download file in FOLDER.", "FOLDER", NULL}, {"filename", NULL, offsetof (UgetOptionValue, common.file), UG_ENTRY_STRING, "set download filename to FILE.", "FILE", NULL}, {"user", NULL, offsetof (UgetOptionValue, common.user), UG_ENTRY_STRING, "set both ftp and http user to USER.", "USER", NULL}, {"password", NULL, offsetof (UgetOptionValue, common.password), UG_ENTRY_STRING, "set both ftp and http password to PASS.", "PASS", NULL}, {"proxy-type", NULL, offsetof (UgetOptionValue, proxy.type), UG_ENTRY_INT, "set proxy type to N. (0=Don't use)", "N", NULL}, {"proxy-host", NULL, offsetof (UgetOptionValue, proxy.host), UG_ENTRY_STRING, "set proxy host to HOST.", "HOST", NULL}, {"proxy-port", NULL, offsetof (UgetOptionValue, proxy.port), UG_ENTRY_INT, "set proxy port to PORT.", "PORT", NULL}, {"proxy-user", NULL, offsetof (UgetOptionValue, proxy.user), UG_ENTRY_STRING, "set USER as proxy username.", "USER", NULL}, {"proxy-password", NULL, offsetof (UgetOptionValue, proxy.password), UG_ENTRY_STRING, "set PASS as proxy password.", "PASS", NULL}, {"http-user", NULL, offsetof (UgetOptionValue, http.user), UG_ENTRY_STRING, "set http user to USER.", "USER", NULL}, {"http-password", NULL, offsetof (UgetOptionValue, http.password), UG_ENTRY_STRING, "set http password to PASS.", "PASS", NULL}, {"http-referer", NULL, offsetof (UgetOptionValue, http.referrer), UG_ENTRY_STRING, "include `Referer: URL' header in HTTP request.", "URL", NULL}, {"http-user-agent", NULL,offsetof (UgetOptionValue, http.user_agent), UG_ENTRY_STRING, "identify as AGENT instead of default.", "AGENT", NULL}, {"http-cookie-data",NULL,offsetof (UgetOptionValue, http.cookie_data), UG_ENTRY_STRING, "load cookies from STRING.", "STRING", NULL}, {"http-cookie-file",NULL, offsetof (UgetOptionValue, http.cookie_file), UG_ENTRY_STRING, "load cookies from FILE.", "FILE", NULL}, {"http-post-data", NULL, offsetof (UgetOptionValue, http.post_data), UG_ENTRY_STRING, "use the POST method; send STRING as the data.", "STRING", NULL}, {"http-post-file", NULL, offsetof (UgetOptionValue, http.post_file), UG_ENTRY_STRING, "use the POST method; send contents of FILE", "FILE", NULL}, {"ftp-user", NULL, offsetof (UgetOptionValue, ftp.user), UG_ENTRY_STRING, "set ftp user to USER.", "USER", NULL}, {"ftp-password", NULL, offsetof (UgetOptionValue, ftp.password), UG_ENTRY_STRING, "set ftp password to PASS.", "PASS", NULL}, {NULL} }; uget-2.2.2/uget/UgetPluginAria2.c0000664000175000017500000012301413470304402013454 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBPWMD #include "pwmd.h" static gboolean uget_plugin_aria2_set_proxy_pwmd (UgetPluginAria2 *plugin, UgInfo* info, UgValue* options); #endif #if defined _WIN32 || defined _WIN64 #include // Sleep() #define ug_sleep Sleep #else #include // sleep(), usleep() #define ug_sleep(millisecond) usleep (millisecond * 1000) #endif // _WIN32 || _WIN64 #ifdef HAVE_GLIB #include #undef printf #else #define N_(x) x #define _(x) x #endif static UgJsonrpcObject* alloc_speed_request(UgetPluginAria2* plugin); static void recycle_speed_request(UgJsonrpcObject* object); static UgJsonrpcObject* alloc_status_request(UgValue** gid); static void recycle_status_request(UgJsonrpcObject* object); static void* ug_file_to_base64(const char* file, int* length); static int decide_file_type(UgetPluginAria2* plugin); static void add_uri_mirrors(UgValue* varray, const char* mirrors); enum UgetPluginAria2UriType { URI_UNSUPPORTED, URI_NET, URI_MAGNET, // magnet: URI_TORRENT, URI_METALINK, }; typedef enum Aria2Status { ARIA2_STATUS_ACTIVE, ARIA2_STATUS_WAITING, // used by Aria2Uri.status and Aria2Telled.status ARIA2_STATUS_PAUSED, ARIA2_STATUS_ERROR, ARIA2_STATUS_COMPLETE, ARIA2_STATUS_REMOVED, ARIA2_STATUS_USED, // used by Aria2Uri.status ARIA2_N_STATUS, } Aria2Status; // ---------------------------------------------------------------------------- // UgetPluginInfo (derived from UgTypeInfo) static void plugin_init (UgetPluginAria2* plugin); static void plugin_final(UgetPluginAria2* plugin); static int plugin_ctrl (UgetPluginAria2* plugin, int code, void* data); static int plugin_accept(UgetPluginAria2* plugin, UgInfo* node_info); static int plugin_sync (UgetPluginAria2* plugin, UgInfo* node_info); static UgetResult global_set(int code, void* parameter); static UgetResult global_get(int code, void* parameter); static const char* schemes[] = {"http", "https", "ftp", "magnet", NULL}; static const char* types[] = {"torrent", "metalink", "meta4", NULL}; static const UgetPluginInfo UgetPluginAria2InfoStatic = { "aria2", sizeof(UgetPluginAria2), (UgInitFunc) plugin_init, (UgFinalFunc) plugin_final, (UgetPluginSyncFunc) plugin_accept, (UgetPluginSyncFunc) plugin_sync, (UgetPluginCtrlFunc) plugin_ctrl, NULL, schemes, types, (UgetPluginGlobalFunc) global_set, (UgetPluginGlobalFunc) global_get }; // extern const UgetPluginInfo* UgetPluginAria2Info = &UgetPluginAria2InfoStatic; // ---------------------------------------------------------------------------- // global data and it's functions. static struct { UgetAria2* data; int ref_count; } global = {NULL, 0}; static UgetResult global_init(void) { if (global.data == NULL) { global.data = uget_aria2_new(); uget_aria2_start_thread(global.data); } global.ref_count++; return UGET_RESULT_OK; } static void global_ref(void) { global.ref_count++; } static void global_unref(void) { if (global.data == NULL) return; global.ref_count--; if (global.ref_count == 0) { if (global.data->shutdown) uget_aria2_shutdown(global.data); uget_aria2_stop_thread(global.data); uget_aria2_unref(global.data); global.data = NULL; } } static UgetResult global_set(int option, void* parameter) { UgetPluginAria2Setting* setting; switch (option) { case UGET_PLUGIN_GLOBAL_INIT: // do global initialize/uninitialize here if (parameter) return global_init(); else global_unref(); break; case UGET_PLUGIN_GLOBAL_SPEED_LIMIT: if (global.data) { uget_aria2_set_speed(global.data, ((int*)parameter)[0], ((int*)parameter)[1]); } break; case UGET_PLUGIN_ARIA2_GLOBAL_URI: if (parameter) uget_aria2_set_uri(global.data, (char*) parameter); break; case UGET_PLUGIN_ARIA2_GLOBAL_PATH: uget_aria2_set_path(global.data, (char*) parameter); break; case UGET_PLUGIN_ARIA2_GLOBAL_ARGUMENT: uget_aria2_set_args(global.data, (char*) parameter); break; case UGET_PLUGIN_ARIA2_GLOBAL_TOKEN: uget_aria2_set_token(global.data, (char*) parameter); break; case UGET_PLUGIN_ARIA2_GLOBAL_LAUNCH: if (parameter != NULL) if (uget_aria2_launch(global.data) == FALSE) return UGET_RESULT_ERROR; break; case UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN: if (parameter) global.data->shutdown = TRUE; else global.data->shutdown = FALSE; break; case UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN_NOW: if (parameter && global.data) uget_aria2_shutdown(global.data); break; case UGET_PLUGIN_GLOBAL_SETTING: setting = parameter; global.data->polling_interval = setting->polling_interval; global.data->shutdown = setting->shutdown; uget_aria2_set_uri (global.data, setting->uri); uget_aria2_set_path(global.data, setting->path); uget_aria2_set_args(global.data, setting->arguments); if (setting->launch) uget_aria2_launch(global.data); break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } static UgetResult global_get(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: if (parameter) *(int*)parameter = global.data ? TRUE : FALSE; break; case UGET_PLUGIN_GLOBAL_ERROR_CODE: if (parameter) *(int*)parameter = global.data->error; break; case UGET_PLUGIN_ARIA2_GLOBAL_LAUNCH: if (parameter) *(int*)parameter = global.data->launched; break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } // ---------------------------------------------------------------------------- // control functions static const char* error_string[] = { NULL, // 1 - 10 N_("aria2: an unknown error occurred."), N_("aria2: time out occurred."), N_("aria2: resource was not found."), N_("aria2 saw the specified number of 'resource not found' error. See --max-file-not-found option"), N_("aria2: speed was too slow."), N_("aria2: network problem occurred."), N_("aria2: unfinished downloads."), N_("Not Resumable"), // _("Not Resumable"), N_("Out of resource"), // _(), N_("aria2: piece length was different from one in .aria2 control file."), // 11 - 20 N_("aria2 was downloading same file."), N_("aria2 was downloading same info hash torrent."), N_("aria2: file already existed. See --allow-overwrite option."), N_("Output file can't be renamed."), // _("Output file can't be renamed."), N_("aria2: could not open existing file."), N_("aria2: could not create new file or truncate existing file."), N_("aria2: file I/O error occurred."), N_("Folder can't be created."), // UGET_EVENT_ERROR_FOLDER_CREATE_FAILED N_("aria2: name resolution failed."), N_("aria2: could not parse Metalink document."), // 21 - 30 N_("aria2: FTP command failed."), N_("aria2: HTTP response header was bad or unexpected."), N_("Too many redirections."), N_("aria2: HTTP authorization failed."), N_("aria2: could not parse bencoded file(usually .torrent file)."), N_("aria2: torrent file was corrupted or missing information."), N_("aria2: Magnet URI was bad."), N_("aria2: bad/unrecognized option was given or unexpected option argument was given."), N_("aria2: remote server was unable to handle the request."), N_("aria2: could not parse JSON-RPC request."), }; static const char* aria2_no_response = N_("No response. Is aria2 shutdown?"); static void plugin_init(UgetPluginAria2* plugin) { if (global.data == NULL) global_init(); else global_ref(); ug_array_init(&plugin->gids, sizeof(char*), 16); plugin->stopped = TRUE; plugin->paused = TRUE; plugin->synced = TRUE; } static void plugin_final(UgetPluginAria2* plugin) { ug_array_foreach_str(&plugin->gids, (UgForeachFunc) ug_free, NULL); ug_array_clear(&plugin->gids); // clear UgetFiles if (plugin->files) ug_data_free(plugin->files); // clear and recycle start_request object if (plugin->start_request) { ug_value_foreach(&plugin->start_request->params, ug_value_set_name, NULL); uget_aria2_recycle(global.data, plugin->start_request); } global_unref(); } // ---------------------------------------------------------------------------- // plugin_ctrl static int plugin_ctrl_speed(UgetPluginAria2* plugin, int* speed); static int plugin_start(UgetPluginAria2* plugin); static int plugin_ctrl(UgetPluginAria2* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: if (plugin->start_request) return plugin_start(plugin); break; case UGET_PLUGIN_CTRL_STOP: plugin->paused = TRUE; return TRUE; case UGET_PLUGIN_CTRL_SPEED: // speed control return plugin_ctrl_speed(plugin, data); // state ---------------- case UGET_PLUGIN_GET_STATE: *(int*)data = (plugin->stopped) ? FALSE : TRUE; return TRUE; default: break; } return FALSE; } static int plugin_ctrl_speed(UgetPluginAria2* plugin, int* speed) { int value; // notify plug-in that speed limit has been changed if (plugin->limit[0] != speed[0] || plugin->limit[1] != speed[1]) plugin->limit_changed = TRUE; // decide speed limit by user specified data. value = speed[0]; if (plugin->limit_upper[0] > 0) { if (value > plugin->limit_upper[0] || value == 0) { value = plugin->limit_upper[0]; plugin->limit_changed = TRUE; } } plugin->limit[0] = value; value = speed[1]; if (plugin->limit_upper[1] > 0) { if (value > plugin->limit_upper[1] || value == 0) { value = plugin->limit_upper[1]; plugin->limit_changed = TRUE; } } plugin->limit[1] = value; return plugin->limit_changed; } // ---------------------------------------------------------------------------- // plugin_sync // return FALSE if plug-in was stopped. static int plugin_sync(UgetPluginAria2* plugin, UgInfo* node_info) { int index; UgetEvent* event; UgetFiles* files; UgetFile* file1; struct { UgetCommon* common; UgetProgress* progress; } temp; if (plugin->stopped) { if (plugin->synced) return FALSE; plugin->synced = TRUE; } else if (plugin->synced == TRUE) // maybe thread is accessing plugin->gids return TRUE; // avoid crash if plug-in failed to start. if (plugin->start_request == NULL) return FALSE; // sync data between plug-in and foreign UgData // ------------------------------------------------ // update progress temp.progress = ug_info_realloc(node_info, UgetProgressInfo); temp.progress->complete = plugin->completedLength; temp.progress->total = plugin->totalLength; temp.progress->download_speed = plugin->downloadSpeed; temp.progress->upload_speed = plugin->uploadSpeed; temp.progress->uploaded = plugin->uploadLength; temp.progress->elapsed = time(NULL) - plugin->start_time; // ratio if (temp.progress->uploaded && temp.progress->complete) temp.progress->ratio = (double)temp.progress->uploaded / (double)temp.progress->complete; else temp.progress->ratio = 0.0; // If total size is unknown, don't calculate percent. if (temp.progress->total) temp.progress->percent = (int) (temp.progress->complete * 100 / temp.progress->total); else temp.progress->percent = 0; // If total size and average speed is unknown, don't calculate remain time. if (temp.progress->download_speed > 0 && temp.progress->total > 0) temp.progress->left = (temp.progress->total - temp.progress->complete) / temp.progress->download_speed; temp.common = ug_info_realloc(node_info, UgetCommonInfo); // ------------------------------------------------ // sync changed limit from foreign UgInfo if (plugin->limit_upper[1] != temp.common->max_upload_speed || plugin->limit_upper[0] != temp.common->max_download_speed) { // speed control plugin->limit_upper[1] = temp.common->max_upload_speed; plugin->limit_upper[0] = temp.common->max_download_speed; plugin_ctrl_speed(plugin, plugin->limit_upper); } // update UgetFiles files = ug_info_realloc(node_info, UgetFilesInfo); uget_plugin_lock(plugin); uget_files_sync(files, plugin->files); uget_plugin_unlock(plugin); // change name. if (files->list.size > 0 && plugin->named == FALSE && plugin->files_per_gid > 0) { plugin->named = TRUE; if (plugin->uri_type == URI_NET && temp.common->file == NULL) { uget_plugin_lock(plugin); file1 = (UgetFile*) plugin->files->list.head; ug_uri_init(&plugin->uri_part, file1->path); uget_plugin_unlock(plugin); index = plugin->uri_part.file; if (index != -1) { ug_free(temp.common->name); temp.common->name = ug_uri_get_file(&plugin->uri_part); event = uget_event_new(UGET_EVENT_NAME); uget_plugin_post((UgetPlugin*) plugin, event); #ifndef NDEBUG // debug if (temp.common->debug_level) printf("base name = %s\n", temp.common->name); #endif } } } switch (plugin->status) { case ARIA2_STATUS_ACTIVE: if (plugin->completedLength > 0 && plugin->completedLength == plugin->totalLength) { event = uget_event_new(UGET_EVENT_UPLOADING); uget_plugin_post((UgetPlugin*) plugin, event); } break; case ARIA2_STATUS_WAITING: // clear uploading state event = uget_event_new(UGET_EVENT_STOP_UPLOADING); uget_plugin_post((UgetPlugin*) plugin, event); break; case ARIA2_STATUS_COMPLETE: // clear uploading state event = uget_event_new(UGET_EVENT_STOP_UPLOADING); uget_plugin_post((UgetPlugin*) plugin, event); // remove completed gid if (plugin->gids.length > 0) { ug_free(plugin->gids.at[0]); ug_array_erase(&plugin->gids, 0, 1); } // If there is only one followed gid and file, change uri. if (plugin->gids.length == 1 && plugin->files_per_gid == 1) { // If URI scheme is not "magnet" and aria2 runs in local device if (global.data->uri_remote == FALSE && plugin->uri_type != URI_MAGNET) { // change URI ug_free(temp.common->uri); ug_free(temp.common->name); ug_free(temp.common->file); file1 = (UgetFile*) plugin->files->list.head; temp.common->uri = ug_strdup(file1->path); temp.common->name = uget_name_from_uri_str(temp.common->uri); temp.common->file = NULL; #ifndef NDEBUG // debug if (temp.common->debug_level) printf("uri followed to %s\n", temp.common->uri); #endif } } // If no followed gid, it was completed. else if (plugin->gids.length == 0) { event = uget_event_new(UGET_EVENT_COMPLETED); uget_plugin_post((UgetPlugin*)plugin, event); } // clear files uget_plugin_lock(plugin); uget_files_clear(plugin->files); uget_plugin_unlock(plugin); plugin->files_per_gid = 0; break; case ARIA2_STATUS_ERROR: // clear uploading state event = uget_event_new(UGET_EVENT_STOP_UPLOADING); uget_plugin_post((UgetPlugin*) plugin, event); #ifdef NO_RETRY_IF_CONNECT_FAILED // download speed was too slow if (plugin->errorCode == 5) { #else // download speed was too slow or name resolution failed if (plugin->errorCode == 5 || plugin->errorCode == 19) { #endif // retry if (temp.common->retry_count < temp.common->retry_limit || temp.common->retry_limit == 0) { temp.common->retry_count++; plugin->restart = TRUE; #ifndef NDEBUG // debug if (temp.common->debug_level) printf("retry %d\n", temp.common->retry_count); #endif } else { event = uget_event_new_error( UGET_EVENT_ERROR_TOO_MANY_RETRIES, NULL); uget_plugin_post((UgetPlugin*) plugin, event); } } else { if (plugin->errorCode > 30) plugin->errorCode = 1; // if this is last gid. if (plugin->gids.length == 1) { #ifdef HAVE_GLIB event = uget_event_new_error(0, gettext(error_string[plugin->errorCode])); #else event = uget_event_new_error(0, error_string[plugin->errorCode]); #endif uget_plugin_post((UgetPlugin*)plugin, event); } } // remove stopped gid ug_free(plugin->gids.at[0]); plugin->gids.length -= 1; memmove(plugin->gids.at, plugin->gids.at + 1, sizeof(char*) * plugin->gids.length); break; case ARIA2_STATUS_REMOVED: // clear uploading state event = uget_event_new(UGET_EVENT_STOP_UPLOADING); uget_plugin_post((UgetPlugin*) plugin, event); // debug event = uget_event_new_normal(0, _("aria2: gid was removed.")); uget_plugin_post((UgetPlugin*)plugin, event); // remove completed gid ug_free(plugin->gids.at[0]); plugin->gids.length -= 1; memmove(plugin->gids.at, plugin->gids.at + 1, sizeof(char*) * plugin->gids.length); break; } // If we have followed gid, don't restart. if (plugin->gids.length > 0) plugin->restart = FALSE; else { #ifndef NDEBUG // debug if (temp.common->debug_level) printf("gids.length = %d\n", plugin->gids.length); #endif // If no followed gid and no need to retry, it must stop. if (plugin->restart == FALSE) plugin->paused = TRUE; } // if plug-in was stopped, don't sync data with thread if (plugin->stopped == FALSE) plugin->synced = TRUE; return TRUE; } // ---------------------------------------------------------------------------- // plugin_thread static void add_gids_by_value_array(UgArrayStr* gids, UgValueArray* varray) { UgValue* value; int index; #ifndef NDEBUG // debug printf("add %d gids\n", varray->length); #endif for (index = 0; index < varray->length; index++) { value = varray->at + index; *(char**) ug_array_alloc(gids, 1) = value->c.string; value->c.string = NULL; value->type = UG_VALUE_NONE; } } static int send_start_request(UgetPluginAria2* plugin) { UgJsonrpcObject* res; uget_aria2_request(global.data, plugin->start_request); res = uget_aria2_respond(global.data, plugin->start_request); if (res == NULL) { #ifdef HAVE_GLIB uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(0, gettext(aria2_no_response))); #else uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(0, aria2_no_response)); #endif return FALSE; } if (res->error.code) { uget_plugin_post((UgetPlugin*)plugin, uget_event_new_error(0, res->error.message)); uget_aria2_recycle(global.data, res); return FALSE; } // add gid from response if (plugin->uri_type == URI_METALINK) add_gids_by_value_array(&plugin->gids, res->result.c.array); else { *(char**) ug_array_alloc(&plugin->gids, 1) = ug_strdup(res->result.c.string); } // recycle response uget_aria2_recycle(global.data, res); return TRUE; } static int plugin_delay(UgetPluginAria2* plugin) { unsigned int count; for (count = 0; count < plugin->retry_delay; count++) { if (plugin->paused) return FALSE; // sleep 1 second every time ug_sleep(1000); } return TRUE; } static UgThreadResult plugin_thread(UgetPluginAria2* plugin) { UgJsonrpcObject* req; UgJsonrpcObject* res; UgJsonrpcObject* status_req; UgValue* status_gid; UgValue* value; UgValue* member; int count; // create status_req and initialize status_gid status_req = alloc_status_request(&status_gid); // send start_request to server plugin->restart = FALSE; if (send_start_request(plugin) == FALSE) goto exit; while (plugin->paused == FALSE) { // retry if (plugin->restart == TRUE) { if (plugin_delay(plugin) == FALSE) continue; #ifndef NDEBUG // debug printf("retry\n"); #endif // send start_request to server again plugin->restart = FALSE; if (send_start_request(plugin) == FALSE) goto exit; } // Don't update status until user call plugin_sync() if (plugin->synced == FALSE) { // sleep 0.5 second ug_sleep(500); continue; } // set gid for status request // status_req->params.c.array->at[0].c.string = plugin->gids.at[0]; status_gid->c.string = plugin->gids.at[0]; // status request uget_aria2_request(global.data, status_req); // speed control : speed request & response if (plugin->limit_changed) { plugin->limit_changed = FALSE; // request & response req = alloc_speed_request(plugin); uget_aria2_request(global.data, req); res = uget_aria2_respond(global.data, req); // recycle uget_aria2_recycle(global.data, res); recycle_speed_request(req); } // status respond res = uget_aria2_respond(global.data, status_req); if (res == NULL) { #ifdef HAVE_GLIB uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(0, gettext(aria2_no_response))); #else uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(0, aria2_no_response)); #endif goto exit; } if (res->error.code) { uget_plugin_post((UgetPlugin*)plugin, uget_event_new_error(0, res->error.message)); uget_aria2_recycle(global.data, res); goto exit; } // parse status response --- start --- ug_value_sort_name(&res->result); value = ug_value_find_name(&res->result, "status"); switch (value->c.string[0]) { case 'a': plugin->status = ARIA2_STATUS_ACTIVE; break; case 'w': plugin->status = ARIA2_STATUS_WAITING; break; case 'p': plugin->status = ARIA2_STATUS_PAUSED; break; case 'e': plugin->status = ARIA2_STATUS_ERROR; break; case 'c': plugin->status = ARIA2_STATUS_COMPLETE; break; case 'r': plugin->status = ARIA2_STATUS_REMOVED; break; default: plugin->status = ARIA2_N_STATUS; break; } value = ug_value_find_name(&res->result, "errorCode"); plugin->errorCode = (value) ? ug_value_get_int(value) : 0; value = ug_value_find_name(&res->result, "totalLength"); plugin->totalLength = ug_value_get_int64(value); value = ug_value_find_name(&res->result, "completedLength"); plugin->completedLength = ug_value_get_int64(value); value = ug_value_find_name(&res->result, "uploadLength"); plugin->uploadLength = ug_value_get_int64(value); value = ug_value_find_name(&res->result, "downloadSpeed"); plugin->downloadSpeed = ug_value_get_int(value); value = ug_value_find_name(&res->result, "uploadSpeed"); plugin->uploadSpeed = ug_value_get_int(value); value = ug_value_find_name(&res->result, "followedBy"); if (value) add_gids_by_value_array(&plugin->gids, value->c.array); value = ug_value_find_name(&res->result, "files"); if (value && ug_value_length(value) != plugin->files_per_gid) { UgValueArray* array; UgetFile* ufile; char* string; array = value->c.array; plugin->files_per_gid = ug_value_length(value); for (count = 0; count < array->length; count++) { value = array->at + count; ug_value_sort_name(value); member = ug_value_find_name(value, "path"); if (member == NULL || member->c.string[0] == '\0') { plugin->files_per_gid--; continue; } uget_plugin_lock(plugin); // add .aria2 control file first if (plugin->files_per_gid == 1) { string = ug_strdup_printf("%s.aria2", member->c.string); ufile = uget_files_realloc(plugin->files, string); ufile->type = UGET_FILE_TEMPORARY; ug_free(string); } // add downloading file ufile = uget_files_realloc(plugin->files, member->c.string); member = ug_value_find_name(value, "completedLength"); ufile->complete = ug_value_get_int64(member); member = ug_value_find_name(value, "length"); ufile->total = ug_value_get_int64(member); uget_plugin_unlock(plugin); } } // parse status response --- end --- // recycle status response uget_aria2_recycle(global.data, res); // plugin_sync() will exchange data plugin->synced = FALSE; } if (plugin->gids.length) { req = uget_aria2_alloc(global.data, TRUE, TRUE); req->method_static = "aria2.remove"; // if there is no secret token in params. if (req->params.type == UG_VALUE_NONE) ug_value_init_array(&req->params, plugin->gids.length); // add gids to params. value = ug_value_alloc(&req->params, plugin->gids.length); for (count = 0; count < plugin->gids.length; count++, value++) { value->type = UG_VALUE_STRING; value->c.string = ug_strdup(plugin->gids.at[count]); } // call "aria2.remove" uget_aria2_request(global.data, req); res = uget_aria2_respond(global.data, req); #ifndef NDEBUG // debug if (res->error.code) { printf("aria2.remove() response error code = %d" "\n" " message = \"%s\"." "\n", res->error.code, res->error.message); } #endif uget_aria2_recycle(global.data, res); uget_aria2_recycle(global.data, req); } exit: recycle_status_request(status_req); plugin->stopped = TRUE; uget_plugin_unref((UgetPlugin*)plugin); return UG_THREAD_RESULT; } // ---------------------------------------------------------------------------- // plugin_accept/plugin_start static int plugin_accept(UgetPluginAria2* plugin, UgInfo* node_info) { UgJsonrpcObject* request; UgValue* value; UgValue* member; char* uri; char* str = NULL; char* user = NULL; char* password = NULL; union { UgetCommon* common; UgetFiles* files; UgetProxy* proxy; UgetHttp* http; UgetHttp* ftp; } temp; temp.common = ug_info_get(node_info, UgetCommonInfo); if (temp.common == NULL || temp.common->uri == NULL) return FALSE; uri = temp.common->uri; plugin->uri_type = URI_NET; ug_uri_init(&plugin->uri_part, uri); if ((plugin->uri_part.scheme_len == 4 && strncmp(uri, "file", 4) == 0) || (plugin->uri_part.scheme_len == 0 && plugin->uri_part.file >= 0)) { // file type is torrent or metalink? if (decide_file_type(plugin) == URI_UNSUPPORTED) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_UNSUPPORTED_FILE, NULL)); return FALSE; } // load file and convert it's binary to base64 if (plugin->uri_part.path > 0) str = ug_file_to_base64(uri + plugin->uri_part.path + 1, NULL); else str = ug_file_to_base64(uri, NULL); if (str == NULL) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_FILE_OPEN_FAILED, NULL)); return FALSE; } } else if (plugin->uri_part.scheme_len == 6 && strncmp(uri, "magnet", 6) == 0) plugin->uri_type = URI_MAGNET; request = uget_aria2_alloc(global.data, TRUE, TRUE); if (request->params.type == UG_VALUE_NONE) ug_value_init_array(&request->params, 3); switch (plugin->uri_type) { case URI_NET: case URI_MAGNET: request->method_static = "aria2.addUri"; // parameter1 : URIs value = ug_value_alloc(&request->params, 1); ug_value_init_array(value, 8); member = ug_value_alloc(value, 1); member->type = UG_VALUE_STRING; member->c.string = ug_strdup(uri); // mirrors add_uri_mirrors(value, temp.common->mirrors); // parameter2 : options break; case URI_TORRENT: request->method_static = "aria2.addTorrent"; // parameter1 : encoded torrent file value = ug_value_alloc(&request->params, 1); value->type = UG_VALUE_STRING; value->c.string = str; // parameter2 : URIs value = ug_value_alloc(&request->params, 1); ug_value_init_array(value, 0); // parameter3 : options break; case URI_METALINK: // parameter1 : encoded metalink file request->method_static = "aria2.addMetalink"; value = ug_value_alloc(&request->params, 1); value->type = UG_VALUE_STRING; value->c.string = str; // parameter2 : options break; } // parameterX : options value = ug_value_alloc(&request->params, 1); ug_value_init_object(value, 16); member = ug_value_alloc(value, 1); member->name = "continue"; member->type = UG_VALUE_BOOL; member->c.boolean = TRUE; if ((temp.common->user && temp.common->user[0]) || (temp.common->password && temp.common->password[0])) { user = (temp.common->user) ? temp.common->user : ""; password = (temp.common->password) ? temp.common->password : ""; } if (temp.common->folder) { member = ug_value_alloc(value, 1); member->name = "dir"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup(temp.common->folder); } if (temp.common->file) { member = ug_value_alloc(value, 1); member->name = "out"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup(temp.common->file); } member = ug_value_alloc(value, 1); member->name = "remote-time"; member->type = UG_VALUE_BOOL; member->c.boolean = temp.common->timestamp; member = ug_value_alloc(value, 1); member->name = "retry-wait"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup_printf("%u", temp.common->retry_delay); member = ug_value_alloc(value, 1); member->name = "max-tries"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup_printf("%u", temp.common->retry_limit); // speed control: decide speed limit before starting plug-in plugin->limit_upper[1] = temp.common->max_upload_speed; plugin->limit_upper[0] = temp.common->max_download_speed; plugin_ctrl_speed(plugin, plugin->limit); member = ug_value_alloc(value, 1); member->name = "max-download-limit"; member->type = UG_VALUE_STRING; // member->c.string = ug_strdup_printf("%d", temp.common->max_download_speed); member->c.string = ug_strdup_printf("%d", plugin->limit[0]); member = ug_value_alloc(value, 1); member->name = "max-upload-limit"; member->type = UG_VALUE_STRING; // member->c.string = ug_strdup_printf("%d", temp.common->max_upload_speed); member->c.string = ug_strdup_printf("%d", plugin->limit[1]); member = ug_value_alloc(value, 1); member->name = "lowest-speed-limit"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup_printf("%u", 128); // Don't set connection limit if max_connections is 0. if (temp.common->max_connections != 0) { // aria2 doesn't accept "max-connection-per-server" large than 16. member = ug_value_alloc(value, 1); member->name = "max-connection-per-server"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup_printf("%u", (temp.common->max_connections <= 16) ? temp.common->max_connections : 16); // split member = ug_value_alloc(value, 1); member->name = "split"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup_printf("%u", temp.common->max_connections); } temp.files = ug_info_get(node_info, UgetFilesInfo); if (temp.files) plugin->files = ug_data_copy(temp.files); else plugin->files = ug_data_new(UgetFilesInfo); temp.proxy = ug_info_get(node_info, UgetProxyInfo); #ifdef HAVE_LIBPWMD if (temp.proxy && temp.proxy->type == UGET_PROXY_PWMD) { if (uget_plugin_aria2_set_proxy_pwmd(plugin, node_info, member) == FALSE) return FALSE; } else #endif if (temp.proxy && temp.proxy->host) { member = ug_value_alloc(value, 1); member->name = "all-proxy"; member->type = UG_VALUE_STRING; if (temp.proxy->port == 0) member->c.string = ug_strdup(temp.proxy->host); else { member->c.string = ug_strdup_printf("%s:%d", temp.proxy->host, temp.proxy->port); } if ((temp.proxy->user && temp.proxy->user[0]) || (temp.proxy->password && temp.proxy->password[0])) { member = ug_value_alloc(value, 1); member->name = "all-proxy-user"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup( (temp.proxy->user) ? temp.proxy->user : ""); member = ug_value_alloc(value, 1); member->name = "all-proxy-password"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup( (temp.proxy->password) ? temp.proxy->password : ""); } } temp.http = ug_info_get(node_info, UgetHttpInfo); if (temp.http) { if (plugin->uri_part.scheme_len >= 4 && strncmp(uri, "http", 4) == 0) { if ((temp.http->user && temp.http->user[0]) || (temp.http->password && temp.http->password[0])) { user = (temp.http->user) ? temp.http->user : ""; password = (temp.http->password) ? temp.http->password : ""; } } if (temp.http->referrer) { member = ug_value_alloc(value, 1); member->name = "referer"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup(temp.http->referrer); } // if (temp.http->cookie_file) { // member = ug_value_alloc(value, 1); // member->name = "load-cookies"; // member->type = UG_VALUE_STRING; // member->c.string = ug_strdup(temp.http->cookie_file); // } if (temp.http->user_agent) { member = ug_value_alloc(value, 1); member->name = "user-agent"; member->type = UG_VALUE_STRING; member->c.string = ug_strdup(temp.http->user_agent); } } temp.ftp = ug_info_get(node_info, UgetFtpInfo); if (temp.ftp) { if (plugin->uri_part.scheme_len >= 3 && strncmp(uri, "ftp", 3) == 0) { if ((temp.ftp->user && temp.ftp->user[0]) || (temp.ftp->password && temp.ftp->password[0])) { user = (temp.ftp->user) ? temp.ftp->user : ""; password = (temp.ftp->password) ? temp.ftp->password : ""; } } } if (plugin->uri_type == URI_NET && plugin->uri_part.host != -1) { if (user || password) { str = ug_malloc(strlen(user) + strlen(password) + strlen(uri) + 2 + 1); // + ':' + '@' + '\0' str[plugin->uri_part.host] = 0; strncpy(str, uri, plugin->uri_part.host); strcat(str, user); strcat(str, ":"); strcat(str, password); strcat(str, "@"); strcat(str, uri + plugin->uri_part.host); // reset uri for aria2.addUri, request->params[0][0] value = request->params.c.array->at; value = value->c.array->at; ug_free(value->c.string); value->c.string = ug_strdup(str); } } plugin->files_per_gid = 0; plugin->synced = TRUE; plugin->start_time = time(NULL); plugin->start_request = request; return TRUE; } static int plugin_start(UgetPluginAria2* plugin) { UgThread thread; int ok; // try to start thread plugin->paused = FALSE; plugin->stopped = FALSE; uget_plugin_ref((UgetPlugin*) plugin); ok = ug_thread_create(&thread, (UgThreadFunc) plugin_thread, plugin); if (ok == UG_THREAD_OK) ug_thread_unjoin(&thread); else { // failed to start thread ----------------- plugin->paused = TRUE; plugin->stopped = TRUE; // post error message and decreases the reference count uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_THREAD_CREATE_FAILED, NULL)); uget_plugin_unref((UgetPlugin*) plugin); return FALSE; } return TRUE; } // ---------------------------------------------------------------------------- // JSON-RPC request // speed control static UgJsonrpcObject* alloc_speed_request(UgetPluginAria2* plugin) { UgJsonrpcObject* object; UgValue* options; UgValue* value; object = uget_aria2_alloc(global.data, TRUE, TRUE); object->method_static = "aria2.changeOption"; if (object->params.type == UG_VALUE_NONE) ug_value_init_array(&object->params, 2); // gid value = ug_value_alloc(&object->params, 1); value->type = UG_VALUE_STRING; value->c.string = plugin->gids.at[0]; // object options = ug_value_alloc(&object->params, 1); ug_value_init_object(options, 2); // max-download-limit value = ug_value_alloc(options, 1); value->name = ug_strdup("max-download-limit"); value->type = UG_VALUE_STRING; value->c.string = ug_strdup_printf("%d", plugin->limit[0]); // max-upload-limit value = ug_value_alloc(options, 1); value->name = ug_strdup("max-upload-limit"); value->type = UG_VALUE_STRING; value->c.string = ug_strdup_printf("%d", plugin->limit[1]); return object; } static void recycle_speed_request(UgJsonrpcObject* object) { UgValue* value; value = uget_aria2_clear_token(object); // params[0] is gid // value = object->params.c.array->at; value->type = UG_VALUE_NONE; value->c.array = NULL; // ready to recycle it uget_aria2_recycle(global.data, object); } static UgJsonrpcObject* alloc_status_request(UgValue** gid) { UgJsonrpcObject* object; UgValue* params; UgValue* keys; // prepare JSON-RPC object for "aria2.tellStatus" object = uget_aria2_alloc(global.data, TRUE, TRUE); object->method_static = "aria2.tellStatus"; params = &object->params; if (params->type == UG_VALUE_NONE) ug_value_init_array(params, 2); // gid gid[0] = ug_value_alloc(params, 1); gid[0]->type = UG_VALUE_STRING; gid[0]->c.string = NULL; // keys array from UgetAria2.status_keys keys = ug_value_alloc(params, 1); keys->type = UG_VALUE_ARRAY; keys->c.array = global.data->status_keys.c.array; return object; } static void recycle_status_request(UgJsonrpcObject* object) { UgValue* value; value = uget_aria2_clear_token(object); // params[0] is gid // value = object->params.c.array->at; value->type = UG_VALUE_NONE; value->c.array = NULL; // params[1] is keys of status // value = object->params.c.array->at + 1; value++; value->type = UG_VALUE_NONE; value->c.array = NULL; // ready to recycle it uget_aria2_recycle(global.data, object); } // ---------------------------------------------------------------------------- // static utility functions static void* ug_file_to_base64(const char* file, int* length) { int fd; int fsize, fpos = 0; int result_len; void* buffer; void* result; // fd = open(file, O_RDONLY | O_BINARY, S_IREAD); fd = ug_open(file, UG_O_READONLY | UG_O_BINARY, UG_S_IREAD); if (fd == -1) return NULL; // lseek(fd, 0, SEEK_END); ug_seek(fd, 0, SEEK_END); fsize = (int) ug_tell(fd); buffer = ug_malloc(fsize); // lseek(fd, 0, SEEK_SET); ug_seek(fd, 0, SEEK_SET); do { result_len = ug_read(fd, buffer, fsize - fpos); // result_len = read(fd, buffer, fsize - fpos); fpos += result_len; } while (result_len > 0); // close(fd); ug_close(fd); if (fsize != fpos) { ug_free(buffer); return NULL; } result = ug_base64_encode(buffer, fsize, &result_len); ug_free(buffer); if (length) *length = result_len; return result; } static int decide_file_type(UgetPluginAria2* plugin) { char buf[11]; union { const char* ext; int fd; int path; } temp; plugin->uri_type = URI_UNSUPPORTED; // handle URI file:/// temp.path = plugin->uri_part.path; if (temp.path > 0 && plugin->uri_part.uri[temp.path] != 0) temp.path++; // temp.fd = ug_open(plugin->uri_part.uri + temp.path, UG_O_READONLY | UG_O_BINARY, UG_S_IREAD); if (temp.fd != -1 && ug_read(temp.fd, buf, 11) == 11) { if (strncmp(buf, "d8:announce", 11) == 0) plugin->uri_type = URI_TORRENT; else { buf[10] = 0; if (strchr(buf, '<')) plugin->uri_type = URI_METALINK; } } ug_close(temp.fd); if (plugin->uri_type == URI_UNSUPPORTED && ug_uri_part_file_ext(&plugin->uri_part, &temp.ext)) { if (temp.ext[0] == 'm' || temp.ext[0] == 'M') plugin->uri_type = URI_METALINK; else if (temp.ext[0] == 't' || temp.ext[0] == 'T') plugin->uri_type = URI_TORRENT; else plugin->uri_type = URI_UNSUPPORTED; } return plugin->uri_type; } static void add_uri_mirrors(UgValue* varray, const char* mirrors) { UgValue* value; const char* curr; const char* prev; for (curr = mirrors; curr && curr[0];) { // skip space ' ' while (curr[0] == ' ') curr++; prev = curr; curr = curr + strcspn(curr, " "); value = ug_value_alloc(varray, 1); value->type = UG_VALUE_STRING; value->c.string = ug_malloc(curr - prev + 1); value->c.string[curr - prev] = 0; // NULL terminated strncpy(value->c.string, prev, curr - prev); } } // ---------------------------------------------------------------------------- // PWMD // #ifdef HAVE_LIBPWMD static gboolean uget_plugin_aria2_set_proxy_pwmd(UgetPluginAria2 *plugin, UgInfo* info, UgValue* options) { struct pwmd_proxy_s pwmd; gpg_error_t rc; UgetEvent *message; UgetProxy *proxy; memset(&pwmd, 0, sizeof(pwmd)); proxy = ug_info_get(info, UgetProxyInfo); rc = ug_set_pwmd_proxy_options(&pwmd, proxy); if (rc) goto fail; // proxy host and port // host UgValue *value = ug_value_alloc(options, 1); value->name = ug_strdup("all-proxy"); value->type = UG_VALUE_STRING; if (pwmd.port == 0) value->c.string = ug_strdup(pwmd.hostname); else { value->c.string = ug_strdup_printf("%s:%u", pwmd.hostname, pwmd.port); } // proxy user and password if (pwmd.username || pwmd.password) { // user value = ug_value_alloc(options, 1); value->name = ug_strdup("all-proxy-user"); value->type = UG_VALUE_STRING; value->c.string = ug_strdup(pwmd.username ? pwmd.username : ""); // password value = ug_value_alloc(options, 1); value->name = ug_strdup("all-proxy-password"); value->type = UG_VALUE_STRING; value->c.string = ug_strdup(pwmd.password ? pwmd.password : ""); } ug_close_pwmd(&pwmd); return TRUE; fail: ug_close_pwmd(&pwmd); gchar *e = g_strdup_printf("Pwmd ERR %i: %s", rc, gpg_strerror(rc)); message = uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, e); uget_plugin_post((UgetPlugin*) plugin, message); g_free(e); return FALSE; } #endif // HAVE_LIBPWMD uget-2.2.2/uget/UgetRpc.h0000664000175000017500000000775713470304403012110 00000000000000/* * * Copyright (C) 2015-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_RPC_H #define UGET_RPC_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif enum { UGET_RPC_DO_NOTHING, UGET_RPC_SEND_COMMAND, UGET_RPC_PRESENT, }; typedef struct UgetRpc UgetRpc; typedef struct UgetRpcReq UgetRpcReq; typedef struct UgetRpcCmd UgetRpcCmd; struct UgetRpc { UG_JSONRPC_SOCKET_MEMBERS; /* // ------ UgJsonrpcSocket members ------ UgJson json; UgJsonrpc rpc; UgBuffer buffer; int socket; */ UgSocketServer* server; UgJsonrpcObject jobject; UgJsonrpcArray jarray; UgOption option; UgList queue; UgMutex queue_lock; char* backup_dir; #ifdef USE_UNIX_DOMAIN_SOCKET char* socket_path; int socket_path_len; #endif }; UgetRpc* uget_rpc_new (const char* backup_dir); void uget_rpc_free (UgetRpc* urpc); #ifdef USE_UNIX_DOMAIN_SOCKET void uget_rpc_use_unix_socket (UgetRpc* urpc, const char* path, int path_len); #endif int uget_rpc_do_request (UgetRpc* urpc, UgJsonrpcObject* jobj); void uget_rpc_send_command (UgetRpc* urpc, int argc, char** argv); void uget_rpc_present (UgetRpc* urpc); // return TRUE if server start int uget_rpc_start_server (UgetRpc* urpc, int detect_server); void uget_rpc_stop_server (UgetRpc* urpc); int uget_rpc_has_request (UgetRpc* urpc); UgetRpcReq* uget_rpc_get_request (UgetRpc* urpc); // ---------------------------------------------------------------------------- // UgetRpcReq - Request // UgLink #define UGET_RPC_REQ_MEMBERS \ UG_LINK_INT_MEMBERS (UgetRpcReq, method_id); \ UgDeleteFunc free struct UgetRpcReq { UGET_RPC_REQ_MEMBERS; // UgLink /* // ------ UgetRpcReq members ------ intptr_t method_id; UgetRpcReq* next; UgetRpcReq* prev; UgDeleteFunc free; */ }; UgetRpcReq* uget_rpc_req_new (void); #define uget_rpc_req_free ug_free // ---------------------------------------------------------------------------- // UgetRpcCmd struct UgetRpcCmd { UGET_RPC_REQ_MEMBERS; // UgLink /* // ------ UgetRpcReq members ------ intptr_t method_id; UgetRpcReq* next; UgetRpcReq* prev; UgDeleteFunc free; */ UgetOptionValue value; UgList uris; }; UgetRpcCmd* uget_rpc_cmd_new (void); void uget_rpc_cmd_free (UgetRpcCmd* urcmd); #ifdef __cplusplus } #endif #endif // End of UGET_RPC_H uget-2.2.2/uget/UgetPluginMega.h0000664000175000017500000001064313470304403013400 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_MEGA_H #define UGET_PLUGIN_MEGA_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginMega UgetPluginMega; extern const UgetPluginInfo* UgetPluginMegaInfo; /* ---------------------------------------------------------------------------- UgetPluginMega: It derived from UgetPluginAgent. It use libcurl to get download URL. It use curl/aria2 plug-in to download file. UgType | `--- UgetPlugin | `--- UgetPluginAgent | `--- UgetPluginMega */ struct UgetPluginMega { UGET_PLUGIN_AGENT_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; // ------ UgetPluginAgent members ------ // This plug-in use other plug-in to download files, // so we need extra UgetPlugin and UgInfo. // plugin->target_info is a copy of UgInfo that store in UgetApp UgInfo* target_info; // target_plugin use target_info to download UgetPlugin* target_plugin; // speed limit control // limit[0] = download speed limit // limit[1] = upload speed limit int limit[2]; uint8_t limit_changed:1; // speed limit changed by user or program // control flags uint8_t paused:1; // paused by user or program uint8_t stopped:1; // all downloading thread are stopped */ uint8_t named:1; // change UgetCommon::name uint8_t synced:1; // used by plugin_sync() uint8_t decrypting:1; // decrypting downloaded file // These UgData store in target_info UgetFiles* target_files; UgetProxy* target_proxy; UgetCommon* target_common; UgetProgress* target_progress; // MEGA URL contains these char* id; // ID char* key; // decrypt key char* iv; // Initialization Vector // use MEGA ID to request these information char* url; // file download URL char* file; // file name // JSON parser UgJson json; UgValue value; }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const PluginInfo* const PluginMegaInfo = (const PluginInfo*) UgetPluginMegaInfo; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginMegaMethod : PluginAgentMethod {}; // This one is for directly use only. You can NOT derived it. struct PluginMega : PluginMegaMethod, UgetPluginMega { inline void* operator new(size_t size) { return uget_plugin_new(PluginMegaInfo); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_MEGA_H uget-2.2.2/uget/UgetSite.c0000664000175000017500000000610513470304403012245 00000000000000/* * * Copyright (C) 2017-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include int uget_site_get_id (const char* url) { UgUri uuri; if (ug_uri_init (&uuri, url) == 0) return UGET_SITE_UNKNOWN; if (uuri.scheme_len == 5 && strncmp (url, "https", 5) == 0) { if (uget_site_is_youtube (&uuri) == TRUE) return UGET_SITE_YOUTUBE; if (uget_site_is_mega (&uuri) == TRUE) return UGET_SITE_MEGA; } return UGET_SITE_UNKNOWN; } // youtube.com // https://youtube.com/watch?=xxxxxxxxxxx // https://youtu.be/xxxxxxxxxxx int uget_site_is_youtube (UgUri* uuri) { int length; const char* string; length = ug_uri_host (uuri, &string); if (length >= 11 && strncmp (string + length - 11, "youtube.com", 11) == 0) { if (strncmp (uuri->uri + uuri->file , "watch?", 6) == 0) return TRUE; } else if (length >= 8 && strncmp (string + length - 8, "youtu.be", 8) == 0) { if (uuri->file != -1) return TRUE; } return FALSE; } // mega.co.nz // https://mega.co.nz/#!xxxxxxxx!xxxxxxxxxxxxxxxxxxxxxx // https://mega.nz/#!xxxxxxxx!xxxxxxxxxxxxxxxxxxxxxx int uget_site_is_mega (UgUri* uuri) { int length; const char* string; length = ug_uri_host (uuri, &string); if (length >= 10 && strncmp (string + length - 10, "mega.co.nz", 10) == 0) { if (uuri->path > 0 && strchr (uuri->uri + uuri->path , '!') != NULL) return TRUE; } else if (length >= 7 && strncmp (string + length - 7, "mega.nz", 7) == 0) { if (uuri->path > 0 && strchr (uuri->uri + uuri->path , '!') != NULL) return TRUE; } return FALSE; } uget-2.2.2/uget/UgetCurl.h0000664000175000017500000001306213470304402012252 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_CURL_H #define UGET_CURL_H #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #ifdef HAVE_CONFIG #include #endif #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetCurl UgetCurl; typedef int (*UgetCurlFunc) (UgetCurl* ugcurl, void* data); // UgetCurlState flow: // // UGET_CURL_READY // | // `--> UGET_CURL_RUN -+-> UGET_CURL_OK ---> UGET_CURL_RESPLIT // | // +-> UGET_CURL_ABORT // | // +-> UGET_CURL_ERROR // | // +-> UGET_CURL_RETRY // | // `-> UGET_CURL_NOT_RESUMABLE enum UgetCurlState { UGET_CURL_RESPLIT, // used by curl plug-in UGET_CURL_READY, UGET_CURL_RUN, UGET_CURL_OK, UGET_CURL_ABORT, // paused by user UGET_CURL_ERROR, UGET_CURL_RETRY, UGET_CURL_NOT_RESUMABLE, // redownload + retry }; // ---------------------------------------------------------------------------- // UgetCurl: used by UgetPluginCurl struct UgetCurl { UG_LINK_MEMBERS (UgetCurl, UgetCurl, self); // UgetCurl* self; // UgetCurl* next; // UgetCurl* prev; UgThread thread; CURL* curl; int64_t beg; int64_t end; int64_t pos; // current position UgetCommon* common; UgetHttp* http; UgetFtp* ftp; UgetEvent* event; // struct curl_slist* ftp_command; struct { UgUri part; void* link; } uri; // size[0] = downloaded size // size[1] = uploaded size // speed[0] = downloading speed // speed[1] = uploading speed // limit[0] = download speed limit // limit[1] = upload speed limit int64_t size[2]; int64_t speed[2]; int64_t limit[2]; // file stream struct { FILE* output; FILE* post; } file; // if user specify prepare.func, // UgetCurl will call prepare.func to open file in write function. struct { UgetCurlFunc func; void* data; } prepare; // HTTP header response data // set header_store = TRUE to enable this. struct { char* uri; char* filename; } header; long response; // from HTTP or FTP int event_code; // for CURLE_WRITE_ERROR (UGET_CURL_ERROR) uint8_t state; // UgetCurlState uint8_t progress_count; uint8_t scheme_type:4; uint8_t restart:1; // flags uint8_t limit_changed:1; // speed limit changed uint8_t header_store:1; // save uri and filename from header. uint8_t resumable:1; // get resumable in header callback uint8_t stopped:1; // downloading thread is stopped uint8_t paused:1; // paused by user uint8_t tested:1; // URI tested uint8_t test_ok:1; // URI test ok uint8_t split:1; // split previous segment uint8_t html:1; // "Content-Type: text/html" char error_string[CURL_ERROR_SIZE]; }; UgetCurl* uget_curl_new (void); void uget_curl_free (UgetCurl* ugcurl); void uget_curl_run (UgetCurl* ugcurl, int joinable); int uget_curl_open_file (UgetCurl* ugcurl, const char* filename); void uget_curl_close_file (UgetCurl* ugcurl); void uget_curl_set_url (UgetCurl* ugcurl, const char* uri); void uget_curl_set_speed (UgetCurl* ugcurl, int64_t dlspeed, int64_t ulspeed); void uget_curl_set_common (UgetCurl* ugcurl, UgetCommon* common); void uget_curl_set_proxy (UgetCurl* ugcurl, UgetProxy* proxy); int uget_curl_set_http (UgetCurl* ugcurl, UgetHttp* http); void uget_curl_set_ftp (UgetCurl* ugcurl, UgetFtp* ftp); void uget_curl_decide_scheme (UgetCurl* ugcurl, const char* uri); void uget_curl_decide_login (UgetCurl* ugcurl); #define uget_curl_join_thread(ugcurl) ug_thread_join (&(ugcurl)->thread) void ug_curl_set_proxy (CURL* curl, UgetProxy* proxy); #ifdef __cplusplus } #endif #endif // End of UGET_CURL_H uget-2.2.2/uget/Makefile.am0000664000175000017500000000265513470304402012411 00000000000000## To enable LFS (Large File Support) in 32bit platform ## add `getconf LFS_CFLAGS` to CFLAGS ## add `getconf LFS_LDFLAGS` to LDFLAGS ## static library --- # lib_LIBRARIES = libuget.a noinst_LIBRARIES = libuget.a libuget_a_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget libuget_a_CFLAGS = @PTHREAD_CFLAGS@ @GLIB_CFLAGS@ libuget_a_SOURCES = \ UgetSequence.c \ UgetRss.c \ UgetRpc.c \ UgetOption.c \ UgetData.c \ UgetFiles.c \ UgetNode.c \ UgetNode-compare.c \ UgetNode-filter.c \ UgetTask.c \ UgetHash.c \ UgetSite.c \ UgetApp.c \ UgetEvent.c \ UgetPlugin.c \ UgetA2cf.c \ UgetCurl.c \ UgetAria2.c \ UgetMedia.c \ UgetMedia-youtube.c \ UgetPluginCurl.c \ UgetPluginAria2.c \ UgetPluginMedia.c \ UgetPluginAgent.c \ UgetPluginMega.c \ UgetPluginEmpty.c noinst_HEADERS = \ UgetSequence.h \ UgetRss.h \ UgetRpc.h \ UgetOption.h \ UgetData.h \ UgetFiles.h \ UgetNode.h \ UgetTask.h \ UgetHash.h \ UgetSite.h \ UgetApp.h \ UgetEvent.h \ UgetPlugin.h \ UgetA2cf.h \ UgetCurl.h \ UgetAria2.h \ UgetMedia.h \ UgetPluginCurl.h \ UgetPluginAria2.h \ UgetPluginMedia.h \ UgetPluginAgent.h \ UgetPluginMega.h \ UgetPluginEmpty.h if WITH_LIBPWMD libuget_a_CFLAGS += @LIBPWMD_CFLAGS@ libuget_a_SOURCES += pwmd.c noinst_HEADERS += pwmd.h endif EXTRA_DIST = \ Android.mk \ CMakeLists.txt uget-2.2.2/uget/UgetPlugin.h0000664000175000017500000002352713470304402012612 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_H #define UGET_PLUGIN_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPlugin UgetPlugin; typedef struct UgetPluginInfo UgetPluginInfo; typedef enum { // input ---------------- UGET_PLUGIN_CTRL_START, UGET_PLUGIN_CTRL_STOP, UGET_PLUGIN_CTRL_SPEED, // int*, int[0] = download, int[1] = upload // state ---------------- UGET_PLUGIN_SET_STATE, // int*, TRUE or FALSE (unused) UGET_PLUGIN_GET_STATE, // int*, TRUE or FALSE } UgetPluginCtrlCode; // global typedef enum { UGET_PLUGIN_GLOBAL_INIT, // get/set, parameter = (intptr_t = FALSE or TRUE) UGET_PLUGIN_GLOBAL_SETTING, // get/set, parameter = (void* custom_struct) UGET_PLUGIN_GLOBAL_SPEED_LIMIT, // get/set, parameter = (int speed[2]) UGET_PLUGIN_GLOBAL_SPEED, // get, parameter = (int speed[2]) UGET_PLUGIN_GLOBAL_ERROR_CODE, // get, parameter = (int* error_code) UGET_PLUGIN_GLOBAL_ERROR_STRING, // get, parameter = (char** error_string) UGET_PLUGIN_GLOBAL_MATCH, // get, parameter = (char* url) UGET_PLUGIN_GLOBAL_DERIVED = 10000, // for derived plug-ins } UgetPluginGlobalOption; typedef enum { UGET_RESULT_OK = 0, UGET_RESULT_ERROR, UGET_RESULT_FAILED, UGET_RESULT_UNSUPPORT, } UgetResult; // accept/sync return TRUE or FALSE typedef int (*UgetPluginSyncFunc)(UgetPlugin* plugin, UgInfo* info); // start/stop...etc return TRUE or FALSE. typedef int (*UgetPluginCtrlFunc)(UgetPlugin* plugin, int, void* data); // global_set/global_get typedef UgetResult (*UgetPluginGlobalFunc)(int option, void* parameter); /* ---------------------------------------------------------------------------- UgetPluginInfo UgTypeInfo | `-- UgetPluginInfo */ struct UgetPluginInfo { UG_TYPE_INFO_MEMBERS; /* // ------ UgTypeInfo members ------ const char* name; uintptr_t size; UgInitFunc init; UgFinalFunc final; */ UgetPluginSyncFunc accept; // pass data to plug-in. UgetPluginSyncFunc sync; // call this to sync/exchange data. UgetPluginCtrlFunc ctrl; // ---------------------------- // Global data and functions // global data is used for matching UgetPlugin and UgInfo const char** hosts; const char** schemes; const char** file_exts; // global set/get function for plug-in special setting. UgetPluginGlobalFunc global_set; UgetPluginGlobalFunc global_get; }; UgetResult uget_plugin_global_set(const UgetPluginInfo* info, int option, void* parameter); UgetResult uget_plugin_global_get(const UgetPluginInfo* info, int option, void* parameter); // return matched count. // return 3 if URI can be matched hosts, schemes, and file_exts. int uget_plugin_match(const UgetPluginInfo* info, UgUri* uuri); /* ---------------------------------------------------------------------------- UgetPlugin: It is base class/struct that used by plug-ins. It derived from UgType. UgType | `-- UgetPlugin accept(info) accept(info) ,----------. -------------> ,-----------. -------------> ,-----------. | | | | | | | User App | | plug-in 1 | | plug-in 2 | | | | | | | `----------' <------------> `-----------' <------------> `-----------' sync(info) sync(info) // create and start plug-in plugin = uget_plugin_new(UgetPluginCurlInfo); uget_plugin_accept(plugin, info); if (uget_plugin_start(plugin) == FALSE) { uget_plugin_unref(plugin); return; } // Running loop sample 1: use uget_plugin_sync() while (uget_plugin_sync(plugin, info)) { // sleep(); // do something here } // Running loop sample 2: use uget_plugin_get_state() do { // sleep(); // do something here // If you don't want to exchange data (e.g. progress) with plug-in, // you do not need to call uget_plugin_sync() at last. uget_plugin_sync(plugin, info); } while (uget_plugin_get_state(plugin)); */ #define UGET_PLUGIN_MEMBERS \ const UgetPluginInfo* info; \ UgetEvent* events; \ UgMutex mutex; \ int ref_count struct UgetPlugin { UGET_PLUGIN_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* events; UgMutex mutex; int ref_count; */ }; // UgetPlugin functions UgetPlugin* uget_plugin_new(const UgetPluginInfo* info); void uget_plugin_ref(UgetPlugin* plugin); void uget_plugin_unref(UgetPlugin* plugin); // return TRUE if UgInfo was accepted by plug-in. // return FALSE if UgInfo lacks necessary data. int uget_plugin_accept(UgetPlugin* plugin, UgInfo* info); // return TRUE if plug-in is running or some data need to exchange/sync. // return FALSE if plug-in was stopped and no data need to exchange/sync. int uget_plugin_sync(UgetPlugin* plugin, UgInfo* info); // return TRUE or FALSE. int uget_plugin_ctrl(UgetPlugin* plugin, int code, void* data); #define uget_plugin_start(plugin) \ uget_plugin_ctrl(plugin, UGET_PLUGIN_CTRL_START, NULL) #define uget_plugin_stop(plugin) \ uget_plugin_ctrl(plugin, UGET_PLUGIN_CTRL_STOP, NULL) #define uget_plugin_ctrl_speed(plugin, dl_ul_int_array) \ uget_plugin_ctrl(plugin, UGET_PLUGIN_CTRL_SPEED, dl_ul_int_array) // return > 0 if plug-in is running. int uget_plugin_get_state(UgetPlugin* plugin); void uget_plugin_post(UgetPlugin* plugin, UgetEvent* message); UgetEvent* uget_plugin_pop (UgetPlugin* plugin); #define uget_plugin_lock(plugin) ug_mutex_lock(&(plugin)->mutex) #define uget_plugin_unlock(plugin) ug_mutex_unlock(&(plugin)->mutex) #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginInfoMethod { inline UgetResult globalSet(int option, void* parameter) { return uget_plugin_global_set((UgetPluginInfo*)this, option, parameter); } inline UgetResult globalGet(int option, void* parameter) { return uget_plugin_global_get((UgetPluginInfo*)this, option, parameter); } inline int match(UgUri* uuri) { return uget_plugin_match((UgetPluginInfo*)this, uuri); } }; // This one is for directly use only. You can NOT derived it. struct PluginInfo : PluginInfoMethod, UgetPluginInfo {}; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginMethod { inline void* operator new(size_t size, const UgetPluginInfo* pinfo) { return uget_plugin_new(pinfo); } inline void operator delete(void* p) { uget_plugin_unref((UgetPlugin*)p); } inline void ref(void) { uget_plugin_ref((UgetPlugin*)this); } inline void unref(void) { uget_plugin_unref((UgetPlugin*)this); } inline int accept(UgInfo* info) { return uget_plugin_accept((UgetPlugin*)this, info); } inline int sync(UgInfo* info) { return uget_plugin_sync((UgetPlugin*)this, info); } inline int ctrl(int code, void* data) { return uget_plugin_ctrl((UgetPlugin*)this, code, data); } inline int ctrlSpeed(int* DL_UL_array) { return uget_plugin_ctrl((UgetPlugin*)this, UGET_PLUGIN_CTRL_SPEED, DL_UL_array); } inline int ctrlSpeed(int dlspeed, int ulspeed) { int DL_UL_array[2] = {dlspeed, ulspeed}; return uget_plugin_ctrl((UgetPlugin*)this, UGET_PLUGIN_CTRL_SPEED, DL_UL_array); } inline int start(void) { return uget_plugin_start((UgetPlugin*)this); } inline int stop(void) { return uget_plugin_stop((UgetPlugin*)this); } inline int getState(void) { return uget_plugin_get_state((UgetPlugin*)this); } inline void post(UgetEvent* message) { uget_plugin_post((UgetPlugin*)this, message); } inline UgetEvent* pop(void) { return uget_plugin_pop((UgetPlugin*)this); } }; // This one is for directly use only. You can NOT derived it. struct Plugin : PluginMethod, UgetPlugin {}; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_H uget-2.2.2/uget/UgetPluginAgent.c0000664000175000017500000002003113470304402013547 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #endif // _WIN32 || _WIN64 // ---------------------------------------------------------------------------- // global data static struct { const UgetPluginInfo* default_plugin; int ref_count; } global = {NULL, 0}; // ---------------------------------------------------------------------------- // global functions UgetResult uget_plugin_agent_global_init(void) { if (global.default_plugin == NULL) { #if defined _WIN32 || defined _WIN64 WSADATA WSAData; WSAStartup(MAKEWORD(2, 2), &WSAData); #endif // _WIN32 || _WIN64 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { #if defined _WIN32 || defined _WIN64 WSACleanup(); #endif return UGET_RESULT_ERROR; } global.default_plugin = UgetPluginCurlInfo; } global.ref_count++; return UGET_RESULT_OK; } void uget_plugin_agent_global_ref(void) { global.ref_count++; } void uget_plugin_agent_global_unref(void) { if (global.default_plugin == NULL) return; global.ref_count--; if (global.ref_count == 0) { global.default_plugin = NULL; curl_global_cleanup(); #if defined _WIN32 || defined _WIN64 WSACleanup(); #endif } } UgetResult uget_plugin_agent_global_set(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: // do global initialize/finalize here if (parameter) return uget_plugin_agent_global_init(); else uget_plugin_agent_global_unref(); break; case UGET_PLUGIN_AGENT_GLOBAL_PLUGIN: global.default_plugin = parameter; break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } UgetResult uget_plugin_agent_global_get(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_INIT: if (parameter) *(int*)parameter = global.ref_count; break; case UGET_PLUGIN_AGENT_GLOBAL_PLUGIN: *(void**)parameter = (void*)global.default_plugin; break; default: return UGET_RESULT_UNSUPPORT; } return UGET_RESULT_OK; } // ---------------------------------------------------------------------------- // instance functions void uget_plugin_agent_init(UgetPluginAgent* plugin) { if (global.ref_count == 0) uget_plugin_agent_global_init(); else uget_plugin_agent_global_ref(); } void uget_plugin_agent_final(UgetPluginAgent* plugin) { // extent data and plug-in if (plugin->target_info) ug_info_unref(plugin->target_info); if (plugin->target_plugin) uget_plugin_unref(plugin->target_plugin); uget_plugin_agent_global_unref(); } int uget_plugin_agent_ctrl(UgetPluginAgent* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: return FALSE; case UGET_PLUGIN_CTRL_STOP: plugin->paused = TRUE; return TRUE; case UGET_PLUGIN_CTRL_SPEED: // speed control return uget_plugin_agent_ctrl_speed(plugin, data); // state ---------------- case UGET_PLUGIN_GET_STATE: *(int*)data = (plugin->stopped) ? FALSE : TRUE; return TRUE; default: break; } return FALSE; } int uget_plugin_agent_ctrl_speed(UgetPluginAgent* plugin, int* speed) { UgetCommon* common; int value; // notify plug-in that speed limit has been changed if (plugin->limit[0] != speed[0] || plugin->limit[1] != speed[1]) plugin->limit_changed = TRUE; // decide speed limit by user specified data. if (plugin->target_info) common = ug_info_get(plugin->target_info, UgetCommonInfo); else common = NULL; if (common == NULL) { plugin->limit[0] = speed[0]; plugin->limit[1] = speed[1]; } else { // download value = speed[0]; if (common->max_download_speed) { if (value > common->max_download_speed || value == 0) { value = common->max_download_speed; plugin->limit_changed = TRUE; } } plugin->limit[0] = value; // upload value = speed[1]; if (common->max_upload_speed) { if (value > common->max_upload_speed || value == 0) { value = common->max_upload_speed; plugin->limit_changed = TRUE; } } plugin->limit[1] = value; } return plugin->limit_changed; } // ---------------------------------------------------------------------------- // sync functions void uget_plugin_agent_sync_common(UgetPluginAgent* plugin, UgetCommon* common, UgetCommon* target) { if (target == NULL) target = ug_info_realloc(plugin->target_info, UgetCommonInfo); // sync speed limit from common to target if (target->max_upload_speed != common->max_upload_speed || target->max_download_speed != common->max_download_speed) { target->max_upload_speed = common->max_upload_speed; target->max_download_speed = common->max_download_speed; plugin->limit[1] = common->max_upload_speed; plugin->limit[0] = common->max_download_speed; uget_plugin_agent_ctrl_speed(plugin, plugin->limit); } target->max_connections = common->max_connections; target->retry_limit = common->retry_limit; common->retry_count = target->retry_count; } void uget_plugin_agent_sync_progress(UgetPluginAgent* plugin, UgetProgress* progress, UgetProgress* target) { if (target == NULL) target = ug_info_realloc(plugin->target_info, UgetProgressInfo); // sync progress from target to progress progress->complete = target->complete; progress->total = target->total; progress->download_speed = target->download_speed; progress->upload_speed = target->upload_speed; progress->uploaded = target->uploaded; progress->elapsed = target->elapsed; progress->percent = target->percent; progress->left = target->left; } // ---------------------------------------------------------------------------- // thread functions int uget_plugin_agent_start(UgetPluginAgent* plugin, UgThreadFunc thread_func) { UgThread thread; int ok; // try to start thread plugin->paused = FALSE; plugin->stopped = FALSE; uget_plugin_ref((UgetPlugin*) plugin); ok = ug_thread_create(&thread, (UgThreadFunc) thread_func, plugin); if (ok == UG_THREAD_OK) ug_thread_unjoin(&thread); else { // failed to start thread ----------------- plugin->paused = TRUE; plugin->stopped = TRUE; // post error message and decreases the reference count uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_THREAD_CREATE_FAILED, NULL)); uget_plugin_unref((UgetPlugin*) plugin); return FALSE; } return TRUE; } uget-2.2.2/uget/UgetA2cf.c0000664000175000017500000005331513470304402012120 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #define INFO_HASH_LEN_MAX 8192 enum { ENDIAN_UNKNOWN, ENDIAN_BE, ENDIAN_LE, }; union un_int16 { uint16_t integer; uint8_t bytes[2]; }; union un_int32 { uint32_t integer; uint8_t bytes[4]; }; union un_int64 { uint64_t integer; uint8_t bytes[8]; }; static int endian_type = ENDIAN_UNKNOWN; int init_endian_type (void) { union un_int16 value; if (endian_type == ENDIAN_UNKNOWN) { value.integer = 1; if (value.bytes[0] == 0) endian_type = ENDIAN_BE; else endian_type = ENDIAN_LE; } return endian_type; } void swap_le_be (uint8_t* dest, const uint8_t* src, int length) { int index; for (index = 0; index < length; index++) { length--; dest[index] = src[length]; dest[length] = src[index]; } } uint16_t uint16_to_be (uint16_t value) { union un_int16 value16; if (endian_type != ENDIAN_BE) { swap_le_be (value16.bytes, (uint8_t*)&value, 2); return value16.integer; } return value; } uint32_t uint32_to_be (uint32_t value) { union un_int32 value32; if (endian_type != ENDIAN_BE) { swap_le_be (value32.bytes, (uint8_t*)&value, 4); return value32.integer; } return value; } uint64_t uint64_to_be (uint64_t value) { union un_int64 value64; if (endian_type != ENDIAN_BE) { swap_le_be (value64.bytes, (uint8_t*)&value, 8); return value64.integer; } return value; } #define uint16_from_be uint16_to_be #define uint32_from_be uint32_to_be #define uint64_from_be uint64_to_be static int find_bit0 (uint8_t* bytes_beg, uint32_t bytes_len, uint32_t* beg_bit); static int find_bit1 (uint8_t* bytes_beg, uint32_t bytes_len, uint32_t* beg_bit); static void fill_bits (uint8_t* bytes, uint32_t nth_bit, uint32_t n_bits); static int test_bit (uint8_t* bytes, uint32_t nth_bit); static void set_bit (uint8_t* bytes, uint32_t nth_bit); // ---------------------------------------------------------------------------- #define A2CF_LAST_PIECE_LEN(a2cf) ((a2cf)->total_size % (a2cf)->piece_len) static UgetA2cfPiece* a2cf_piece_new (uint32_t length) { UgetA2cfPiece* piece; uint32_t bitfield_len; // bitfield_len = length / (16384*8); bitfield_len = length >> (14+3); bitfield_len += (length & (16384*8-1)) ? 1 : 0; piece = ug_malloc0 (sizeof(UgetA2cfPiece) + bitfield_len); // piece->self = piece; piece->length = length; piece->bitfield_len = bitfield_len; return piece; } static int a2cf_piece_read (UgetA2cfPiece* piece, FILE* file) { uint32_t bitfield_len = piece->bitfield_len; ug_fread (file, (char*)&piece->index, 4); ug_fread (file, (char*)&piece->length, 4); ug_fread (file, (char*)&piece->bitfield_len, 4); piece->index = uint32_from_be (piece->index); piece->length = uint32_from_be (piece->length); piece->bitfield_len = uint32_from_be (piece->bitfield_len); if (bitfield_len < piece->bitfield_len) return FALSE; // piece->bitfield = ug_malloc (piece->bitfield_len); ug_fread (file, piece->bitfield, piece->bitfield_len); return TRUE; } static void a2cf_piece_write (UgetA2cfPiece* piece, FILE* file) { union un_int32 value32; value32.integer = uint32_to_be (piece->index); ug_fwrite (file, value32.bytes, 4); value32.integer = uint32_to_be (piece->length); ug_fwrite (file, value32.bytes, 4); value32.integer = uint32_to_be (piece->bitfield_len); ug_fwrite (file, value32.bytes, 4); if (piece->bitfield_len) ug_fwrite (file, piece->bitfield, piece->bitfield_len); } static void a2cf_piece_truncate (UgetA2cfPiece* piece, uint32_t length) { piece->length = length; // piece->bitfield_len = piece->length / (16384*8); piece->bitfield_len = piece->length >> (14+3); // piece->bitfield_len += (piece->length % (16384*8)) ? 1 : 0; piece->bitfield_len += (piece->length & (16384*8-1)) ? 1 : 0; } static int a2cf_piece_filled (UgetA2cfPiece* piece) { uint8_t mask; uint8_t* bytes, *bytes_end; uint32_t n_bits; bytes = piece->bitfield; bytes_end = bytes + piece->bitfield_len; // n_bits = (piece->length / 16384) % 8; n_bits = (piece->length >> 14) & 7; // if (piece->length & 16384-1) { if (piece->length & 16383) { if (n_bits == 7) n_bits = 0; else bytes_end--; } for (; bytes < bytes_end; bytes++) { if (bytes[0] != 0xFF) return FALSE; } for (mask = 0x80; n_bits > 0; n_bits--, mask >>= 1) { if (bytes[0] & mask) continue; return FALSE; } return TRUE; } static int a2cf_piece_lack (UgetA2cfPiece* piece, uint32_t* beg, uint32_t* end) { uint32_t bit_beg, bit_end; uint32_t bit_limit; // bit_limit = (piece->length / 16384) + ((piece->length % 16384) ? 1 : 0); bit_limit = (piece->length >> 14) + ((piece->length & 16383) ? 1 : 0); // bit_beg = beg[0] / 16384; bit_beg = beg[0] >> 14; if (find_bit0 (piece->bitfield, piece->bitfield_len, &bit_beg) == FALSE) return FALSE; if (bit_beg >= bit_limit) return FALSE; // beg[0] = bit_beg * 16384; beg[0] = bit_beg << 14; bit_end = bit_beg + 1; if (find_bit1 (piece->bitfield, piece->bitfield_len, &bit_end) == FALSE) end[0] = piece->length; else { if (bit_end >= bit_limit) end[0] = piece->length; else end[0] = bit_end << 14; // end[0] = bit_end * 16384; } return TRUE; } static uint64_t a2cf_piece_completed (UgetA2cfPiece* piece) { uint32_t bit_beg; uint32_t bit_limit; uint32_t last_bit_len; uint64_t completed; // bit_limit = (piece->length / 16384) + ((piece->length % 16384) ? 1 : 0); bit_limit = (piece->length >> 14) + ((piece->length & 16383) ? 1 : 0); bit_beg = 0; completed = 0; while (find_bit1 (piece->bitfield, piece->bitfield_len, &bit_beg)) { if (bit_beg >= bit_limit) break; if (bit_beg == bit_limit - 1) { last_bit_len = piece->length & 16383; if (last_bit_len) { completed += last_bit_len; break; } } completed += 16384; bit_beg++; } return completed; } // ---------------------------------------------------------------------------- static const uint64_t size_piece[14] = { (uint64_t) 1 * 8 * 16384, // index, shift = 0 (uint64_t) 2 * 8 * 16384, (uint64_t) 4 * 8 * 16384, (uint64_t) 8 * 8 * 16384, // index, shift = 3, 20 [default] (uint64_t) 16 * 8 * 16384, (uint64_t) 32 * 8 * 16384, (uint64_t) 64 * 8 * 16384, // index, shift = 6, 23 (uint64_t) 128 * 8 * 16384, (uint64_t) 256 * 8 * 16384, (uint64_t) 512 * 8 * 16384, // index, shift = 9, 26 (uint64_t) 1024 * 8 * 16384, (uint64_t) 2048 * 8 * 16384, (uint64_t) 4096 * 8 * 16384, // index, shift = 12, 29 (uint64_t) 8192 * 8 * 16384, }; void uget_a2cf_init (UgetA2cf* a2cf, uint64_t size) { int index; uint64_t piece_size; memset (a2cf, 0, sizeof (UgetA2cf)); a2cf->ver = 1; a2cf->total_len = size; // piece size for (index = 0; index < 14; index++) { piece_size = size_piece[index]; if (index < 3) { if (size < piece_size) break; } else if (size < piece_size * UINT32_MAX) break; } // a2cf->piece_len = (uint32_t) (8 * 16384) << index; a2cf->piece_len = (uint32_t) 1 << (3 + 14 + index); // a2cf->bitfield_len = (uint32_t)(size / (8 * a2cf->piece_len)) // a2cf->bitfield_len += (uint32_t)(size % (8 * a2cf->piece_len)) ? 1 : 0; a2cf->bitfield_len = (uint32_t)(size >> (3+3+14+index)); a2cf->bitfield_len += (uint32_t)(size & (8*a2cf->piece_len-1)) ? 1 : 0; a2cf->bitfield = (uint8_t*) ug_malloc0 (a2cf->bitfield_len); // piece // a2cf->piece.index_end = (uint32_t) (size / a2cf->piece_len); // a2cf->piece.index_end += (uint32_t) (size % a2cf->piece_len) ? 1 : 0; a2cf->piece.index_end = (uint32_t) (size >> (3+14+index)); a2cf->piece.index_end += (uint32_t) (size & (a2cf->piece_len-1)) ? 1 : 0; ug_list_init (&a2cf->piece.list); } void uget_a2cf_clear (UgetA2cf* a2cf) { ug_free (a2cf->info_hash); ug_free (a2cf->bitfield); a2cf->info_hash = NULL; a2cf->bitfield = NULL; a2cf->info_hash_len = 0; a2cf->bitfield_len = 0; // piece ug_list_foreach (&a2cf->piece.list, (UgForeachFunc) ug_free, NULL); ug_list_clear (&a2cf->piece.list, FALSE); } int uget_a2cf_load (UgetA2cf* a2cf, const char* filename) { UgetA2cfPiece* piece; FILE* file; uint32_t index; uint32_t n_pieces; uint32_t bitfield_len; init_endian_type (); file = ug_fopen (filename, "rb"); if (file == NULL) return FALSE; // version ug_fread (file, (char*)&a2cf->ver, 2); ug_fread (file, (char*)&a2cf->ext, 4); a2cf->ver = uint16_from_be (a2cf->ver); a2cf->ext = uint32_from_be (a2cf->ext); // check file version - uGet only support version 1 if (a2cf->ver != 1) goto failed; // info hash a2cf->info_hash_len = 0; ug_fread (file, (char*)&a2cf->info_hash_len, 4); a2cf->info_hash_len = uint32_from_be (a2cf->info_hash_len); if (a2cf->info_hash_len > INFO_HASH_LEN_MAX) goto failed; else if (a2cf->info_hash_len == 0) a2cf->info_hash = NULL; else { a2cf->info_hash = ug_malloc (a2cf->info_hash_len); ug_fread (file, a2cf->info_hash, a2cf->info_hash_len); } ug_fread (file, (char*)&a2cf->piece_len, 4); ug_fread (file, (char*)&a2cf->total_len, 8); ug_fread (file, (char*)&a2cf->upload_len, 8); a2cf->piece_len = uint32_from_be (a2cf->piece_len); a2cf->total_len = uint64_from_be (a2cf->total_len); a2cf->upload_len = uint64_from_be (a2cf->upload_len); // bitfield if (ug_fread (file, (char*)&a2cf->bitfield_len, 4) != 4) goto failed; a2cf->bitfield_len = uint32_from_be (a2cf->bitfield_len); // check bitfield_len bitfield_len = (uint32_t)(a2cf->total_len / (8 * a2cf->piece_len)); bitfield_len += (uint32_t)(a2cf->total_len % (8 * a2cf->piece_len)) ? 1 : 0; if (a2cf->bitfield_len == 0 || a2cf->bitfield_len != bitfield_len) { a2cf->bitfield = NULL; goto failed; } else { a2cf->bitfield = ug_malloc (a2cf->bitfield_len); if (ug_fread (file, a2cf->bitfield, a2cf->bitfield_len) != a2cf->bitfield_len) goto failed; } // The number of in-flight pieces. n_pieces = 0; ug_fread (file, (char*)&n_pieces, 4); n_pieces = uint32_from_be (n_pieces); // piece.index_end - calculate number of the last piece a2cf->piece.index_end = (uint32_t) (a2cf->total_len / a2cf->piece_len) + ( (a2cf->total_len % a2cf->piece_len) ? 1 : 0 ); // load in-flight pieces for (index = 0; index < n_pieces; index++) { piece = a2cf_piece_new (a2cf->piece_len); if (a2cf_piece_read (piece, file) == FALSE) { ug_free (piece); break; } ug_list_append (&a2cf->piece.list, (UgLink*) piece); } fclose (file); return TRUE; failed: fclose(file); return FALSE; } int uget_a2cf_save (UgetA2cf* a2cf, const char* filename) { UgetA2cfPiece* piece; FILE* file; uint32_t n_pieces; union { union un_int16 value16; union un_int32 value32; union un_int64 value64; } temp; init_endian_type (); // try to update existing file. file = ug_fopen (filename, "rb+"); if (file == NULL) file = ug_fopen (filename, "wb"); if (file == NULL) return FALSE; temp.value16.integer = uint16_to_be (a2cf->ver); ug_fwrite (file, temp.value16.bytes, 2); temp.value32.integer = uint32_to_be (a2cf->ext); ug_fwrite (file, temp.value32.bytes, 4); temp.value32.integer = uint32_to_be (a2cf->info_hash_len); ug_fwrite (file, temp.value32.bytes, 4); if (a2cf->info_hash) ug_fwrite (file, a2cf->info_hash, a2cf->info_hash_len); temp.value32.integer = uint32_to_be (a2cf->piece_len); ug_fwrite (file, temp.value32.bytes, 4); temp.value64.integer = uint64_to_be (a2cf->total_len); ug_fwrite (file, temp.value64.bytes, 8); temp.value64.integer = uint64_to_be (a2cf->upload_len); ug_fwrite (file, temp.value64.bytes, 8); temp.value32.integer = uint32_to_be (a2cf->bitfield_len); ug_fwrite (file, temp.value32.bytes, 4); if (a2cf->bitfield_len) ug_fwrite (file, a2cf->bitfield, a2cf->bitfield_len); n_pieces = a2cf->piece.list.size; temp.value32.integer = uint32_to_be (n_pieces); ug_fwrite (file, temp.value32.bytes, 4); for (piece = (void*)a2cf->piece.list.head; piece; piece = piece->next) a2cf_piece_write (piece, file); #ifndef __ANDROID__ // ug_ftruncate (file, ug_ftell (file)); // for updating existing file. #endif fclose (file); return TRUE; } int uget_a2cf_lack (UgetA2cf* a2cf, uint64_t* beg, uint64_t* end) { UgetA2cfPiece* piece; uint32_t index; uint32_t piece_beg; uint32_t piece_end; // check if (beg[0] == a2cf->total_len) return FALSE; index = (uint32_t) (beg[0] / a2cf->piece_len); piece_beg = (uint32_t) (beg[0] % a2cf->piece_len); // find begin for (; index < a2cf->piece.index_end; index++) { // test a2cf->bitfield if (test_bit (a2cf->bitfield, index) == TRUE) { piece_beg = 0; continue; } // find begin in piece piece = uget_a2cf_find (a2cf, index); if (piece) { if (a2cf_piece_lack (piece, &piece_beg, &piece_end)) { if (piece_end != piece->length) { beg[0] = (uint64_t)index * a2cf->piece_len; end[0] = beg[0] + piece_end; beg[0] = beg[0] + piece_beg; return TRUE; } } else { piece_beg = 0; continue; } } beg[0] = (uint64_t)index * a2cf->piece_len + piece_beg; // if current piece is the last piece if (index == a2cf->piece.index_end - 1) { end[0] = a2cf->total_len; return TRUE; } break; } if (index >= a2cf->piece.index_end) return FALSE; // find end for (index += 1; index < a2cf->piece.index_end; index++) { // test a2cf->bitfield if (test_bit (a2cf->bitfield, index) == TRUE) { end[0] = (uint64_t)index * a2cf->piece_len; return TRUE; } // find end in piece piece = uget_a2cf_find (a2cf, index); if (piece) { piece_beg = 0; piece_end = piece->length; a2cf_piece_lack (piece, &piece_beg, &piece_end); if (piece_beg != 0) { end[0] = (uint64_t)index * a2cf->piece_len; return TRUE; } if (piece_end != piece->length) { end[0] = (uint64_t)index * a2cf->piece_len + piece_end; return TRUE; } } } end[0] = a2cf->total_len; return TRUE; } static void uget_a2cf_fill_piece (UgetA2cf* a2cf, uint32_t index, uint32_t beg, uint32_t end) { UgetA2cfPiece* piece; uint32_t bit_beg, bit_end; if (test_bit (a2cf->bitfield, index) == FALSE) { if (beg == end) return; piece = uget_a2cf_realloc (a2cf, index); if (end == 0) end = piece->length; // bit_beg = beg / 16384; bit_beg = beg >> 14; bit_end = end >> 14; // piece->bitfield_len * 8 == piece->bitfield_len << 3 if (piece->length == end) { // if (piece->length & (16384-1)) if (piece->length & 16383) bit_end++; } fill_bits (piece->bitfield, bit_beg, bit_end - bit_beg); if (a2cf_piece_filled (piece)) { set_bit (a2cf->bitfield, index); // delete piece ug_list_remove (&a2cf->piece.list, (UgLink*)piece); ug_free (piece); } } } uint64_t uget_a2cf_fill (UgetA2cf* a2cf, uint64_t beg, uint64_t end) { UgetA2cfPiece* piece; uint32_t index; uint32_t index_beg, index_end; uint32_t piece_beg, piece_end; index_beg = (uint32_t) (beg / a2cf->piece_len); index_end = (uint32_t) (end / a2cf->piece_len); piece_beg = (uint32_t) (beg % a2cf->piece_len); piece_end = (uint32_t) (end % a2cf->piece_len); // first piece or only 1 piece if (index_beg == index_end) { uget_a2cf_fill_piece (a2cf, index_beg, piece_beg, piece_end); goto exit; } else if (piece_beg > 0) { uget_a2cf_fill_piece (a2cf, index_beg, piece_beg, 0); piece_beg = 0; index_beg++; } // last piece if (piece_end > 0) { uget_a2cf_fill_piece (a2cf, index_end, 0, piece_end); // piece_end = 0; } // middle for (index = index_beg; index < index_end; index++) { if (test_bit (a2cf->bitfield, index) == TRUE) continue; // delete piece piece = uget_a2cf_find (a2cf, index); if (piece) { ug_list_remove (&a2cf->piece.list, (UgLink*)piece); ug_free (piece); } } fill_bits (a2cf->bitfield, index_beg, index_end - index_beg); exit: if (end == a2cf->total_len) return end; return end & ~16383; } uint64_t uget_a2cf_completed (UgetA2cf* a2cf) { UgetA2cfPiece* piece; uint32_t index; uint32_t last_piece_len; uint64_t completed; completed = 0; piece = (UgetA2cfPiece*) a2cf->piece.list.head; for (index = 0; index < a2cf->piece.index_end; index++) { if (test_bit (a2cf->bitfield, index) == TRUE) { if (index == a2cf->piece.index_end - 1) { last_piece_len = a2cf->total_len % a2cf->piece_len; if (last_piece_len) { completed += last_piece_len; break; } } completed += a2cf->piece_len; continue; } if (piece && piece->index == index) { completed += a2cf_piece_completed (piece); piece = piece->next; } } return completed; } void uget_a2cf_insert (UgetA2cf* a2cf, UgetA2cfPiece* newpiece) { UgetA2cfPiece* piece; if (a2cf->piece.list.head == NULL) { ug_list_prepend (&a2cf->piece.list, (UgLink*)newpiece); return; } for (piece = (void*)a2cf->piece.list.head; piece; piece = piece->next) { if (piece->index > newpiece->index) { ug_list_insert (&a2cf->piece.list, (void*)piece, (void*)newpiece); return; } } ug_list_append (&a2cf->piece.list, (void*)newpiece); } UgetA2cfPiece* uget_a2cf_find (UgetA2cf* a2cf, uint32_t piece_index) { UgetA2cfPiece* piece; for (piece = (void*)a2cf->piece.list.head; piece; piece = piece->next) { if (piece->index == piece_index) return piece; else if (piece->index > piece_index) return NULL; } return NULL; } UgetA2cfPiece* uget_a2cf_realloc (UgetA2cf* a2cf, uint32_t piece_index) { UgetA2cfPiece* piece; piece = uget_a2cf_find (a2cf, piece_index); if (piece == NULL) { piece = a2cf_piece_new (a2cf->piece_len); piece->index = piece_index; if (piece_index == a2cf->piece.index_end - 1) a2cf_piece_truncate (piece, a2cf->total_len % a2cf->piece_len); uget_a2cf_insert (a2cf, piece); } return piece; } // ---------------------------------------------------------------------------- // beg_bit: [in, out] static int find_bit0 (uint8_t* bytes_beg, uint32_t bytes_len, uint32_t* beg_bit) { int counts; uint8_t* bytes; uint8_t* bytes_end; uint8_t mask; bytes_end = bytes_beg + bytes_len; bytes = bytes_beg + (beg_bit[0] >> 3); counts = beg_bit[0] & 7; if (bytes >= bytes_end) return FALSE; if (counts != 0) { for (mask = 0x80 >> counts; counts < 8; counts++, mask >>= 1) { if ((bytes[0] & mask) == 0) { beg_bit[0] = ((bytes - bytes_beg) << 3) + counts; return TRUE; } } bytes++; } for (; bytes < bytes_end; bytes++) { if (bytes[0] != 0xFF) break; } if (bytes < bytes_end) { for (mask = 0x80, counts = 0; counts < 8; counts++, mask >>= 1) { if ((bytes[0] & mask) == 0) { beg_bit[0] = ((bytes - bytes_beg) << 3) + counts; return TRUE; } } } return FALSE; } // beg_bit: [in, out] static int find_bit1 (uint8_t* bytes_beg, uint32_t bytes_len, uint32_t* beg_bit) { int counts; uint8_t* bytes; uint8_t* bytes_end; uint8_t mask; bytes_end = bytes_beg + bytes_len; bytes = bytes_beg + (beg_bit[0] >> 3); counts = beg_bit[0] & 7; if (bytes >= bytes_end) return FALSE; if (counts != 0) { for (mask = 0x80 >> counts; counts < 8; counts++, mask >>= 1) { if (bytes[0] & mask) { beg_bit[0] = ((bytes - bytes_beg) << 3) + counts; return TRUE; } } bytes++; } for (; bytes < bytes_end; bytes++) { if (bytes[0] != 0) break; } if (bytes < bytes_end) { for (mask = 0x80, counts = 0; counts < 8; counts++, mask >>= 1) { if (bytes[0] & mask) { beg_bit[0] = ((bytes - bytes_beg) << 3) + counts; return TRUE; } } } return FALSE; } static void set_bit (uint8_t* bytes, uint32_t nth_bit) { uint8_t cur_bit; // bytes += nth_bit / 8; bytes += nth_bit >> 3; // nth_bit_beg = beg % 8; cur_bit = nth_bit & 7; bytes[0] |= (0x80 >> cur_bit); } static int test_bit (uint8_t* bytes, uint32_t nth_bit) { uint8_t cur_bit; // bytes += nth_bit / 8; bytes += nth_bit >> 3; // cur_bit = nth_bit % 8; cur_bit = nth_bit & 7; if (bytes[0] & (0x80 >> cur_bit)) return TRUE; else return FALSE; } static void fill_bits (uint8_t* bytes, uint32_t nth_bit, uint32_t n_bits) { uint8_t mask; uint8_t counts; // bytes += nth_bit / 8; bytes += nth_bit >> 3; // nth_bit %= 8; nth_bit &= 7; if (nth_bit != 0) { mask = 0x80; if (nth_bit + n_bits >= 8) counts = 8 - nth_bit; else counts = n_bits; for (mask >>= nth_bit; counts > 0; counts--, mask >>= 1) { bytes[0] |= mask; nth_bit++; n_bits--; } bytes++; } for (; n_bits >= 8; n_bits -= 8) *bytes++ = 0xFF; for (mask = 0x80; n_bits > 0; n_bits--, mask >>= 1) bytes[0] |= mask; } uget-2.2.2/uget/UgetRpc.c0000664000175000017500000003556613470304403012102 00000000000000/* * * Copyright (C) 2015-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include // srand() #include // time() #include #include #include #include #include #include #define UGET_RPC_PORT "14777" #define UGET_RPC_ADDR "127.0.0.1" //#define UGET_RPC_NAME "RPC-socket" //#define UGET_RPC_NAME_ABS "com.ugetdm.uget" //#define UGET_RPC_LIMIT 50 static void uget_rpc_on_destroy (void* data); static void on_accepted (UgJsonrpc* jrpc, UgetRpc* urpc, void* data); static void set_invalid_request (UgJsonrpcObject* jobj); static void backup_data_file (UgetOptionValue* uoval, const char* dir); UgetRpc* uget_rpc_new (const char* backup_dir) { UgetRpc* urpc; #if defined _WIN32 || defined _WIN64 WSADATA WSAData; WSAStartup (MAKEWORD (2, 2), &WSAData); #endif urpc = ug_malloc (sizeof (UgetRpc)); ug_jsonrpc_socket_init ((UgJsonrpcSocket*) urpc); urpc->server = NULL; ug_jsonrpc_object_init (&urpc->jobject); ug_jsonrpc_array_init (&urpc->jarray, 8); ug_option_init (&urpc->option); ug_list_init (&urpc->queue); ug_mutex_init (&urpc->queue_lock); if (backup_dir) urpc->backup_dir = ug_strdup (backup_dir); else urpc->backup_dir = NULL; #ifdef USE_UNIX_DOMAIN_SOCKET urpc->socket_path = NULL; urpc->socket_path_len = 0; #endif return urpc; } void uget_rpc_free (UgetRpc* urpc) { if (urpc->server == NULL) uget_rpc_on_destroy (urpc); else { ug_socket_server_stop (urpc->server); ug_socket_server_unref (urpc->server); } } #ifdef USE_UNIX_DOMAIN_SOCKET void uget_rpc_use_unix_socket (UgetRpc* urpc, const char* path, int path_len) { if (path_len > 0 && path[0] == 0) { // for Linux abstract socket urpc->socket_path = ug_malloc (path_len); memcpy (urpc->socket_path, path, path_len); } else { // for unix domain socket if (path_len == -1) path_len = strlen (path); urpc->socket_path = ug_strndup (path, path_len); } urpc->socket_path_len = path_len; } #endif // USE_UNIX_DOMAIN_SOCKET static void uget_rpc_on_destroy (void* data) { UgetRpc* urpc = (UgetRpc*) data; #if defined _WIN32 || defined _WIN64 WSACleanup (); #endif ug_jsonrpc_socket_final ((UgJsonrpcSocket*) urpc); ug_jsonrpc_object_clear (&urpc->jobject); ug_jsonrpc_array_clear (&urpc->jarray, TRUE); ug_option_final (&urpc->option); ug_list_foreach (&urpc->queue, (UgForeachFunc) uget_rpc_cmd_free, NULL); // ug_list_clear (&urpc->queue, FALSE); ug_mutex_clear (&urpc->queue_lock); #ifdef USE_UNIX_DOMAIN_SOCKET // Don't delete file if path is abstract socket names (begin with 0) if (urpc->server && urpc->socket_path[0]) ug_unlink (urpc->socket_path); ug_free (urpc->socket_path); #endif ug_free (urpc->backup_dir); ug_free (urpc); } int uget_rpc_do_request (UgetRpc* urpc, UgJsonrpcObject* jobj) { UgValueArray* array; UgetRpcReq* req; UgetRpcCmd* cmd; UgLink* urilink; const char* method; int index; if (jobj->method_static) method = jobj->method_static; else method = jobj->method; if (method == NULL) { set_invalid_request (jobj); return FALSE; } if (strcmp (method, "uget.present") == 0) { req = uget_rpc_req_new (); req->method_id = UGET_RPC_PRESENT; // add to queue ug_mutex_lock (&urpc->queue_lock); ug_list_append (&urpc->queue, (UgLink*) req); ug_mutex_unlock (&urpc->queue_lock); // response OK // {"jsonrpc": "2.0", "result": true, "id": 1} ug_jsonrpc_object_clear_request (jobj); jobj->result.type = UG_VALUE_BOOL; jobj->result.c.boolean = TRUE; return TRUE; } else if (strcmp (method, "uget.sendCommand") == 0) { if (jobj->params.type != UG_VALUE_ARRAY) { set_invalid_request (jobj); return FALSE; } // parse params cmd = uget_rpc_cmd_new (); ug_option_clear (&urpc->option); ug_option_set_parser (&urpc->option, ug_option_parse_entry, &cmd->value, uget_option_entry); array = jobj->params.c.array; for (index = 0; index < array->length; index++) ug_option_parse (&urpc->option, array->at[index].c.string, -1); // get URIs from command-line for (index = 0; index < urpc->option.others.length; index++) { urilink = ug_link_new(); urilink->data = urpc->option.others.at[index]; urpc->option.others.at[index] = NULL; ug_list_append (&cmd->uris, urilink); } // get URIs from text file if (cmd->value.input_file) ug_file_get_lines (cmd->value.input_file, &cmd->uris); // check arguments if (cmd->uris.size == 0 && uget_option_value_has_ctrl (&cmd->value)) { set_invalid_request (jobj); if (cmd->uris.size == 0) { jobj->error.data.type = UG_VALUE_STRING; jobj->error.data.c.string = ug_strdup ("No URIs"); } uget_rpc_cmd_free (cmd); return FALSE; } // backup cookie and post file if (urpc->backup_dir) backup_data_file (&cmd->value, urpc->backup_dir); // add to queue ug_mutex_lock (&urpc->queue_lock); ug_list_append (&urpc->queue, (UgLink*) cmd); ug_mutex_unlock (&urpc->queue_lock); // response OK // {"jsonrpc": "2.0", "result": true, "id": 1} ug_jsonrpc_object_clear_request (jobj); jobj->result.type = UG_VALUE_BOOL; jobj->result.c.boolean = TRUE; return TRUE; } // {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"} ug_jsonrpc_object_clear_request (jobj); ug_free (jobj->error.message); jobj->error.code = -32601; jobj->error.message = ug_strdup ("Method not found"); return FALSE; } void uget_rpc_send_command (UgetRpc* urpc, int argc, char** argv) { UgJsonrpcObject* jobj; UgJsonrpcObject* jres; UgValue* value; int index; if (argc == 0) { if (urpc->server == NULL) uget_rpc_present (urpc); return; } jobj = ug_jsonrpc_object_new (); jobj->method_static = "uget.sendCommand"; ug_value_init_array (&jobj->params, argc); value = ug_value_alloc (&jobj->params, argc); for (index = 0; index < argc; index++, value++) { // value->name = NULL; value->type = UG_VALUE_STRING; #if (defined _WIN32 || defined _WIN64) && defined HAVE_GLIB if (argv[index] && g_utf8_validate (argv[index], -1, NULL) == FALSE) { value->c.string = g_locale_to_utf8 (argv[index], -1, NULL, NULL, NULL); } else #endif // (_WIN32 || _WIN64) && HAVE_GLIB value->c.string = ug_strdup (argv[index]); // replace invalid characters \/:*?"<>| by _ in filename. if (strncmp (value->c.string, "--filename=", 11) == 0) ug_str_replace_chars (value->c.string +11, "\\/:*?\"<>|", '_'); } if (urpc->server) uget_rpc_do_request (urpc, jobj); else { jres = ug_jsonrpc_object_new (); #ifdef USE_UNIX_DOMAIN_SOCKET if (urpc->socket_path) { ug_jsonrpc_socket_connect_unix ((UgJsonrpcSocket*) urpc, urpc->socket_path, urpc->socket_path_len); } else #endif ug_jsonrpc_socket_connect ((UgJsonrpcSocket*) urpc, UGET_RPC_ADDR, UGET_RPC_PORT); ug_jsonrpc_call (&urpc->rpc, jobj, jres); ug_jsonrpc_object_free (jres); } ug_jsonrpc_object_free (jobj); } void uget_rpc_present (UgetRpc* urpc) { UgJsonrpcObject* jobj; UgJsonrpcObject* jres; jobj = ug_jsonrpc_object_new (); jobj->method_static = "uget.present"; if (urpc->server) uget_rpc_do_request (urpc, jobj); else { jres = ug_jsonrpc_object_new (); #ifdef USE_UNIX_DOMAIN_SOCKET if (urpc->socket_path) { ug_jsonrpc_socket_connect_unix ((UgJsonrpcSocket*) urpc, urpc->socket_path, urpc->socket_path_len); } else #endif ug_jsonrpc_socket_connect ((UgJsonrpcSocket*) urpc, UGET_RPC_ADDR, UGET_RPC_PORT); ug_jsonrpc_call (&urpc->rpc, jobj, jres); ug_jsonrpc_object_free (jres); } ug_jsonrpc_object_free (jobj); } int uget_rpc_start_server (UgetRpc* urpc, int detect_server) { SOCKET fd; int result; int in_progress = FALSE; int opt_value; socklen_t opt_length; fd_set fdset; struct timeval timeout; if (urpc->server) { ug_socket_server_start (urpc->server); return TRUE; } // detect server if (detect_server) { #ifdef USE_UNIX_DOMAIN_SOCKET if (urpc->socket_path) { fd = socket (AF_UNIX, SOCK_STREAM, 0); ug_socket_set_blocking (fd, FALSE); result = ug_socket_connect_unix (fd, urpc->socket_path, urpc->socket_path_len); if (errno == EINPROGRESS) in_progress = TRUE; } else #endif // USE_UNIX_DOMAIN_SOCKET { fd = socket (AF_INET, SOCK_STREAM, 0); ug_socket_set_blocking (fd, FALSE); result = ug_socket_connect (fd, UGET_RPC_ADDR, UGET_RPC_PORT); #if (defined _WIN32 || defined _WIN64) if (WSAGetLastError() == WSAEWOULDBLOCK) in_progress = TRUE; #else if (errno == EINPROGRESS) in_progress = TRUE; #endif } // connect with timeout (non-blocking) if (result < 0 && in_progress) { FD_ZERO (&fdset); FD_SET (fd, &fdset); timeout.tv_sec = 1; timeout.tv_usec = 0; // select() return 0 if time limit expired. // select() return -1 if error. if (select (fd+1, NULL, &fdset, NULL, &timeout) > 0) { opt_value = 1; opt_length = sizeof (opt_value); getsockopt (fd, SOL_SOCKET, SO_ERROR, (void*)(&opt_value), &opt_length); if (opt_value == 0) result = 0; // connect OK } } closesocket (fd); if (result != -1) { return FALSE; } } // create server #ifdef USE_UNIX_DOMAIN_SOCKET if (urpc->socket_path) { // Don't delete file if path is abstract socket names (begin with 0) if (urpc->socket_path[0]) ug_unlink (urpc->socket_path); urpc->server = ug_socket_server_new_unix (urpc->socket_path, urpc->socket_path_len); } else #endif urpc->server = ug_socket_server_new_addr (UGET_RPC_ADDR, UGET_RPC_PORT); if (urpc->server == NULL) return FALSE; urpc->server->destroy.func = uget_rpc_on_destroy; urpc->server->destroy.data = urpc; ug_jsonrpc_socket_use_server ((UgJsonrpcSocket*) urpc, urpc->server, (UgJsonrpcServerFunc) on_accepted, urpc, NULL); ug_socket_server_start (urpc->server); return TRUE; } void uget_rpc_stop_server (UgetRpc* urpc) { if (urpc->server) ug_socket_server_stop (urpc->server); } int uget_rpc_has_request (UgetRpc* urpc) { if (urpc->queue.head) return TRUE; else return FALSE; } UgetRpcReq* uget_rpc_get_request (UgetRpc* urpc) { UgetRpcReq* link; ug_mutex_lock (&urpc->queue_lock); link = (UgetRpcReq*) urpc->queue.head; if (link) ug_list_remove (&urpc->queue, (UgLink*) link); ug_mutex_unlock (&urpc->queue_lock); return link; } static void on_accepted (UgJsonrpc* jrpc, UgetRpc* urpc, void* data) { UgJsonrpcObject* jobj; UgJsonType type; int index; type = ug_jsonrpc_receive (jrpc, &urpc->jobject, &urpc->jarray); if (type == UG_JSON_OBJECT) { uget_rpc_do_request (urpc, &urpc->jobject); if (urpc->jobject.id.type != UG_VALUE_NONE) ug_jsonrpc_response (jrpc, &urpc->jobject); ug_jsonrpc_object_clear (&urpc->jobject); } else if (type == UG_JSON_ARRAY) { for (index = 0; index < urpc->jarray.length; index++) { jobj = urpc->jarray.at[index]; uget_rpc_do_request (urpc, jobj); if (jobj->id.type == UG_VALUE_NONE && jobj->error.code == 0) { ug_jsonrpc_object_free (jobj); urpc->jarray.at[index] = NULL; } } ug_jsonrpc_response_batch (jrpc, &urpc->jarray); ug_jsonrpc_array_clear (&urpc->jarray, TRUE); } } static void set_invalid_request (UgJsonrpcObject* jobj) { // {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null} ug_jsonrpc_object_clear_request (jobj); ug_free (jobj->error.message); jobj->error.code = -32600; jobj->error.message = ug_strdup ("Invalid Request"); } static void backup_data_file (UgetOptionValue* uoval, const char* dir) { int num; char* fpath; srand ((unsigned int) time(NULL)); num = rand (); // backup cookie file if (uoval->http.cookie_file) { fpath = ug_strdup_printf ("%s" UG_DIR_SEPARATOR_S "%X.cookie", dir, num); if (ug_file_copy (uoval->http.cookie_file, fpath) == -1) ug_free (fpath); else { ug_free (uoval->http.cookie_file); uoval->http.cookie_file = fpath; fpath = NULL; } } // backup post file if (uoval->http.post_file) { fpath = ug_strdup_printf ("%s" UG_DIR_SEPARATOR_S "%X.post", dir, num); if (ug_file_copy (uoval->http.post_file, fpath) == -1) ug_free (fpath); else { ug_free (uoval->http.post_file); uoval->http.post_file = fpath; fpath = NULL; } } } // ---------------------------------------------------------------------------- // UgetRpcReq UgetRpcReq* uget_rpc_req_new (void) { UgetRpcReq* req; req = ug_malloc0 (sizeof (UgetRpcReq)); req->free = ug_free; return req; } // ---------------------------------------------------------------------------- // UgetRpcCmd UgetRpcCmd* uget_rpc_cmd_new (void) { UgetRpcCmd* cmd; cmd = ug_malloc (sizeof (UgetRpcCmd)); cmd->method_id = UGET_RPC_SEND_COMMAND; cmd->next = NULL; cmd->prev = NULL; cmd->free = (UgDeleteFunc) uget_rpc_cmd_free; uget_option_value_init (&cmd->value); ug_list_init (&cmd->uris); return cmd; } void uget_rpc_cmd_free (UgetRpcCmd* urcmd) { UgLink* urilink; uget_option_value_clear (&urcmd->value); for (urilink = urcmd->uris.head; urilink; urilink = urilink->next) ug_free (urilink->data); ug_list_clear (&urcmd->uris, TRUE); ug_free (urcmd); } uget-2.2.2/uget/UgetAria2.c0000664000175000017500000005146013470304402012302 00000000000000/* * * Copyright (C) 2011-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #include // ShellExecuteW() #else #include // fork(), execlp() #include #include #endif // _WIN32 || _WIN64 #define RPC_URI "http://localhost:6800/jsonrpc" #define RPC_BATCH_LEN 5 #define RPC_INTERVAL 500 #define ARIA2_PATH "aria2c" #define ARIA2_ARGS "--enable-rpc=true -D --check-certificate=false" #if defined _WIN32 || defined _WIN64 #define ug_sleep Sleep #else #define ug_sleep(millisecond) usleep (millisecond * 1000) #endif #ifdef _MSC_VER #define strcasecmp stricmp #define strncasecmp strnicmp #endif // ---------------------------------------------------------------------------- // UgetAria2Thread struct UgetAria2Thread { UgThread thread; UgetAria2* uaria2; UgJsonrpcArray queuing; UgJsonrpcArray request; UgJsonrpcArray response; UgJsonrpcCurl json; int finalized; }; static UgThreadResult uget_aria2_thread (UgetAria2Thread* uathread); static UgetAria2Thread* uget_aria2_thread_new (UgetAria2* uaria2) { UgetAria2Thread* uat; UgThread thread; uat = ug_malloc (sizeof (UgetAria2Thread)); uat->uaria2 = uaria2; ug_jsonrpc_array_init (&uat->queuing, 16); ug_jsonrpc_array_init (&uat->request, 16); ug_jsonrpc_array_init (&uat->response, 16); ug_jsonrpc_curl_init (&uat->json); ug_jsonrpc_curl_set_url (&uat->json, uaria2->uri); uat->finalized = FALSE; uget_aria2_ref (uaria2); ug_thread_create (&thread, (UgThreadFunc) uget_aria2_thread, uat); ug_thread_unjoin (&thread); return uat; } static void uget_aria2_thread_free (UgetAria2Thread* uat) { ug_jsonrpc_array_clear (&uat->queuing, TRUE); ug_jsonrpc_array_clear (&uat->request, TRUE); ug_jsonrpc_array_clear (&uat->response, TRUE); ug_jsonrpc_curl_final (&uat->json); ug_free (uat); } static int uget_aria2_thread_queuing (UgetAria2Thread* uathread) { UgetAria2* uaria2; int length; int index; index = 0; uaria2 = uathread->uaria2; length = uathread->queuing.length; ug_mutex_lock (&uaria2->mutex); ug_array_alloc (&uathread->queuing, uaria2->queuing.length); while (index < uaria2->queuing.length) uathread->queuing.at[length++] = uaria2->queuing.at[index++]; uaria2->queuing.length = 0; ug_mutex_unlock (&uaria2->mutex); return length; } static void uget_aria2_match_response (UgetAria2Thread* uathread) { UgetAria2* uaria2; UgJsonrpcObject* req; UgJsonrpcObject* res; int length; int index_req, index_res; uaria2 = uathread->uaria2; length = uathread->request.length; for (index_req = 0; index_req < length; index_req++) { req = uathread->request.at[index_req]; res = ug_jsonrpc_array_find (&uathread->response, &req->id, &index_res); if (res) uathread->response.at[index_res] = NULL; uathread->request.at[index_req] = NULL; if (req->id.type == UG_VALUE_NONE) { uget_aria2_recycle (uaria2, req); uget_aria2_recycle (uaria2, res); } else { ug_mutex_lock (&uaria2->completed_mutex); ug_slinks_add (&uaria2->requested, req); ug_slinks_add (&uaria2->responsed, res); ug_mutex_unlock (&uaria2->completed_mutex); } } uathread->request.length = 0; uaria2->completed_changed++; length = uathread->response.length; for (index_res = 0; index_res < length; index_res++) { res = uathread->response.at[index_res]; if (res) uget_aria2_recycle (uaria2, res); } uathread->response.length = 0; } static int uget_aria2_thread_request (UgetAria2Thread* uathread) { UgJsonrpcObject* ujobj; UgetAria2* uaria2; int index; int length; int limit; int counts; uaria2 = uathread->uaria2; limit = uaria2->batch_len + uaria2->batch_additional; for (index = 0; index < uathread->queuing.length; index++) { length = uathread->queuing.length - index; if (length > limit) length = limit; ug_array_alloc (&uathread->request, length); for (counts = 0; counts < length; counts++) { ujobj = uathread->queuing.at[index++]; uathread->request.at[counts] = ujobj; if (ujobj->id.type != UG_VALUE_NONE) { ujobj = uget_aria2_alloc (uaria2, FALSE, FALSE); *(void**) ug_array_alloc (&uathread->response, 1) = ujobj; } } // JSON-RPC counts = ug_jsonrpc_call_batch (&uathread->json.rpc, &uathread->request, &uathread->response); if (counts == -1) { uaria2->error = TRUE; uaria2->connect_fail = TRUE; } uget_aria2_match_response (uathread); } uathread->queuing.length = 0; return index; } static UgJsonrpcObject* add_limit_request (UgetAria2* uaria2) { UgJsonrpcObject* jobj; UgValue* vobj; UgValue* value; jobj = uget_aria2_alloc (uaria2, TRUE, TRUE); jobj->method_static = "aria2.changeGlobalOption"; if (jobj->params.type == UG_VALUE_NONE) ug_value_init_array (&jobj->params, 2); vobj = ug_value_alloc (&jobj->params, 1); ug_value_init_object (vobj, 2); value = ug_value_alloc (vobj, 1); value->name = "max-overall-download-limit"; value->type = UG_VALUE_STRING; value->c.string = ug_strdup_printf ("%dK", uaria2->limit.download / 1024); value = ug_value_alloc (vobj, 1); value->name = "max-overall-upload-limit"; value->type = UG_VALUE_STRING; value->c.string = ug_strdup_printf ("%dK", uaria2->limit.upload / 1024); // max-concurrent-downloads must >= 1 // value = ug_value_alloc (vobj, 1); // value->name = "max-concurrent-downloads"; // value->type = UG_VALUE_STRING; // value->c.string = ug_strdup_printf ("%u", uaria2->limit.connections); uget_aria2_request (uaria2, jobj); return jobj; } static void recycle_limit_request (UgetAria2* uaria2, UgJsonrpcObject* jreq) { UgJsonrpcObject* jres; jres = uget_aria2_respond (uaria2, jreq); ug_value_foreach (&jreq->params, ug_value_set_name, NULL); uget_aria2_recycle (uaria2, jreq); uget_aria2_recycle (uaria2, jres); } static UgJsonrpcObject* add_speed_request (UgetAria2* uaria2) { UgJsonrpcObject* jobj; jobj = uget_aria2_alloc (uaria2, TRUE, TRUE); jobj->method_static = "aria2.getGlobalStat"; uget_aria2_request (uaria2, jobj); return jobj; } static void recycle_speed_request (UgetAria2* uaria2, UgJsonrpcObject* jreq) { UgJsonrpcObject* jres; UgValue* value; jres = uget_aria2_respond (uaria2, jreq); if (jres && jres->error.code == 0) { ug_value_sort_name (&jres->result); value = ug_value_find_name (&jres->result, "downloadSpeed"); uaria2->speed.download = ug_value_get_int (value); value = ug_value_find_name (&jres->result, "uploadSpeed"); uaria2->speed.upload = ug_value_get_int (value); } uget_aria2_recycle (uaria2, jreq); uget_aria2_recycle (uaria2, jres); } static UgThreadResult uget_aria2_thread (UgetAria2Thread* uathread) { UgetAria2* uaria2; UgJsonrpcObject* jreq = NULL; UgJsonrpcObject* jobj = NULL; UgJsonrpcObject* jreq_shutdown = NULL; int counts; uaria2 = uathread->uaria2; // temp.index = ug_jsonrpc_array_find_ptr (uaria2); for (counts = 0; ; counts++) { // finalize if (uathread->finalized == TRUE) { // shutdown request if (uaria2->shutdown && jreq_shutdown == NULL) { jreq_shutdown = uget_aria2_alloc (uaria2, TRUE, TRUE); jreq_shutdown->method_static = "aria2.shutdown"; uget_aria2_request (uaria2, jreq_shutdown); } if (uaria2->queuing.length == 0) break; } // URI changed ug_mutex_lock (&uaria2->mutex); if (uaria2->uri_changed) { uaria2->uri_changed = FALSE; ug_jsonrpc_curl_set_url (&uathread->json, uaria2->uri); } ug_mutex_unlock (&uaria2->mutex); // additional request if (uaria2->limit_count_prev != uaria2->limit_count) { uaria2->limit_count_prev = uaria2->limit_count; uaria2->limit_required = TRUE; jreq = add_limit_request (uaria2); uaria2->batch_additional++; } if (uaria2->speed_required && (counts & 2) == 2) { jobj = add_speed_request (uaria2); uaria2->batch_additional++; } // get requests from queue if (uget_aria2_thread_queuing (uathread) == 0) { // default: sleep 0.5 second ug_sleep (uaria2->polling_interval); continue; } // send requests & get responses uget_aria2_thread_request (uathread); // recycle additional request if (uaria2->limit_required) { uaria2->limit_required = FALSE; recycle_limit_request (uaria2, jreq); uaria2->batch_additional--; } if (uaria2->speed_required && (counts & 2) == 2) { recycle_speed_request (uaria2, jobj); uaria2->batch_additional--; } } // shutdown response if (jreq_shutdown) { jobj = uget_aria2_respond (uaria2, jreq_shutdown); uget_aria2_recycle (uaria2, jreq_shutdown); uget_aria2_recycle (uaria2, jobj); } uget_aria2_thread_free (uathread); uget_aria2_unref (uaria2); return UG_THREAD_RESULT; } // ---------------------------------------------------------------------------- // UgetAria2 UgetAria2* uget_aria2_new (void) { UgetAria2* uaria2; UgValue* value; UgValue* keys; #if defined _WIN32 || defined _WIN64 WSADATA WSAData; WSAStartup (MAKEWORD (2, 2), &WSAData); #endif // _WIN32 || _WIN64 curl_global_init (CURL_GLOBAL_ALL); uaria2 = ug_malloc0 (sizeof (UgetAria2)); uaria2->ref_count = 1; uaria2->batch_len = RPC_BATCH_LEN; uaria2->polling_interval = RPC_INTERVAL; uaria2->speed_required = FALSE; uaria2->limit_required = FALSE; uaria2->uri = ug_strdup (RPC_URI); uaria2->path = ug_strdup (ARIA2_PATH); uaria2->args = ug_strdup (ARIA2_ARGS); ug_mutex_init (&uaria2->mutex); ug_mutex_init (&uaria2->completed_mutex); ug_jsonrpc_array_init (&uaria2->queuing, 16); ug_jsonrpc_array_init (&uaria2->recycled, 16); ug_slinks_init (&uaria2->requested, 16); ug_slinks_init (&uaria2->responsed, 16); uaria2->completed_changed = 0; ug_value_init_array (&uaria2->status_keys, 16); keys = &uaria2->status_keys; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "status"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "totalLength"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "completedLength"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "uploadLength"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "downloadSpeed"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "uploadSpeed"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "errorCode"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "files"; value = ug_value_alloc (keys, 1); value->type = UG_VALUE_STRING; value->c.string = "followedBy"; return uaria2; } void uget_aria2_ref (UgetAria2* uaria2) { uaria2->ref_count++; } void uget_aria2_unref (UgetAria2* uaria2) { if (--uaria2->ref_count == 0) { ug_jsonrpc_array_clear (&uaria2->queuing, TRUE); ug_jsonrpc_array_clear (&uaria2->recycled, TRUE); ug_slinks_foreach (&uaria2->requested, (void*)ug_jsonrpc_object_free, NULL); ug_slinks_foreach (&uaria2->responsed, (void*)ug_jsonrpc_object_free, NULL); ug_slinks_final (&uaria2->requested); ug_slinks_final (&uaria2->responsed); ug_value_foreach (&uaria2->status_keys, ug_value_set_string, NULL); ug_value_clear (&uaria2->status_keys); ug_mutex_clear (&uaria2->completed_mutex); ug_mutex_clear (&uaria2->mutex); ug_free (uaria2->uri); ug_free (uaria2->path); ug_free (uaria2->args); ug_free (uaria2); curl_global_cleanup (); #if defined _WIN32 || defined _WIN64 WSACleanup (); #endif // _WIN32 || _WIN64 } } void uget_aria2_start_thread (UgetAria2* uaria2) { if (uaria2->thread == NULL) uaria2->thread = uget_aria2_thread_new (uaria2); } void uget_aria2_stop_thread (UgetAria2* uaria2) { uaria2->thread->finalized = TRUE; uaria2->thread = NULL; } void uget_aria2_set_uri (UgetAria2* uaria2, const char* uri) { UgUri upart; int len; if (strcmp (uaria2->uri, uri) != 0) { ug_uri_init (&upart, uri); uaria2->uri_remote = TRUE; if (upart.host != -1) { len = ug_uri_host (&upart, NULL); // localhost // IPv6 "::1" // IPv4 "127.0.0.1" if (strncmp (uri + upart.host, "::1", len) == 0 || strncmp (uri + upart.host, "127.0.0.1", len) == 0 || strncasecmp (uri + upart.host, "localhost", len) == 0) { uaria2->uri_remote = FALSE; } } ug_mutex_lock (&uaria2->mutex); ug_free (uaria2->uri); uaria2->uri = ug_strdup (uri); uaria2->uri_changed = TRUE; ug_mutex_unlock (&uaria2->mutex); } } void uget_aria2_set_path (UgetAria2* uaria2, const char* path) { // ug_mutex_lock (&uaria2->mutex); ug_free (uaria2->path); uaria2->path = (path) ? ug_strdup (path) : NULL; // ug_mutex_unlock (&uaria2->mutex); } void uget_aria2_set_args (UgetAria2* uaria2, const char* args) { // ug_mutex_lock (&uaria2->mutex); ug_free (uaria2->args); uaria2->args = (args) ? ug_strdup (args) : NULL; // ug_mutex_unlock (&uaria2->mutex); } void uget_aria2_set_token (UgetAria2* uaria2, const char* token) { ug_mutex_lock (&uaria2->mutex); ug_free (uaria2->token); uaria2->token = (token) ? ug_strdup (token) : NULL; ug_mutex_unlock (&uaria2->mutex); } void uget_aria2_set_speed (UgetAria2* uaria2, int dl_speed, int ul_speed) { uaria2->limit.download = dl_speed; uaria2->limit.upload = ul_speed; uaria2->limit_count++; } #ifdef __ANDROID__ #if 1 // __ANDROID__ int uget_aria2_launch (UgetAria2* uaria2) { return uaria2->launched; } #else typedef struct { UgetAria2* uaria2; char cmd[1]; } Aria2LaunchData; static UgThreadResult aria2_launch_thread (Aria2LaunchData* uald) { int result; result = system (uald->cmd); if (result == -1) uald->uaria2->launched = FALSE; else uald->uaria2->launched = TRUE; ug_free (uald); return UG_THREAD_RESULT; } int uget_aria2_launch (UgetAria2* uaria2) { Aria2LaunchData* uald; UgThread thread; uald = ug_malloc (sizeof (Aria2LaunchData) + strlen (uaria2->path) + strlen (uaria2->args) + 1); uald->uaria2 = uaria2; uald->cmd[0] = 0; strcat (uald->cmd, uaria2->path); strcat (uald->cmd, " "); strcat (uald->cmd, uaria2->args); ug_thread_create (&thread, (UgThreadFunc)aria2_launch_thread, uald); ug_thread_unjoin (&thread); return uaria2->launched; } #endif // __ANDROID__ #elif (defined _WIN32 || defined _WIN64) int uget_aria2_launch (UgetAria2* uaria2) { uint16_t* path_utf16; uint16_t* args_utf16; int result; if (uaria2->launched == TRUE) return TRUE; if (uaria2->path == NULL || uaria2->args == NULL) return FALSE; // ug_mutex_lock (&uaria2->mutex); path_utf16 = ug_utf8_to_utf16 (uaria2->path, -1, NULL); args_utf16 = ug_utf8_to_utf16 (uaria2->args, -1, NULL); // ug_mutex_unlock (&uaria2->mutex); result = (int)ShellExecuteW (NULL, L"open", path_utf16, args_utf16, NULL, SW_HIDE); ug_free (args_utf16); ug_free (path_utf16); if (result > 32) { uaria2->launched = TRUE; return TRUE; } else { uaria2->error = UGET_ARIA2_ERROR_LAUNCH; return FALSE; } } #else int uget_aria2_launch (UgetAria2* uaria2) { char** argv; int temp; int execpipe[2]; pid_t pid; if (uaria2->launched == TRUE) return TRUE; if (uaria2->path == NULL || uaria2->args == NULL) return FALSE; argv = ug_argv_from_cmd (uaria2->args, NULL, 1); argv[0] = uaria2->path; pipe (execpipe); // close on exec fcntl (execpipe[1], F_SETFD, fcntl (execpipe[1], F_GETFD) | FD_CLOEXEC); pid = fork(); if (pid == -1) { // fork failed temp = -1; } else if (pid == 0) { // child process, [0] input, [1] output close (execpipe[0]); // on success, never returns execvp (uaria2->path, argv); temp = errno; write (execpipe[1], &temp, sizeof (temp)); // doesn't matter what you exit with exit(0); } else { // parent process, [0] input, [1] output close (execpipe[1]); // if exec failed, read the child's errno value if (read (execpipe[0], &temp, sizeof(temp)) == sizeof(temp)) temp = -1; } ug_argv_free (argv); // parent process if (temp == -1) uaria2->launched = FALSE; else uaria2->launched = TRUE; return uaria2->launched; } #endif // _WIN32 || _WIN64 void uget_aria2_shutdown (UgetAria2* uaria2) { UgJsonrpcObject* jreq; UgJsonrpcObject* jres; jreq = uget_aria2_alloc (uaria2, TRUE, TRUE); jreq->method_static = "aria2.shutdown"; uget_aria2_request (uaria2, jreq); jres = uget_aria2_respond (uaria2, jreq); uget_aria2_recycle (uaria2, jreq); uget_aria2_recycle (uaria2, jres); } UgJsonrpcObject* uget_aria2_alloc (UgetAria2* uaria2, int is_request, int has_response) { UgJsonrpcObject* result; UgValue* rpc_token = NULL; ug_mutex_lock (&uaria2->mutex); if (uaria2->recycled.length == 0) result = ug_jsonrpc_object_new (); else result = uaria2->recycled.at[--uaria2->recycled.length]; ug_mutex_unlock (&uaria2->mutex); // RPC authorization secret token (aria2 v1.18.4) if (is_request) { ug_mutex_lock (&uaria2->mutex); if (uaria2->token) { ug_value_init_array (&result->params, 4); rpc_token = ug_value_alloc (&result->params, 1); rpc_token->type = UG_VALUE_STRING; rpc_token->c.string = ug_malloc (strlen (uaria2->token) + 7); // "token:" rpc_token->c.string[0] = 0; strcat (rpc_token->c.string, "token:"); strcat (rpc_token->c.string, uaria2->token); } ug_mutex_unlock (&uaria2->mutex); } if (has_response) result->id.type = UG_VALUE_INT; return result; } void uget_aria2_request (UgetAria2* uaria2, UgJsonrpcObject* request) { ug_mutex_lock (&uaria2->mutex); *(UgJsonrpcObject**)ug_array_alloc (&uaria2->queuing, 1) = request; ug_mutex_unlock (&uaria2->mutex); } UgJsonrpcObject* uget_aria2_respond (UgetAria2* uaria2, UgJsonrpcObject* request) { UgJsonrpcObject* response = NULL; UgSLink* prev_response; UgSLink* prev; UgSLink* link = NULL; int completed_changed = 0; while (link == NULL) { while (completed_changed == uaria2->completed_changed) { // default: sleep 0.5 second ug_sleep (uaria2->polling_interval); continue; } ug_mutex_lock (&uaria2->completed_mutex); link = ug_slinks_find (&uaria2->requested, request, &prev); if (link) { // remove request if (prev) prev_response = uaria2->responsed.at + (prev - uaria2->requested.at); else prev_response = NULL; // get response & remove it response = (UgJsonrpcObject*) uaria2->responsed.at[link - uaria2->requested.at].data; ug_slinks_remove (&uaria2->requested, request, prev); ug_slinks_remove (&uaria2->responsed, response, prev_response); } completed_changed = uaria2->completed_changed; ug_mutex_unlock (&uaria2->completed_mutex); } return response; } void uget_aria2_recycle (UgetAria2* uaria2, UgJsonrpcObject* jobject) { if (jobject) { ug_jsonrpc_object_clear (jobject); ug_mutex_lock (&uaria2->mutex); *(UgJsonrpcObject**)ug_array_alloc (&uaria2->recycled, 1) = jobject; ug_mutex_unlock (&uaria2->mutex); } } UgValue* uget_aria2_clear_token (UgJsonrpcObject* jobject) { UgValue* rpc_token; if (jobject->params.type == UG_VALUE_ARRAY) { rpc_token = jobject->params.c.array->at; if (rpc_token->type == UG_VALUE_STRING && rpc_token->c.string != NULL && strncmp (rpc_token->c.string, "token:", 6) == 0) { ug_free (rpc_token->c.string); rpc_token->c.string = NULL; rpc_token->type = UG_VALUE_NONE; return rpc_token + 1; } return jobject->params.c.array->at; } return NULL; } uget-2.2.2/uget/pwmd.h0000664000175000017500000000217113470304403011467 00000000000000/* Copyright (C) 2011-2016 Ben Kibbey This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301 USA */ #ifndef PWMD_H #define PWMD_H #include #include "UgetData.h" struct pwmd_proxy_s { gchar* hostname; gchar* username; gchar* password; gchar* type; gchar* path; gint port; }; gpg_error_t ug_set_pwmd_proxy_options(struct pwmd_proxy_s*, UgetProxy*); void ug_close_pwmd(struct pwmd_proxy_s*); #endif uget-2.2.2/uget/UgetPluginMedia.h0000664000175000017500000001146313470304403013547 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGET_PLUGIN_MEDIA_H #define UGET_PLUGIN_MEDIA_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgetPluginMedia UgetPluginMedia; extern const UgetPluginInfo* UgetPluginMediaInfo; typedef enum { UGET_PLUGIN_MEDIA_GLOBAL = UGET_PLUGIN_AGENT_GLOBAL_DERIVED, // begin UGET_PLUGIN_MEDIA_GLOBAL_MATCH_MODE, // set parameter = (UgetMediaMatchMode) UGET_PLUGIN_MEDIA_GLOBAL_QUALITY, // set parameter = (UgetMediaQuality) UGET_PLUGIN_MEDIA_GLOBAL_TYPE, // set parameter = (UgetMediaType) } UgetPluginMediaGlobalCode; /* ---------------------------------------------------------------------------- UgetPluginMedia: It derived from UgetPluginAgent. It use libcurl to get video info. It use curl/aria2 plug-in to download media file. UgType | `--- UgetPlugin | `--- UgetPluginAgent | `--- UgetPluginMedia */ struct UgetPluginMedia { UGET_PLUGIN_AGENT_MEMBERS; /* // ------ UgType members ------ const UgetPluginInfo* info; // ------ UgetPlugin members ------ UgetEvent* messages; UgMutex mutex; int ref_count; // ------ UgetPluginAgent members ------ // This plug-in use other plug-in to download files, // so we need extra UgetPlugin and UgInfo. // plugin->target_info is a copy of UgInfo that store in UgetApp UgInfo* target_info; // target_plugin use target_info to download UgetPlugin* target_plugin; // speed limit control // limit[0] = download speed limit // limit[1] = upload speed limit int limit[2]; uint8_t limit_changed:1; // speed limit changed by user or program // control flags uint8_t paused:1; // paused by user or program uint8_t stopped:1; // all downloading thread are stopped */ uint8_t synced:1; // used by plugin_sync() uint8_t named:1; // change UgetCommon::name by title uint8_t file_renamed:1; // downloading filename changed // These UgData store in plugin->target_info UgetFiles* target_files; UgetProxy* target_proxy; UgetCommon* target_common; UgetProgress* target_progress; // plug-in use title to rename file char* title; // use these data to recount progress if plug-in download multiple files. int64_t elapsed; int retry_count; int item_index; // downloading nth files int item_total; // number of files to download }; #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Uget { const PluginInfo* const PluginMediaInfo = (const PluginInfo*) UgetPluginMediaInfo; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct PluginMediaMethod : PluginAgentMethod {}; // This one is for directly use only. You can NOT derived it. struct PluginMedia : PluginMediaMethod, UgetPluginMedia { inline void* operator new(size_t size) { return uget_plugin_new(PluginMediaInfo); } }; }; // namespace Uget #endif // __cplusplus #endif // End of UGET_PLUGIN_MEDIA_H uget-2.2.2/uget/UgetNode-compare.c0000664000175000017500000002543513470304402013660 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // ---------------------------------------------------------------------------- // compare functions for sorting int uget_node_compare_name (UgetNode* node1, UgetNode* node2) { UgetCommon* common1; UgetCommon* common2; common1 = ug_info_get(node1->info, UgetCommonInfo); common2 = ug_info_get(node2->info, UgetCommonInfo); if (common1 && common1->name) { if (common2->name == NULL) return 1; } else { if (common2 && common2->name) return -1; else return 0; } return strcmp (common1->name, common2->name); } int uget_node_compare_complete (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->complete == progress2->complete) return uget_node_compare_name (node1, node2); // return diff of complete else return (int)(progress1->complete - progress2->complete); } int uget_node_compare_size (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->total == progress2->total) return uget_node_compare_name (node1, node2); // return diff of total else return (int)(progress1->total - progress2->total); } int uget_node_compare_percent (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->percent == progress2->percent) return uget_node_compare_name (node1, node2); // return diff of percent else return progress1->percent - progress2->percent; } int uget_node_compare_elapsed (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->elapsed == progress2->elapsed) return uget_node_compare_name (node1, node2); // return diff of elapsed (consume time) else return (int)(progress1->elapsed - progress2->elapsed); } int uget_node_compare_left (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->left == progress2->left) return uget_node_compare_name (node1, node2); // return diff of left (remain time) else return (int)(progress1->left - progress2->left); } int uget_node_compare_speed (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->download_speed == progress2->download_speed) return uget_node_compare_name (node1, node2); // return diff of download_speed else return (int)(progress1->download_speed - progress2->download_speed); } int uget_node_compare_upload_speed (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->upload_speed == progress2->upload_speed) return uget_node_compare_name (node1, node2); // return diff of upload_speed else return (int)(progress1->upload_speed - progress2->upload_speed); } int uget_node_compare_uploaded (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->uploaded == progress2->uploaded) return uget_node_compare_name (node1, node2); // return diff of uploaded else return (int)(progress1->uploaded - progress2->uploaded); } int uget_node_compare_ratio (UgetNode* node1, UgetNode* node2) { UgetProgress* progress1; UgetProgress* progress2; node1 = node1->base; node2 = node2->base; progress1 = ug_info_get (node1->info, UgetProgressInfo); progress2 = ug_info_get (node2->info, UgetProgressInfo); if (progress1) { if (progress2 == NULL) return 1; } else { if (progress2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (progress1->ratio == progress2->ratio) return uget_node_compare_name (node1, node2); // return diff of ratio else return (int)(progress1->ratio - progress2->ratio); } int uget_node_compare_retry (UgetNode* node1, UgetNode* node2) { UgetCommon* common1; UgetCommon* common2; node1 = node1->base; node2 = node2->base; common1 = ug_info_get (node1->info, UgetCommonInfo); common2 = ug_info_get (node2->info, UgetCommonInfo); if (common1) { if (common2 == NULL) return 1; } else { if (common2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these are the same, compare name if (common1->retry_count == common2->retry_count) return uget_node_compare_name (node1, node2); // return diff of retry_count else return common1->retry_count - common2->retry_count; } int uget_node_compare_parent_name (UgetNode* node1, UgetNode* node2) { return uget_node_compare_name(node1->base->parent, node2->base->parent); } int uget_node_compare_uri (UgetNode* node1, UgetNode* node2) { UgetCommon* common1; UgetCommon* common2; node1 = node1->base; node2 = node2->base; common1 = ug_info_get (node1->info, UgetCommonInfo); common2 = ug_info_get (node2->info, UgetCommonInfo); if (common1) { if (common2 == NULL) return 1; } else { if (common2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } return strcmp (common1->uri, common2->uri); } int uget_node_compare_added_time (UgetNode* node1, UgetNode* node2) { UgetLog* log1; UgetLog* log2; node1 = node1->base; node2 = node2->base; log1 = ug_info_get (node1->info, UgetLogInfo); log2 = ug_info_get (node2->info, UgetLogInfo); if (log1) { if (log2 == NULL) return 1; } else { if (log2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these added_time are the same, compare name if (log1->added_time == log2->added_time) return uget_node_compare_name (node1, node2); // return diff of added_time else return (int)(log1->added_time - log2->added_time); } int uget_node_compare_completed_time (UgetNode* node1, UgetNode* node2) { UgetLog* log1; UgetLog* log2; node1 = node1->base; node2 = node2->base; log1 = ug_info_get (node1->info, UgetLogInfo); log2 = ug_info_get (node2->info, UgetLogInfo); if (log1) { if (log2 == NULL) return 1; } else { if (log2 == NULL) return uget_node_compare_name (node1, node2); // 0 else return -1; } // if these completed_time are the same, compare name if (log1->completed_time == log2->completed_time) return uget_node_compare_name (node1, node2); // return diff of completed_time else return (int)(log1->completed_time - log2->completed_time); } uget-2.2.2/uget/UgetFiles.c0000664000175000017500000002242413470304402012404 00000000000000/* * * Copyright (C) 2018-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include // g_slice_xxx #endif // HAVE_GLIB #include #include #include #include #include // ---------------------------------------------------------------------------- // UgetFile UgetFile* uget_file_new(void) { #ifdef HAVE_GLIB return g_slice_alloc0(sizeof(UgetFile)); #else return ug_malloc0(sizeof(UgetFile)); #endif // HAVE_GLIB } void uget_file_free(UgetFile* file) { #ifdef HAVE_GLIB g_slice_free1(sizeof(UgetFile), file); #else ug_free(file); #endif } // ---------------------------------------------------------------------------- // UgetFiles static void uget_files_init(UgetFiles* files); static void uget_files_final(UgetFiles* files); static void uget_files_copy(UgetFiles* files, UgetFiles* src); static void ug_json_write_list(UgJson* json, void* collection); static UgJsonError ug_json_parse_list(UgJson* json, const char* name, const char* value, void* list, void* none); static const UgEntry UgetFilesEntry[] = { {"list", offsetof(UgetFiles, list), UG_ENTRY_ARRAY, ug_json_parse_list, ug_json_write_list}, // deprecated {"collection", offsetof(UgetFiles, list), UG_ENTRY_ARRAY, ug_json_parse_list, NULL}, {NULL} // null-terminated }; static const UgDataInfo UgetFilesInfoStatic = { "files", // name sizeof(UgetFiles), // size (UgInitFunc) uget_files_init, (UgFinalFunc) uget_files_final, (UgAssignFunc) uget_files_assign, UgetFilesEntry, }; // extern const UgDataInfo* UgetFilesInfo = &UgetFilesInfoStatic; static void uget_files_init(UgetFiles* files) { ug_list_init(&files->list); files->sync_count = 0; } static void uget_files_final(UgetFiles* files) { // free UgetFile.path in list ug_list_foreach(&files->list, (UgForeachFunc)ug_free, NULL); ug_list_clear(&files->list, TRUE); } int uget_files_assign(UgetFiles* files, UgetFiles* src) { // free UgetFile.path in list ug_list_foreach(&files->list, (UgForeachFunc)ug_free, NULL); ug_list_clear(&files->list, TRUE); uget_files_copy(files, src); files->sync_count = src->sync_count; return TRUE; } void uget_files_clear(UgetFiles* files) { ug_list_foreach(&files->list, (UgForeachFunc)ug_free, NULL); ug_list_clear(&files->list, TRUE); } // sync UgetFile from 'src' to 'files. // 1. all UgetFile in 'src' will insert/replace into 'files'. // 2. remove deleted (state == UGET_FILE_STATE_DELETED) UgetFile in 'src'. // return TRUE if 'files' have added or removed UgetFile. int uget_files_sync(UgetFiles* files, UgetFiles* src) { UgetFile* sibling; UgetFile* file1; UgetFile* file1_src; UgetFile* src_next; if (files->sync_count == src->sync_count) return FALSE; // sync UgetFile from 'src' for (file1_src = (UgetFile*)src->list.head; file1_src; file1_src = src_next) { src_next = file1_src->next; file1 = uget_files_find(files, file1_src->path, &sibling); // add new UgetFile in files if (file1 == NULL) { file1 = uget_file_new(); ug_list_insert(&files->list, (UgLink*)sibling, (UgLink*)file1); if (file1_src->path) file1->path = ug_strdup(file1_src->path); else file1->path = NULL; } file1->type = file1_src->type; file1->state = file1_src->state; // file1->order = file1_src->order; file1->total = file1_src->total; file1->complete = file1_src->complete; // remove deleted UgetFile in 'src' if (file1_src->type & UGET_FILE_STATE_DELETED) { // delete file from src ug_free(file1_src->path); ug_list_remove(&src->list, (UgLink*)file1_src); uget_file_free(file1_src); } } files->sync_count = src->sync_count; return TRUE; } UgetFile* uget_files_find(UgetFiles* files, const char* path, UgetFile** sibling) { UgetFile* file1; int diff; for (file1 = (UgetFile*)files->list.head; file1; file1 = file1->next) { diff = strcmp(file1->path, path); if (diff > 0) { if (sibling) sibling[0] = file1; return NULL; } if (diff == 0) break; } if (sibling) sibling[0] = file1; return file1; } UgetFile* uget_files_realloc(UgetFiles* files, const char* path) { UgetFile* file1; UgetFile* sibling; file1 = uget_files_find(files, path, &sibling); if (file1 == NULL) { file1 = uget_file_new(); ug_list_insert(&files->list, (UgLink*)sibling, (UgLink*)file1); file1->path = ug_strdup(path); file1->type = 0; file1->state = 0; // file1->order = 0; file1->total = 0; file1->complete = 0; files->sync_count++; } return file1; } UgetFile* uget_files_replace(UgetFiles* files, const char* path, int type, int state) { UgetFile* file1; file1 = uget_files_realloc(files, path); file1->type = type; file1->state = state; files->sync_count++; return file1; } void uget_files_apply(UgetFiles* files, int type, int state) { UgetFile* file1; for (file1 = (UgetFile*)files->list.head; file1; file1 = file1->next) { if (file1->type == type || type == UGET_FILE_ALL) file1->state |= state; } files->sync_count++; } void uget_files_erase(UgetFiles* files, int type, int state) { UgetFile* file1; UgetFile* next; for (file1 = (UgetFile*)files->list.head; file1; file1 = next) { next = file1->next; if (file1->type != type && type != UGET_FILE_ALL) continue; if (file1->state & state) { // delete file from src ug_free(file1->path); ug_list_remove(&files->list, (UgLink*)file1); uget_file_free(file1); } } files->sync_count -= 10; } // copy UgetFile from 'src' to 'files'. static void uget_files_copy(UgetFiles* files, UgetFiles* src) { UgetFile* file1; UgetFile* file1_src; for(file1_src = (UgetFile*)src->list.head; file1_src; file1_src = file1_src->next) { file1 = uget_file_new(); ug_list_append(&files->list, (UgLink*)file1); if (file1_src->path) file1->path = ug_strdup(file1_src->path); else file1->path = NULL; file1->type = file1_src->type; file1->state = file1_src->state; // file1->order = file1_src->order; file1->total = file1_src->total; file1->complete = file1_src->complete; } files->sync_count++; } // ---------------------------------------------------------------------------- // JSON static const UgEntry UgetFileEntry[] = { {"path", offsetof(UgetFile, path), UG_ENTRY_STRING, NULL, NULL}, {"type", offsetof(UgetFile, type), UG_ENTRY_CUSTOM, ug_json_parse_int16, ug_json_write_int16}, {"state", offsetof(UgetFile, state), UG_ENTRY_CUSTOM, ug_json_parse_int16, ug_json_write_int16}, // {"order", offsetof(UgetFile, order), UG_ENTRY_CUSTOM, // ug_json_parse_int32, ug_json_write_int32}, {"total", offsetof(UgetFile, total), UG_ENTRY_INT64, NULL, NULL}, {"complete", offsetof(UgetFile, complete), UG_ENTRY_INT64, NULL, NULL}, {NULL} // null-terminated }; static void ug_json_write_list(UgJson* json, void* list) { UgList* filelist = list; UgetFile* file1; for (file1 = (UgetFile*)filelist->head; file1; file1 = file1->next) { ug_json_write_object_head(json); ug_json_write_entry(json, file1, UgetFileEntry); ug_json_write_object_tail(json); } } static UgJsonError ug_json_parse_list(UgJson* json, const char* name, const char* value, void* list, void* none) { UgList* filelist = list; UgetFile* file1; if (json->type != UG_JSON_OBJECT) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } file1 = uget_file_new(); ug_list_append(filelist, (UgLink*)file1); ug_json_push(json, ug_json_parse_entry, file1, (void*)UgetFileEntry); return UG_JSON_ERROR_NONE; } uget-2.2.2/uget/UgetSequence.c0000664000175000017500000002026113470304403013110 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include typedef struct UgLinkString UgLinkString; struct UgLinkString { UG_LINK_MEMBERS (UgLinkString, char, data); // char* data; // UgLinkString* next; // UgLinkString* prev; char string[1]; }; static UgLink* ug_link_string_new (const char* string, int length) { UgLinkString* link; link = ug_malloc (sizeof (UgLinkString) + length); if (link == NULL) return NULL; link->data = link->string; link->prev = NULL; link->next = NULL; strcpy (link->string, string); return (UgLink*) link; } // ---------------------------------------------------------------------------- // UgetSeqRange static void uget_seq_range_to_first (UgetSeqRange* range) { range->cur = range->first; } static void uget_seq_range_to_last (UgetSeqRange* range) { range->cur = range->last; } // ---------------------------------------------------------------------------- void uget_sequence_init (UgetSequence* useq) { ug_array_init (useq, sizeof (UgetSeqRange), 8); ug_buffer_init (&useq->buf, 128); } void uget_sequence_final (UgetSequence* useq) { ug_array_clear (useq); ug_buffer_clear (&useq->buf, TRUE); } void uget_sequence_add (UgetSequence* useq, uint32_t first, uint32_t last, int digits) { UgetSeqRange* range; range = ug_array_alloc (useq, 1); range->digits = digits; if (first < last) { range->first = first; range->last = last; } else { range->first = last; range->last = first; } range->cur = range->first; } void uget_sequence_clear (UgetSequence* useq) { useq->length = 0; } int uget_sequence_count (UgetSequence* useq, const char* pattern) { UgetSeqRange* range; UgetSeqRange* range_end; const char* pcur; int pcur_len; int count; count = 0; range = useq->at; range_end = useq->at + useq->length; for (pcur = pattern; pcur[0] && range < range_end; pcur++, range++) { pcur_len = strcspn (pcur, "*"); if (pcur[pcur_len] != '*') break; if (count == 0) count = range->last - range->first + 1; else count = count * (range->last - range->first + 1); pcur += pcur_len; // to next '*' } return count; } // generate string by pattern static char* uget_sequence_generate1 (UgetSequence* useq, const char* pattern) { UgetSeqRange* range; char* utf8; int length; const char* pcur; int pcur_len; range = useq->at; useq->buf.cur = useq->buf.beg; for (pcur = pattern; pcur[0]; pcur++) { pcur_len = strcspn (pcur, "*"); ug_buffer_write (&useq->buf, pcur, pcur_len); if (pcur[pcur_len] != '*') break; if (range->digits == 0) { // ASCII or Unicode if (range->cur < 0x80) ug_buffer_write_char (&useq->buf, range->cur); else { utf8 = ug_ucs4_to_utf8 (&range->cur, 1, &length); ug_buffer_write (&useq->buf, utf8, length); ug_free (utf8); } } else { // digits, 0 - 9 #ifdef _MSC_VER // for MS C only length = _scprintf ("%.*u", range->digits, range->cur); #else // for C99 standard length = snprintf (NULL, 0, "%.*u", range->digits, range->cur); #endif sprintf (ug_buffer_alloc (&useq->buf, length + 1), "%.*u", range->digits, range->cur); useq->buf.cur--; // remove null character in tail } if (++range > useq->range_last) range = useq->at; pcur += pcur_len; // to next '*' } ug_buffer_write_char (&useq->buf, 0); return useq->buf.beg; } static int uget_sequence_generate (UgetSequence* useq, const char* pattern, UgetSeqRange* range, UgList* result) { UgLink* link; int count; for (count = 0; range->cur <= range->last; range->cur++) { if (range+1 <= useq->range_last) count += uget_sequence_generate (useq, pattern, range+1, result); else { uget_sequence_generate1 (useq, pattern); link = ug_link_string_new (useq->buf.beg, ug_buffer_length (&useq->buf)); if (link == NULL) break; ug_list_append (result, link); count++; } } range->cur = range->first; return count; } static UgetSeqRange* uget_sequence_decide_range_last (UgetSequence* useq, const char* pattern) { const char* wildcard; int count; if (useq->length == 0) return NULL; // count wildcard character (*) to decide the last UgetSeqRange for (count = 0, wildcard = pattern; wildcard[0]; wildcard++) { if (wildcard[0] == '*') count++; } if (count < useq->length) useq->range_last = useq->at + count -1; else useq->range_last = useq->at + useq->length -1; return useq->range_last; } int uget_sequence_get_list (UgetSequence* useq, const char* pattern, UgList* result) { if (uget_sequence_decide_range_last(useq, pattern) == NULL) return 0; // reset range ug_array_foreach (useq, (UgForeachFunc)uget_seq_range_to_first, NULL); // generate list return uget_sequence_generate (useq, pattern, useq->at, result); } int uget_sequence_get_preview (UgetSequence* useq, const char* pattern, UgList* result) { UgetSeqRange* range_last; UgetSeqRange* range_prev; UgLink* link; int count; // use uget_sequence_get_list() to generate preview if possible. count = uget_sequence_count (useq, pattern); if (count < 6) return uget_sequence_get_list (useq, pattern, result); range_last = uget_sequence_decide_range_last(useq, pattern); // decide previous UgetSeqRange by the last UgetSeqRange for (range_prev = range_last; range_prev != useq->at; range_prev--) { if (range_prev->last - range_prev->first + 1 > 1) break; } // reset range to first ug_array_foreach (useq, (UgForeachFunc)uget_seq_range_to_first, NULL); // create 1st string uget_sequence_generate1 (useq, pattern); link = ug_link_string_new (useq->buf.beg, ug_buffer_length (&useq->buf)); ug_list_append (result, link); // create 2nd string range_prev->cur++; uget_sequence_generate1 (useq, pattern); link = ug_link_string_new (useq->buf.beg, ug_buffer_length (&useq->buf)); ug_list_append (result, link); // create 3rd " ..." link = ug_link_string_new (" ...", 4); ug_list_append (result, link); // reset range to last ug_array_foreach (useq, (UgForeachFunc)uget_seq_range_to_last, NULL); // create 4th string range_prev->cur = range_prev->last - 1; uget_sequence_generate1 (useq, pattern); link = ug_link_string_new (useq->buf.beg, ug_buffer_length (&useq->buf)); ug_list_append (result, link); // create 5th string range_prev->cur = range_prev->last; uget_sequence_generate1 (useq, pattern); link = ug_link_string_new (useq->buf.beg, ug_buffer_length (&useq->buf)); ug_list_append (result, link); return 5; } void uget_sequence_clear_result (UgList* result) { ug_list_foreach_link(result, (UgForeachFunc)ug_free, NULL); ug_list_clear(result, FALSE); } uget-2.2.2/uget/UgetPluginMega.c0000775000175000017500000005307413470304403013403 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif // use OpenSSL by default in Windows and Android #if defined _WIN32 || defined _WIN64 || defined __ANDROID__ # if !(defined USE_OPENSSL || defined USE_GNUTLS) # define USE_OPENSSL # endif #endif // OpenSSL #ifdef USE_OPENSSL //#include #include // OPENSSL_VERSION_NUMBER #include // CRYPTO_ctr128_encrypt #include // AES_BLOCK_SIZE // GnuTLS #elif defined USE_GNUTLS #include // mega plug-in must decrypt data #else #error mega plug-in need OpenSSL or GnuTLS to compile. #endif #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #define ug_sleep Sleep #else #include // usleep() #define ug_sleep(millisecond) usleep(millisecond * 1000) #endif // _WIN32 || _WIN64 #ifdef HAVE_GLIB #include #undef printf #else #define N_(x) x #define _(x) x #endif enum { MEGA_INVALID, MEGA_FOLDER, MEGA_FILE, }; // ---------------------------------------------------------------------------- // MEGA site static int mega_parse_url(UgetPluginMega* plugin, const char* url); static int mega_request_info(UgetPluginMega* plugin, const char* id); static int mega_decrypt_file(UgetPluginMega* plugin, int preset_progress); // ---------------------------------------------------------------------------- // UgetPluginInfo (derived from UgTypeInfo) static void plugin_init (UgetPluginMega* plugin); static void plugin_final(UgetPluginMega* plugin); static int plugin_accept(UgetPluginMega* plugin, UgInfo* node_info); static int plugin_sync (UgetPluginMega* plugin, UgInfo* node_info); static int plugin_ctrl (UgetPluginMega* plugin, int code, void* data); static const char* schemes[] = {"https", NULL}; static const char* hosts[] = {"mega.co.nz", "mega.nz", NULL}; static const UgetPluginInfo UgetPluginMegaInfoStatic = { "mega", sizeof(UgetPluginMega), (UgInitFunc) plugin_init, (UgFinalFunc) plugin_final, (UgetPluginSyncFunc) plugin_accept, (UgetPluginSyncFunc) plugin_sync, (UgetPluginCtrlFunc) plugin_ctrl, hosts, schemes, NULL, (UgetPluginGlobalFunc) uget_plugin_agent_global_set, (UgetPluginGlobalFunc) uget_plugin_agent_global_get }; // extern const UgetPluginInfo* UgetPluginMegaInfo = &UgetPluginMegaInfoStatic; // ---------------------------------------------------------------------------- // control functions static void plugin_init(UgetPluginMega* plugin) { // initialize UgetPluginAgent uget_plugin_agent_init((UgetPluginAgent*)plugin); // initialize UgetPluginMega ug_json_init(&plugin->json); ug_value_init_object(&plugin->value, 5); } static void plugin_final(UgetPluginMega* plugin) { // finalize UgetPluginMega ug_free(plugin->id); ug_free(plugin->key); ug_free(plugin->iv); ug_free(plugin->url); ug_free(plugin->file); ug_json_final(&plugin->json); ug_value_clear(&plugin->value); // finalize UgetPluginAgent uget_plugin_agent_final((UgetPluginAgent*)plugin); } // ---------------------------------------------------------------------------- static UgThreadResult plugin_thread(UgetPluginMega* plugin); static int plugin_accept(UgetPluginMega* plugin, UgInfo* node_info) { UgetCommon* common; common = ug_info_get(node_info, UgetCommonInfo); if (common == NULL || common->uri == NULL) return FALSE; // parse MEGA URL if (mega_parse_url(plugin, common->uri) != MEGA_FILE) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, _("Can't handle this MEGA URL."))); return FALSE; } plugin->target_info = ug_info_new(8, 0); ug_info_assign(plugin->target_info, node_info, NULL); plugin->target_files = ug_info_realloc(plugin->target_info, UgetFilesInfo); plugin->target_proxy = ug_info_get(plugin->target_info, UgetProxyInfo); plugin->target_common = ug_info_get(plugin->target_info, UgetCommonInfo); plugin->target_progress = ug_info_realloc(plugin->target_info, UgetProgressInfo); return TRUE; } int plugin_ctrl(UgetPluginMega* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: if (plugin->target_info) { return uget_plugin_agent_start((UgetPluginAgent*)plugin, (UgThreadFunc)plugin_thread); } break; default: // call parent's plugin_ctrl() return uget_plugin_agent_ctrl((UgetPluginAgent*)plugin, code, data); } return FALSE; } static int is_downloaded(UgetPluginMega* plugin, UgetCommon* target_common); static UgThreadResult plugin_thread(UgetPluginMega* plugin) { UgetPluginInfo* plugin_info; UgetCommon* target_common; UgetEvent* msg_next; UgetEvent* msg; // get MEGA download URL & attributes if (mega_request_info(plugin, plugin->id) == FALSE) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, _("Can't get download URL."))); goto exit; } target_common = plugin->target_common; // set MEGA download URL ug_free(target_common->uri); target_common->uri = plugin->url; plugin->url = NULL; // set MEGA output file name if (target_common->file == NULL) plugin->named = TRUE; else { ug_free(plugin->file); plugin->file = ug_strdup(target_common->file); } ug_free(target_common->file); target_common->file = ug_strdup_printf("%s.enc", plugin->file); // check existed file if (is_downloaded(plugin, target_common) == TRUE) { mega_decrypt_file(plugin, TRUE); goto exit; } uget_plugin_agent_global_get(UGET_PLUGIN_AGENT_GLOBAL_PLUGIN, &plugin_info); // create target_plugin to download plugin->target_plugin = uget_plugin_new(plugin_info); uget_plugin_accept(plugin->target_plugin, plugin->target_info); uget_plugin_ctrl_speed(plugin->target_plugin, plugin->limit); if (uget_plugin_start(plugin->target_plugin) == FALSE) { msg = uget_event_new_error(UGET_EVENT_ERROR_THREAD_CREATE_FAILED, NULL); uget_plugin_post((UgetPlugin*) plugin, msg); goto exit; } do { // sleep 0.5 second ug_sleep(500); // stop target_plugin when user paused this plug-in. if (plugin->paused) { uget_plugin_stop(plugin->target_plugin); break; } if (plugin->limit_changed) { plugin->limit_changed = FALSE; uget_plugin_ctrl_speed(plugin->target_plugin, plugin->limit); } // move event from target_plugin to plug-in msg = uget_plugin_pop((UgetPlugin*) plugin->target_plugin); for (; msg; msg = msg_next) { msg_next = msg->next; msg->prev = NULL; msg->next = NULL; // handle or discard some message switch (msg->type) { case UGET_EVENT_ERROR: // stop downloading if error occurred plugin->paused = TRUE; break; case UGET_EVENT_NORMAL: // ignore "not resumable" event if (msg->value.code == UGET_EVENT_NORMAL_NOT_RESUMABLE) uget_event_free(msg); continue; case UGET_EVENT_STOP: case UGET_EVENT_COMPLETED: // discard message uget_event_free(msg); continue; } // post event to plug-in uget_plugin_post((UgetPlugin*) plugin, msg); } // sync data in plugin_sync() plugin->synced = FALSE; uget_plugin_lock(plugin); uget_plugin_sync(plugin->target_plugin, plugin->target_info); uget_plugin_unlock(plugin); } while (uget_plugin_get_state(plugin->target_plugin)); // free target_plugin uget_plugin_unref(plugin->target_plugin); plugin->target_plugin = NULL; // if downloading completed, decrypt file if (plugin->paused == FALSE) mega_decrypt_file(plugin, FALSE); exit: plugin->synced = FALSE; plugin->stopped = TRUE; uget_plugin_post((UgetPlugin*) plugin, uget_event_new(UGET_EVENT_STOP)); uget_plugin_unref((UgetPlugin*) plugin); return UG_THREAD_RESULT; } static int plugin_sync(UgetPluginMega* plugin, UgInfo* node_info) { UgetFiles* files; UgetCommon* common; UgetProgress* progress; if (plugin->stopped) { if (plugin->synced) return FALSE; plugin->synced = TRUE; } // avoid crash if plug-in failed to start. if (plugin->target_common == NULL) return FALSE; // sync common data (include speed limit) between foreign info and target_info common = ug_info_realloc(node_info, UgetCommonInfo); uget_plugin_agent_sync_common((UgetPluginAgent*) plugin, common, plugin->target_common); // sync progress data from target_info to foreign info progress = ug_info_realloc(node_info, UgetProgressInfo); uget_plugin_agent_sync_progress((UgetPluginAgent*) plugin, progress, plugin->target_progress); if (plugin->decrypting == FALSE) progress->percent = progress->percent * 96 / 100; // update UgetFiles files = ug_info_realloc(node_info, UgetFilesInfo); uget_plugin_lock(plugin); uget_files_sync(files, plugin->target_files); uget_plugin_unlock(plugin); // plug-in has got file name from server. if (plugin->named) { plugin->named = FALSE; ug_free(common->name); common->name = ug_strdup(plugin->file); ug_free(common->file); common->file = ug_strdup(plugin->file); } // if plug-in was stopped, return FALSE. return TRUE; } static int is_downloaded(UgetPluginMega* plugin, UgetCommon* target_common) { char* path; char* temp; // check existed file if (target_common->folder == NULL) path = ug_strdup(target_common->file); else path = ug_build_filename(target_common->folder, target_common->file, NULL); if (ug_file_is_exist(path)) { temp = path; path = ug_strdup_printf("%s.aria2", path); ug_free(temp); if (ug_file_is_exist(path) == FALSE) { ug_free(path); return TRUE; } ug_free(path); } return FALSE; } // ---------------------------------------------------------------------------- // MEGA site static void xor_n(uint8_t* dest, uint8_t* src1, uint8_t* src2, int length) { for (; length > 0; length--) *dest++ = *src1++ ^ *src2++; } static int mega_parse_url(UgetPluginMega* plugin, const char* url) { uint8_t* binary_key; int length; int result; plugin->id = strchr(url, '!'); if (plugin->id == NULL) return MEGA_INVALID; else { // folder or file if (plugin->id != url && *(plugin->id-1) == 'F') result = MEGA_FOLDER; else result = MEGA_FILE; plugin->id++; } plugin->key = strchr(plugin->id, '!'); if (plugin->key == NULL) return MEGA_INVALID; else { plugin->key++; if (plugin->key[0] == 0) return MEGA_INVALID; } // copy string from URL plugin->id = ug_strndup(plugin->id, plugin->key - plugin->id - 1); plugin->key = ug_strdup(plugin->key); ug_str_replace_chars(plugin->key, "-", '+'); ug_str_replace_chars(plugin->key, "_", '/'); ug_str_remove_chars(plugin->key, plugin->key, ","); ug_str_remove_chars(plugin->key, plugin->key, "\n"); binary_key = ug_base64_decode(plugin->key, strlen(plugin->key), &length); plugin->key = ug_realloc(plugin->key, 16); if (length == 16) memcpy(plugin->key, binary_key, 16); else if (length == 32) xor_n((uint8_t*)plugin->key, binary_key, binary_key+16, 16); else { // "Invalid key, please verify your MEGA URL." ug_free(binary_key); return MEGA_INVALID; } plugin->iv = ug_malloc(16); memcpy(plugin->iv, binary_key+16, 8); memset(plugin->iv+8, 0, 8); return result; } // ------------------------------------ // MEGA attributes // MEGA{ // "c":"Yy6d4TsrLpaGN0NwGKf_gwRqgYlZ", // "n":"filename.ext" // } // n is filename static int mega_parse_attributes(UgetPluginMega* plugin, char* attributes) { UgValue* member; char* iv; char* attr; char* buffer; int length; ug_str_replace_chars(attributes, "-", '+'); ug_str_replace_chars(attributes, "_", '/'); ug_str_remove_chars(attributes, attributes, ","); ug_str_remove_chars(attributes, attributes, "\n"); buffer = (char*)ug_base64_decode(attributes, strlen(attributes), &length); iv = ug_malloc0(16); attr = NULL; #ifdef USE_OPENSSL { AES_KEY key; attr = ug_malloc(length); AES_set_decrypt_key((uint8_t*)plugin->key, 128, &key); // AES_cbc_decrypt(temp, attr, length, &key, iv, AES_DECRYPT); CRYPTO_cbc128_decrypt((uint8_t*)buffer, (uint8_t*)attr, length, &key, (uint8_t*)iv, (block128_f)AES_decrypt); } #endif // USE_OPENSSL #ifdef USE_GNUTLS { gcry_cipher_hd_t gchd; gcry_cipher_open(&gchd, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC, 0); gcry_cipher_setkey(gchd, plugin->key, 16); gcry_cipher_setiv(gchd, iv, 16); gcry_cipher_decrypt(gchd, buffer, length, NULL, 0); gcry_cipher_close(gchd); attr = buffer; buffer = NULL; } #endif // USE_GNUTLS ug_free(iv); ug_free(buffer); #ifndef NDEBUG printf("%.*s\n", length, attr); #endif // search JSON object buffer = strchr(attr, '{'); if (buffer == NULL) { ug_free(attr); return FALSE; } length -= buffer - attr; // parse JSON object ug_value_clear(&plugin->value); ug_json_begin_parse(&plugin->json); ug_json_push(&plugin->json, ug_json_parse_value, &plugin->value, NULL); ug_json_parse(&plugin->json, buffer, length); ug_json_end_parse(&plugin->json); ug_free(attr); if (plugin->value.type != UG_VALUE_OBJECT) return FALSE; ug_value_sort(&plugin->value, ug_value_compare_name); // get file name member = ug_value_find_name(&plugin->value, "n"); if (member == NULL || member->type != UG_VALUE_STRING) return FALSE; plugin->file = ug_strdup(member->c.string); return TRUE; } // ------------------------------------ // MEGA file info result // [-9] = doesn't exist? // // [ // { // "s":61297757, // "at":"m0n8BXaUMWAU0E62cXP6W7dzE3VZQL-luEZJmnRnbJQPR0RoI9ln720tB3xU4fQPpUzdtm2L6mFUFDVJSljHpum8LsAMZnKTo3ANWEcNIOI9mTAzXTp6_Hg7kyqSIkkV", // "msd":1, // "tl":0, // "g":"http://gfs270n155.userstorage.mega.co.nz/dl/44BKOuGpTz7mogJ8dP7I5tFynclZmBl6aJCoF6E3bqPvmy5SjM0u4qxxzxlvEf0s-Y7Yj3IEKzA8zsrHweCDGlyPvdX6DJc4vX6U9-M4xweMdUM-aiVtqsp8pr3mGw" // } // ] // at is attributes // g is download URL // s is size static size_t curl_output_mega_result(char* text, size_t size, size_t nmemb, UgetPluginMega* plugin) { size *= nmemb; ug_json_parse(&plugin->json, text, size); #ifndef NDEBUG printf("%.*s\n", size, text); #endif return size; } static int mega_request_info(UgetPluginMega* plugin, const char* id) { CURL* curl; CURLcode code; UgValue* member; char* string; ug_json_begin_parse(&plugin->json); ug_json_push(&plugin->json, ug_json_parse_value, &plugin->value, NULL); ug_json_push(&plugin->json, ug_json_parse_array, NULL, NULL); // setup option string = ug_strdup_printf("[{\"a\":\"g\",\"g\":1,\"p\":\"%s\"}]", id); curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, "https://eu.api.mega.co.nz/cs"); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, string); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(string)); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_output_mega_result); curl_easy_setopt(curl, CURLOPT_WRITEDATA, plugin); ug_curl_set_proxy(curl, plugin->target_proxy); code = curl_easy_perform(curl); ug_free(string); if (code != CURLE_OK) return FALSE; if (ug_json_end_parse(&plugin->json) != UG_JSON_ERROR_NONE) return FALSE; if (plugin->value.type != UG_VALUE_OBJECT) return FALSE; ug_value_sort(&plugin->value, ug_value_compare_name); // get download URL member = ug_value_find_name(&plugin->value, "g"); if (member == NULL || member->type != UG_VALUE_STRING) return FALSE; plugin->url = ug_strdup(member->c.string); // get attributes member = ug_value_find_name(&plugin->value, "at"); if (member == NULL || member->type != UG_VALUE_STRING) return FALSE; // mega_parse_attributes() will call ug_value_clear(&plugin->value); mega_parse_attributes(plugin, member->c.string); return TRUE; } int mega_decrypt_file(UgetPluginMega* plugin, int preset_progress) { UgetFile* file; UgetCommon* target_common; char *path_in, *path_out; FILE *file_in, *file_out; target_common = plugin->target_common; // decrypt input/output file --- if (target_common->folder == NULL) { path_out = ug_strdup(plugin->file); path_in = ug_strdup(target_common->file); } else { path_out = ug_build_filename(target_common->folder, plugin->file, NULL); path_in = ug_build_filename(target_common->folder, target_common->file, NULL); } // decrypt output file --- file_out = ug_fopen(path_out, "wb"); if (file_out == NULL) { ug_free(path_out); ug_free(path_in); return FALSE; } // decrypt input file --- file_in = ug_fopen(path_in, "rb"); if (file_in == NULL) { ug_free(path_out); ug_free(path_in); fclose(file_out); return FALSE; } // preset progress before decrypting if (preset_progress == TRUE) { fseek(file_in, 0L, SEEK_END); plugin->target_progress->percent = 96; plugin->target_progress->complete = ug_ftell(file_in); plugin->target_progress->total = plugin->target_progress->complete; fseek(file_in, 0L, SEEK_SET); // rewind(file_in); } plugin->synced = FALSE; plugin->decrypting = TRUE; uget_plugin_post((UgetPlugin*) plugin, uget_event_new_normal(0, _("decrypting file..."))); #ifdef USE_OPENSSL { AES_KEY aeskey; int length; unsigned int num; unsigned char* data_in; unsigned char* data_out; unsigned char* ecount_buf; data_in = ug_malloc(AES_BLOCK_SIZE * 3); data_out = data_in + AES_BLOCK_SIZE; ecount_buf = data_out + AES_BLOCK_SIZE; // set to zeros before the first call to ctr128_encrypt memset(ecount_buf, 0, AES_BLOCK_SIZE); num = 0; // CTR mode doesn't need separate encrypt and decrypt method. AES_set_encrypt_key((uint8_t*)plugin->key, 128, &aeskey); while (1) { length = fread(data_in, 1, AES_BLOCK_SIZE, file_in); #if OPENSSL_VERSION_NUMBER >= 0x10100000L CRYPTO_ctr128_encrypt(data_in, data_out, length, &aeskey, (uint8_t*)plugin->iv, ecount_buf, &num, (block128_f)AES_encrypt); #else AES_ctr128_encrypt(data_in, data_out, length, &aeskey, (uint8_t*)plugin->iv, ecount_buf, &num); #endif fwrite(data_out, 1, length, file_out); // decrypting progress plugin->target_progress->complete = ug_ftell(file_out); plugin->target_progress->percent = 96 + plugin->target_progress->complete * 4 / plugin->target_progress->total; plugin->synced = FALSE; // check EOF if (length < AES_BLOCK_SIZE) break; } ug_free(data_in); } #endif // USE_OPENSSL #ifdef USE_GNUTLS { char* buffer; int length; gcry_cipher_hd_t gchd; // CTR mode doesn't need separate encrypt and decrypt method. gcry_cipher_open(&gchd, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CTR, 0); gcry_cipher_setkey(gchd, plugin->key, 16); gcry_cipher_setiv(gchd, plugin->iv, 16); gcry_cipher_setctr(gchd, plugin->iv, 16); // counter vector buffer = ug_malloc(16); while (1) { length = fread(buffer, 1, 16, file_in); gcry_cipher_encrypt(gchd, buffer, length, NULL, 0); fwrite(buffer, 1, length, file_out); // decrypting progress plugin->target_progress->complete = ug_ftell(file_out); plugin->target_progress->percent = 96 + plugin->target_progress->complete * 4 / plugin->target_progress->total; plugin->synced = FALSE; // check EOF if (length < 16) break; } ug_free(buffer); gcry_cipher_close(gchd); } #endif // USE_GNUTLS // decryption completed fclose(file_out); fclose(file_in); ug_remove(path_in); // update UgetFiles uget_plugin_lock(plugin); file = uget_files_realloc(plugin->target_files, path_in); file->state |= UGET_FILE_STATE_DELETED; file = uget_files_replace(plugin->target_files, path_out, UGET_FILE_REGULAR, UGET_FILE_STATE_COMPLETED); uget_plugin_unlock(plugin); // free path and update progress ug_free(path_in); ug_free(path_out); plugin->target_progress->percent = 100; // post message uget_plugin_post((UgetPlugin*) plugin, uget_event_new_normal(0, _("decryption completed"))); uget_plugin_post((UgetPlugin*) plugin, uget_event_new(UGET_EVENT_COMPLETED)); return TRUE; } uget-2.2.2/uget/UgetPluginMedia.c0000664000175000017500000003525513470304403013547 00000000000000/* * * Copyright (C) 2016-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #define ug_sleep Sleep #else #include // usleep() #define ug_sleep(millisecond) usleep(millisecond * 1000) #endif // _WIN32 || _WIN64 #ifdef HAVE_GLIB #include #undef printf #else #define N_(x) x #define _(x) x #endif // ---------------------------------------------------------------------------- // UgetPluginInfo (derived from UgTypeInfo) static void plugin_init (UgetPluginMedia* plugin); static void plugin_final(UgetPluginMedia* plugin); static int plugin_ctrl (UgetPluginMedia* plugin, int code, void* data); static int plugin_accept(UgetPluginMedia* plugin, UgInfo* node_info); static int plugin_sync (UgetPluginMedia* plugin, UgInfo* node_info); static UgetResult global_set(int code, void* parameter); static UgetResult global_get(int code, void* parameter); static const char* schemes[] = {"http", "https", NULL}; static const char* hosts[] = {"youtube.com", "youtu.be", NULL}; static const UgetPluginInfo UgetPluginMediaInfoStatic = { "media", sizeof(UgetPluginMedia), (UgInitFunc) plugin_init, (UgFinalFunc) plugin_final, (UgetPluginSyncFunc) plugin_accept, (UgetPluginSyncFunc) plugin_sync, (UgetPluginCtrlFunc) plugin_ctrl, hosts, schemes, NULL, (UgetPluginGlobalFunc) global_set, (UgetPluginGlobalFunc) global_get }; // extern const UgetPluginInfo* UgetPluginMediaInfo = &UgetPluginMediaInfoStatic; // ---------------------------------------------------------------------------- // global data and it's functions. static struct { UgetMediaMatchMode match_mode; UgetMediaQuality quality; UgetMediaType type; } global = {UGET_MEDIA_MATCH_NEAR, UGET_MEDIA_QUALITY_360P, UGET_MEDIA_TYPE_MP4}; static UgetResult global_set(int option, void* parameter) { switch (option) { case UGET_PLUGIN_MEDIA_GLOBAL_MATCH_MODE: global.match_mode = (intptr_t) parameter; break; case UGET_PLUGIN_MEDIA_GLOBAL_QUALITY: global.quality = (intptr_t) parameter; break; case UGET_PLUGIN_MEDIA_GLOBAL_TYPE: global.type = (intptr_t) parameter; break; default: // call parent's global_set() return uget_plugin_agent_global_set(option, parameter); } return UGET_RESULT_OK; } static UgetResult global_get(int option, void* parameter) { switch (option) { case UGET_PLUGIN_GLOBAL_MATCH: if (uget_site_get_id(parameter) < UGET_SITE_MEDIA) return UGET_RESULT_FAILED; break; default: // call parent's global_get() return uget_plugin_agent_global_get(option, parameter); } return UGET_RESULT_OK; } // ---------------------------------------------------------------------------- // control functions static void plugin_init(UgetPluginMedia* plugin) { // initialize UgetPluginAgent uget_plugin_agent_init((UgetPluginAgent*) plugin); } static void plugin_final(UgetPluginMedia* plugin) { ug_free(plugin->title); uget_plugin_agent_final((UgetPluginAgent*) plugin); } // ---------------------------------------------------------------------------- // plugin_ctrl static UgThreadResult plugin_thread(UgetPluginMedia* plugin); static int plugin_ctrl(UgetPluginMedia* plugin, int code, void* data) { switch (code) { case UGET_PLUGIN_CTRL_START: if (plugin->target_info) { return uget_plugin_agent_start((UgetPluginAgent*)plugin, (UgThreadFunc)plugin_thread); } break; default: // call parent's plugin_ctrl() return uget_plugin_agent_ctrl((UgetPluginAgent*)plugin, code, data); } return FALSE; } // ---------------------------------------------------------------------------- // plugin_sync static int plugin_sync(UgetPluginMedia* plugin, UgInfo* node_info) { UgetFiles* files; UgetCommon* common; UgetProgress* progress; if (plugin->stopped) { if (plugin->synced) return FALSE; plugin->synced = TRUE; } // avoid crash if plug-in failed to start. if (plugin->target_info == NULL) return FALSE; // sync data between plug-in and foreign UgData common = ug_info_realloc(node_info, UgetCommonInfo); // sum retry count common->retry_count = plugin->target_common->retry_count + plugin->retry_count; // change name by title ,item_index, and item_total if (plugin->named == FALSE && plugin->title) { plugin->named = TRUE; ug_free(common->name); // decide to show "(current/total) title" or "title" if (plugin->item_total > 1) { common->name = ug_strdup_printf("(%d/%d) %s", plugin->item_index + 1, plugin->item_total, plugin->title); } else common->name = ug_strdup(plugin->title); } // sync common data (include speed limit) between foreign data and target_info uget_plugin_agent_sync_common((UgetPluginAgent*) plugin, common, plugin->target_common); // downloading file name changed if (plugin->file_renamed == TRUE) { plugin->file_renamed = FALSE; uget_plugin_lock(plugin); ug_free(common->file); common->file = ug_strdup(plugin->target_common->file); uget_plugin_unlock(plugin); } // update UgetFiles files = ug_info_realloc(node_info, UgetFilesInfo); uget_plugin_lock(plugin); uget_files_sync(files, plugin->target_files); uget_plugin_unlock(plugin); // sync progress data from target_info to foreign data progress = ug_info_realloc(node_info, UgetProgressInfo); uget_plugin_agent_sync_progress((UgetPluginAgent*) plugin, progress, plugin->target_progress); // recount progress if plug-in download multiple files if (plugin->item_total > 1) { // recount percent progress->percent = (progress->percent + 100 * plugin->item_index) / plugin->item_total; // recount/speculate left time if (progress->download_speed > 0) { progress->left = (progress->total * (plugin->item_total - plugin->item_index) - progress->complete) / progress->download_speed; } // sum elapsed time progress->elapsed += plugin->elapsed; } // if plug-in was stopped, return FALSE. return TRUE; } // ---------------------------------------------------------------------------- static int plugin_accept(UgetPluginMedia* plugin, UgInfo* node_info) { UgetCommon* common; common = ug_info_get(node_info, UgetCommonInfo); if (common == NULL || common->uri == NULL) return FALSE; plugin->target_info = ug_info_new(8, 0); ug_info_assign(plugin->target_info, node_info, NULL); plugin->target_files = ug_info_realloc(plugin->target_info, UgetFilesInfo); plugin->target_common = ug_info_get(plugin->target_info, UgetCommonInfo); plugin->target_proxy = ug_info_get(plugin->target_info, UgetProxyInfo); plugin->target_progress = ug_info_realloc(plugin->target_info, UgetProgressInfo); return TRUE; } static int is_file_completed(const char* file, const char* folder); static UgThreadResult plugin_thread(UgetPluginMedia* plugin) { UgetPluginInfo* plugin_info; UgetMedia* umedia; UgetMediaItem* umitem; UgetCommon* common; UgetHttp* http; UgetEvent* msg_next; UgetEvent* msg; const char* type = NULL; const char* quality = NULL; common = plugin->target_common; umedia = uget_media_new(common->uri, 0); if (uget_media_grab_items(umedia, plugin->target_proxy) == 0) { if (umedia->event) { uget_plugin_post((UgetPlugin*) plugin, umedia->event); umedia->event = NULL; } else { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, _("Failed to get media link."))); } goto exit; } // tell plugin_sync() to change foreign UgetCommon::name if (umedia->title) { plugin->title = umedia->title; umedia->title = NULL; plugin->synced = FALSE; } umitem = uget_media_match(umedia, global.match_mode, global.quality, global.type); if (umitem == NULL) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new_error(UGET_EVENT_ERROR_CUSTOM, _("No matched media."))); goto exit; } // set item_index and item_total plugin->item_index = 0; plugin->item_total = umedia->size - ug_list_position((UgList*) umedia, (UgLink*) umitem); // set HTTP referrer http = ug_info_realloc(plugin->target_info, UgetHttpInfo); if (http->referrer == NULL) http->referrer = ug_strdup_printf("%s%s", common->uri, "# "); // clear copied common URI ug_free(common->uri); common->uri = NULL; // reset grand total data plugin->elapsed = 0; plugin->retry_count = 0; for (; umitem; umitem = umitem->next) { // stop this loop when user paused this plug-in. if (plugin->paused) break; // Don't increase item_index when running this loop first time. if (type) plugin->item_index++; switch (umitem->type) { case UGET_MEDIA_TYPE_3GPP: type = "3gpp"; break; case UGET_MEDIA_TYPE_FLV: type = "flv"; break; case UGET_MEDIA_TYPE_MP4: type = "mp4"; break; case UGET_MEDIA_TYPE_WEBM: type = "webm"; break; default: type = "unknown"; break; } switch (umitem->quality) { case UGET_MEDIA_QUALITY_240P: quality = "240p"; break; case UGET_MEDIA_QUALITY_360P: quality = "360p"; break; case UGET_MEDIA_QUALITY_480P: quality = "480p"; break; case UGET_MEDIA_QUALITY_720P: quality = "720p"; break; case UGET_MEDIA_QUALITY_1080P: quality = "1080p"; break; default: quality = "unknown"; break; } // generate file name by title, quality, and type. uget_plugin_lock(plugin); ug_free(common->file); common->file = ug_strdup_printf("%s_%s.%s", (plugin->title) ? plugin->title : "unknown", quality, type); ug_str_replace_chars(common->file, "\\/:*?\"<>|", '_'); uget_plugin_unlock(plugin); plugin->file_renamed = TRUE; // skip completed file if (is_file_completed(common->file, common->folder)) continue; // use media link to replace common->uri common->uri = umitem->url; // tell plugin_sync() to change foreign UgetCommon::name plugin->named = FALSE; // save/reset retry count plugin->retry_count += common->retry_count; common->retry_count = 0; // save/reset elapsed plugin->elapsed += plugin->target_progress->elapsed; plugin->target_progress->elapsed = 0; uget_plugin_agent_global_get(UGET_PLUGIN_AGENT_GLOBAL_PLUGIN, &plugin_info); // create target_plugin to download plugin->target_plugin = uget_plugin_new(plugin_info); uget_plugin_accept(plugin->target_plugin, plugin->target_info); uget_plugin_ctrl_speed(plugin->target_plugin, plugin->limit); if (uget_plugin_start(plugin->target_plugin) == FALSE) { msg = uget_event_new_error(UGET_EVENT_ERROR_THREAD_CREATE_FAILED, NULL); uget_plugin_post((UgetPlugin*) plugin, msg); } do { // sleep 0.5 second ug_sleep(500); // stop target_plugin when user paused this plug-in. if (plugin->paused) { uget_plugin_stop(plugin->target_plugin); break; } if (plugin->limit_changed) { plugin->limit_changed = FALSE; uget_plugin_ctrl_speed(plugin->target_plugin, plugin->limit); } // move event from target_plugin to plug-in msg = uget_plugin_pop((UgetPlugin*) plugin->target_plugin); for (; msg; msg = msg_next) { msg_next = msg->next; msg->prev = NULL; msg->next = NULL; // handle or discard some message switch (msg->type) { case UGET_EVENT_NAME: // tell plugin_sync() to change file name plugin->file_renamed = TRUE; break; case UGET_EVENT_ERROR: // stop downloading if error occurred plugin->paused = TRUE; break; case UGET_EVENT_STOP: case UGET_EVENT_COMPLETED: // discard message uget_event_free(msg); continue; } // post event to plug-in uget_plugin_post((UgetPlugin*) plugin, msg); } // sync data in plugin_sync() plugin->synced = FALSE; uget_plugin_lock(plugin); uget_plugin_sync(plugin->target_plugin, plugin->target_info); uget_plugin_unlock(plugin); } while (uget_plugin_get_state(plugin->target_plugin)); // free target_plugin uget_plugin_unref(plugin->target_plugin); plugin->target_plugin = NULL; } common->uri = NULL; // Don't free common->uri again. if (plugin->paused == FALSE && umitem == NULL) { uget_plugin_post((UgetPlugin*) plugin, uget_event_new(UGET_EVENT_COMPLETED)); } uget_plugin_post((UgetPlugin*)plugin, uget_event_new(UGET_EVENT_STOP)); exit: plugin->stopped = TRUE; uget_media_free(umedia); uget_plugin_unref((UgetPlugin*) plugin); return UG_THREAD_RESULT; } static int is_file_completed(const char* file, const char* folder) { char* path; char* temp; int result = FALSE; if (folder == NULL) path = ug_strdup(file); else path = ug_build_filename(folder, file, NULL); if (ug_file_is_exist(path)) { temp = ug_strdup_printf("%s.%s", path, "aria2"); ug_free(path); path = temp; if (ug_file_is_exist(path) == FALSE) result = TRUE; } // debug // if (result) // printf("%s is completed\n", path); ug_free(path); return result; } uget-2.2.2/uget/CMakeLists.txt0000664000175000017500000000206013470304402013103 00000000000000cmake_minimum_required(VERSION 3.4.1) project(uget) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNDEBUG") # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_RETRY_IF_CONNECT_FAILED") include_directories( ${CURL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../uglib ) add_library( uget STATIC UgetSequence.c UgetRpc.c UgetOption.c UgetData.c UgetFiles.c UgetNode.c UgetNode-compare.c UgetNode-filter.c UgetTask.c UgetHash.c UgetSite.c UgetApp.c UgetEvent.c UgetPlugin.c UgetA2cf.c UgetCurl.c UgetAria2.c UgetMedia.c UgetMedia-youtube.c UgetPluginCurl.c UgetPluginAria2.c UgetPluginMedia.c UgetPluginAgent.c UgetPluginMega.c ) uget-2.2.2/uget/UgetEvent.c0000664000175000017500000001535713470304402012432 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include // va_list, va_start(), va_end() #include #include #include #ifdef HAVE_GLIB #include // g_slice_xxx #include #else #define N_(x) x #endif // UGET_EVENT_NORMAL static const char* normal_msg[] = { NULL, // UGET_EVENT_NORMAL_CUSTOM N_("Connecting..."), // UGET_EVENT_NORMAL_CONNECT N_("Transmitting..."), // UGET_EVENT_NORMAL_TRANSMIT, N_("Retry"), // UGET_EVENT_NORMAL_RETRY, N_("Download completed"), // UGET_EVENT_NORMAL_COMPLETE, N_("Finished"), // UGET_EVENT_NORMAL_FINISH, // resumable N_("Resumable"), // UGET_EVENT_NORMAL_RESUMABLE, N_("Not Resumable"), // UGET_EVENT_NORMAL_NOT_RESUMABLE, }; static const int n_normal_msg = sizeof (normal_msg) / sizeof (char*); // UGET_EVENT_WARNING static const char* warning_msg[] = { NULL, // UGET_EVENT_WARNING_CUSTOM N_("Output file can't be renamed."), // UGET_EVENT_WARNING_FILE_RENAME_FAILED }; static const int n_warning_msg = sizeof (warning_msg) / sizeof (char*); // UGET_EVENT_ERROR static const char* error_msg[] = { NULL, // UGET_EVENT_ERROR_CUSTOM N_("couldn't connect to host."), // UGET_EVENT_ERROR_CONNECT_FAILED N_("Folder can't be created."), // UGET_EVENT_ERROR_FOLDER_CREATE_FAILED N_("File can't be created (bad filename or file exist)."), // UGET_EVENT_ERROR_FILE_CREATE_FAILED N_("File can't be opened."), // UGET_EVENT_ERROR_FILE_OPEN_FAILED N_("Unable to create thread."), // UGET_EVENT_ERROR_THREAD_CREATE_FAILED, N_("Incorrect source (different file size)."), // UGET_EVENT_ERROR_INCORRECT_SOURCE, N_("Out of resource (disk full or run out of memory)."), // UGET_EVENT_ERROR_OUT_OF_RESOURCE N_("No output file."), // UGET_EVENT_ERROR_NO_OUTPUT_FILE N_("No output setting."), // UGET_EVENT_ERROR_NO_OUTPUT_SETTING N_("Too many retries."), // UGET_EVENT_ERROR_TOO_MANY_RETRIES N_("Unsupported scheme (protocol)."), // UGET_EVENT_ERROR_UNSUPPORTED_SCHEME N_("Unsupported file."), // UGET_EVENT_ERROR_UNSUPPORTED_FILE N_("post file not found."), // UGET_EVENT_ERROR_POST_FILE_NOT_FOUND N_("cookie file not found."), // UGET_EVENT_ERROR_COOKIE_FILE_NOT_FOUND }; static const int n_error_msg = sizeof (error_msg) / sizeof (char*); // extern const UgEntry UgetEventEntry[] = { {"string", offsetof (UgetEvent, string), UG_ENTRY_STRING, NULL, NULL}, {"type", offsetof (UgetEvent, type), UG_ENTRY_INT, NULL, NULL}, {"time", offsetof (UgetEvent, time), UG_ENTRY_CUSTOM, ug_json_parse_time_t, ug_json_write_time_t}, {NULL} // null-terminated }; UgetEvent* uget_event_new (UgetEventType type, ...) { UgetEvent* event; va_list arg_list; #ifdef HAVE_GLIB event = g_slice_alloc0 (sizeof (UgetEvent)); #else event = ug_malloc0 (sizeof (UgetEvent)); #endif event->self = event; event->time = time (NULL); event->type = type; event->string = NULL; va_start (arg_list, type); switch (type) { case UGET_EVENT_ERROR: event->value.code = va_arg (arg_list, int); event->string = va_arg (arg_list, char*); if (event->string) event->string = ug_strdup (event->string); else if (event->value.code < n_error_msg) { #ifdef HAVE_GLIB event->string = ug_strdup (gettext (error_msg[event->value.code])); #else event->string = ug_strdup (error_msg[event->value.code]); #endif // HAVE_GLIB } break; case UGET_EVENT_NORMAL: event->value.code = va_arg (arg_list, int); event->string = va_arg (arg_list, char*); if (event->string) event->string = ug_strdup (event->string); else if (event->value.code < n_normal_msg) { #ifdef HAVE_GLIB event->string = ug_strdup (gettext (normal_msg[event->value.code])); #else event->string = ug_strdup (normal_msg[event->value.code]); #endif // HAVE_GLIB } break; case UGET_EVENT_WARNING: event->value.code = va_arg (arg_list, int); event->string = va_arg (arg_list, char*); if (event->string) event->string = ug_strdup (event->string); else if (event->value.code < n_warning_msg) { #ifdef HAVE_GLIB event->string = ug_strdup (gettext (warning_msg[event->value.code])); #else event->string = ug_strdup (warning_msg[event->value.code]); #endif // HAVE_GLIB } break; default: break; } va_end (arg_list); return event; } void uget_event_free (UgetEvent* event) { ug_free (event->string); #ifdef HAVE_GLIB g_slice_free1 (sizeof (UgetEvent), event); #else ug_free (event); #endif } uget-2.2.2/tests/0000775000175000017500000000000013470305212010623 500000000000000uget-2.2.2/tests/test-uget.c0000664000175000017500000003370413470304402012637 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include //#include #include #include #include #include #include // ---------------------------------------------------------------------------- // UgetNode UgEntry NodeChildrenEntry[] = { {NULL, 0, UG_ENTRY_ARRAY, (UgJsonParseFunc) ug_json_parse_uget_node_children, (UgJsonWriteFunc) ug_json_write_uget_node_children}, {NULL} }; void init_node (UgetNode* parent) { UgetNode* newone; UgetNode* newtwo; newone = uget_node_new (NULL); uget_node_append (parent, newone); newtwo = uget_node_new (NULL); uget_node_append (parent, newtwo); parent = newtwo; newone = uget_node_new (NULL); uget_node_append (parent, newone); newtwo = uget_node_new (NULL); uget_node_append (parent, newtwo); } // "01-03-02" void dump_int_array (UgArrayInt* array) { int index; for (index = 0; index < array->length; index++) { if (index) printf ("-"); printf ("%.2d", array->at[index]); } puts (""); } void dump_fake_path (UgetNode* node, UgArrayInt* array) { UgetNode* cur; int index; for (index = 0, cur = node->fake; cur; cur = cur->peer, index++) { *(int*) ug_array_alloc(array, 1) = index; dump_int_array (array); dump_fake_path (cur, array); array->length--; } } void print_fake_path (UgetNode* node) { UgArrayInt array; ug_array_init(&array, sizeof (int), 20); dump_fake_path (node, &array); ug_array_clear (&array); } void test_fake_path () { UgetNode* node; UgetNode* fake0; UgetNode* fake1; UgetNode* fake2; node = uget_node_new (NULL); fake0 = uget_node_new (node); fake1 = uget_node_new (node); fake2 = uget_node_new (node); uget_node_new (fake0); uget_node_new (fake1); uget_node_new (fake1); uget_node_new (fake2); uget_node_new (fake2); uget_node_new (fake2); print_fake_path (node); uget_node_free (node); } void parse_node (UgetNode* parent) { int code; UgJson json; const char* json_string = { "[" " {" " \"name\": null," " \"type\": 1," " \"info\": {" " }," " \"children\": [" " ]" " }," " {" " \"name\": null," " \"type\": 2," " \"info\": {" " }," " \"children\": [" " {" " \"name\": null," " \"type\": 3," " \"info\": {" " }," " \"children\": [" " ]" " }," " {" " \"name\": null," " \"type\": 4," " \"info\": {" " }," " \"children\": [" " ]" " }" " ]" " }" "]" }; ug_json_init (&json); ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of array ug_json_push (&json, ug_json_parse_entry, parent, NodeChildrenEntry); #else // method 2: push ug_json_parse_array() to parse start of array ug_json_push (&json, ug_json_parse_uget_node_children, parent, NULL); ug_json_push (&json, ug_json_parse_array, NULL, NULL); #endif code = ug_json_parse (&json, json_string, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); ug_json_final (&json); } // UgBufferFunc static int buffer_to_file (UgBuffer* buffer) { FILE* file = buffer->data; printf ("write %d bytes to file\n", ug_buffer_length (buffer)); fwrite (buffer->beg, 1, ug_buffer_length(buffer), file); buffer->cur = buffer->beg; return 0; } void write_node_to_file (UgetNode* node, char* filename) { UgBuffer buffer; UgJson json; FILE* file; file = fopen (filename, "w"); ug_buffer_init (&buffer, 128); buffer.more = buffer_to_file; buffer.data = file; ug_json_init (&json); ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); #if 1 // method 1: use UgEntry to write start of object ug_json_write_entry (&json, node, NodeChildrenEntry); #else // method 2: call ug_json_write_object_head() to write start of object ug_json_write_array_head (&json); ug_json_write_uget_node_children (&json, node); ug_json_write_array_tail (&json); #endif ug_json_end_write (&json); ug_json_final (&json); ug_buffer_clear (&buffer, 1); fclose (file); } void test_uget_node () { UgetNode* root; root = uget_node_new (NULL); #if 0 init_node (root); #else parse_node (root); #endif write_node_to_file (root, "test-UgetNode.json"); } // ---------------------------------------------------------------------------- // UgetA2cf void print_bitfield (uint8_t* bytes, int length) { int count; int index; int temp; for (index = 0; index < length; index++) { for (count = 0; count < 8; count++) { temp = (bytes[0] << count) & 0x80; if (temp) printf ("1"); else printf ("0"); } printf ("\n"); bytes++; } } void print_a2cf (UgetA2cf* a2cf) { UgetA2cfPiece* piece; if (a2cf == NULL) return; printf ("ver : %d\n", (int)a2cf->ver); printf ("ext : %d\n", (int)a2cf->ext); printf ("info_hash_len : %d\n", (int)a2cf->info_hash_len); printf ("piece_len : %d\n", (int)a2cf->piece_len); printf ("total_len : %d\n", (int)a2cf->total_len); printf ("upload_len : %d\n", (int)a2cf->upload_len); printf ("bitfield_len : %d\n", (int)a2cf->bitfield_len); if (a2cf->bitfield_len) { printf ("bitfield:\n"); print_bitfield (a2cf->bitfield, a2cf->bitfield_len); } printf ("n_pieces : %d\n", (int)a2cf->piece.list.size); for (piece = (void*)a2cf->piece.list.head; piece; piece = piece->next) { printf ("index : %d\n", (int)piece->index); printf ("length : %d\n", (int)piece->length); printf ("bitfield_length : %d\n", (int)piece->bitfield_len); printf ("bitfield:\n"); print_bitfield (piece->bitfield, piece->bitfield_len); } } void test_uget_a2cf (void) { UgetA2cf a2cf; const char* fname; uint64_t beg, end; memset (&a2cf, 0, sizeof (UgetA2cf)); fname = "D:\\Downloads\\TestData-Aria2\\npp.6.4.2.Installer.exe.aria2-1"; printf ("%s\n", fname); uget_a2cf_load (&a2cf, fname); print_a2cf (&a2cf); uget_a2cf_clear (&a2cf); fname = "D:\\Downloads\\TestData-Aria2\\npp.6.4.2.Installer.exe.aria2-2"; printf ("%s\n", fname); uget_a2cf_load (&a2cf, fname); // fill beg = 3145728 + 16384 * 2; end = 5242880 + 16384 * 4 + 1; // beg = 7340032; // + 16384 * 2; // end = 7401344; printf ("fill %d - %d\n", (int)beg, (int)end); printf ("fill result %d\n", (int)uget_a2cf_fill (&a2cf, beg, end)); // lack beg = 0; // beg = 3145728 - 16384 * 2; // beg = 5242880; // beg = 7340032; // beg = 7401344; if (uget_a2cf_lack (&a2cf, &beg, &end)) printf ("lack %d - %d\n", (int)beg, (int)end); print_a2cf (&a2cf); // completed printf ("completed: %u\n", (unsigned)uget_a2cf_completed (&a2cf)); // clear uget_a2cf_clear (&a2cf); fname = "D:\\Downloads\\TestData-Aria2\\npp.6.4.3.Installer.exe.aria2"; printf ("%s\n", fname); uget_a2cf_load (&a2cf, fname); print_a2cf (&a2cf); // lack beg = 0; uget_a2cf_lack (&a2cf, &beg, &end); printf ("lack %d - %d\n", (int)beg, (int)end); uget_a2cf_clear (&a2cf); fname = "D:\\Downloads\\TestData-Aria2\\ubuntu-13.04-desktop-amd64.iso.aria2"; printf ("%s\n", fname); uget_a2cf_load (&a2cf, fname); print_a2cf (&a2cf); uget_a2cf_clear (&a2cf); fname = "D:\\Downloads\\TestData-Aria2\\eclipse-cpp-kepler-R-win32.zip.aria2"; printf ("%s\n", fname); uget_a2cf_load (&a2cf, fname); print_a2cf (&a2cf); uget_a2cf_clear (&a2cf); } // ---------------------------------------------------------------------------- // UgetCurl void test_uget_curl (void) { UgetCurl* ugcurl; ugcurl = uget_curl_new (); uget_curl_set_url (ugcurl, "http://msysgit.googlecode.com/files/Git-1.8.5.2-preview20131230.exe"); uget_curl_open_file (ugcurl, NULL); ugcurl->header_store = TRUE; uget_curl_run (ugcurl, TRUE); ug_thread_join (&ugcurl->thread); uget_curl_free (ugcurl); } // ---------------------------------------------------------------------------- // UgetRss void test_uget_rss (void) { UgetRss* urss; UgetRssFeed* feed; UgetRssItem* item = NULL; urss = uget_rss_new (); uget_rss_add_builtin (urss, UGET_RSS_STABLE); uget_rss_update (urss, TRUE); ug_thread_join (&urss->thread); feed = uget_rss_find_updated (urss, NULL); if (feed) item = uget_rss_feed_find (feed, -1); if (item) printf ("title %s\n", item->title); uget_rss_unref (urss); } // ---------------------------------------------------------------------------- // UgetMedia void test_media (void) { UgetMedia* umedia; UgetMediaItem* umitem; int count; char* uri; uri = "https://www.youtube.com/watch?v=y2004Xaz2HU"; count = uget_site_get_id (uri); umedia = uget_media_new (uri, UGET_SITE_YOUTUBE); count = uget_media_grab_items (umedia, NULL); printf ("\nget %d media item\n", count); umitem = uget_media_match (umedia, UGET_MEDIA_MATCH_1, UGET_MEDIA_QUALITY_UNKNOWN, UGET_MEDIA_TYPE_MP4); // umitem = uget_media_match (umedia, // UGET_MEDIA_MATCH_0, // UGET_MEDIA_QUALITY_UNKNOWN, // UGET_MEDIA_TYPE_MP4); for (; umitem; umitem = umitem->next) { // printf ("URL %s" "\n", umitem->url); printf ("quality %d, type %d, has_url %d\n", umitem->quality, umitem->type, (umitem->url) ? 1 : 0); } uget_media_free (umedia); } // ---------------------------------------------------------------------------- // UgetSeq void test_seq (void) { UgetSequence useq; UgList list; UgLink* link; ug_list_init (&list); uget_sequence_init (&useq); // digits uget_sequence_add (&useq, 0, 5, 2); // ASCII or Unicode uget_sequence_add (&useq, 'a', 'b', 0); uget_sequence_add (&useq, 0x7532, 0x7535, 0); printf (" --- sequence --- count = %d\n", uget_sequence_count (&useq, "http://sample/*-*-*.mp4")); uget_sequence_get_list (&useq, "http://sample/*-*-*.mp4", &list); for (link = list.head; link; link = link->next) puts (link->data); uget_sequence_clear_result(&list); puts (" --- preview ---"); uget_sequence_get_preview (&useq, "http://sample/*-*.mp4", &list); for (link = list.head; link; link = link->next) puts (link->data); uget_sequence_clear_result(&list); uget_sequence_final (&useq); } // ---------------------------------------------------------------------------- // UgetFiles void test_files_json(UgetFiles* files) { UgJson json; UgBuffer buffer; UgJsonError code; UgetFiles* files2; ug_json_init(&json); ug_buffer_init(&buffer, 4096); // write ug_json_begin_write(&json, UG_JSON_FORMAT_INDENT, &buffer); ug_json_write_object_head(&json); ug_json_write_entry(&json, files, files->info->entry); ug_json_write_object_tail(&json); ug_json_end_write(&json); ug_buffer_write_char(&buffer, '\0'); puts("\n--- print files ---"); puts(buffer.beg); files2 = ug_data_new(UgetFilesInfo); // parse ug_json_begin_parse(&json); ug_json_push(&json, ug_json_parse_entry, files2, (void*)files2->info->entry); ug_json_push(&json, ug_json_parse_object, NULL, NULL); code = ug_json_parse(&json, buffer.beg, -1); ug_json_end_parse(&json); printf("\n" "parse return %d\n", code); // write buffer.cur = buffer.beg; ug_json_begin_write(&json, UG_JSON_FORMAT_INDENT, &buffer); ug_json_write_entry(&json, files2, files2->info->entry); ug_json_end_write(&json); ug_buffer_write_char(&buffer, '\0'); puts("\n--- print files2 ---"); puts(buffer.beg); ug_data_free(files2); ug_buffer_clear(&buffer, TRUE); ug_json_final(&json); } void test_files(void) { UgetFiles* files; UgetFiles* src; UgetFile* element; files = ug_data_new(UgetFilesInfo); src = ug_data_new(UgetFilesInfo); element = uget_files_realloc(files, "0.mp4"); element = uget_files_realloc(files, "1.mp4"); element = uget_files_realloc(files, "2.mp4"); element = uget_files_realloc(files, "xyz.mp4"); test_files_json(files); element = uget_files_realloc(src, "0.mp4"); element = uget_files_realloc(src, "1.mp4"); element = uget_files_realloc(src, "2.mp4"); element = uget_files_realloc(src, "3.mp4"); element = uget_files_realloc(src, "foo.mp4"); element = uget_files_realloc(src, "xxx.apk"); uget_files_sync(files, src); test_files_json(files); element->state |= UGET_FILE_STATE_DELETED; src->sync_count++; uget_files_sync(files, src); test_files_json(files); ug_data_free(files); ug_data_free(src); } // ---------------------------------------------------------------------------- // main int main (void) { // test_uget_node (); // test_fake_path (); // test_uget_a2cf (); // test_uget_curl (); // test_uget_rss (); // test_media (); // test_seq (); test_files(); return 0; } uget-2.2.2/tests/Makefile.in0000664000175000017500000006134413470304626012630 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = test-json$(EXEEXT) test-jsonrpc$(EXEEXT) \ test-plugin+app$(EXEEXT) test-info$(EXEEXT) \ test-uglib$(EXEEXT) test-uget$(EXEEXT) @WITH_LIBPWMD_TRUE@am__append_1 = @LIBPWMD_LIBS@ subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_test_info_OBJECTS = test-info.$(OBJEXT) test_info_OBJECTS = $(am_test_info_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) test_info_DEPENDENCIES = $(top_builddir)/uglib/libuglib.a \ $(am__DEPENDENCIES_2) am_test_json_OBJECTS = test-json.$(OBJEXT) test_json_OBJECTS = $(am_test_json_OBJECTS) test_json_DEPENDENCIES = $(top_builddir)/uglib/libuglib.a \ $(am__DEPENDENCIES_2) am_test_jsonrpc_OBJECTS = test-jsonrpc.$(OBJEXT) test_jsonrpc_OBJECTS = $(am_test_jsonrpc_OBJECTS) test_jsonrpc_DEPENDENCIES = $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a $(am__DEPENDENCIES_2) am_test_plugin_app_OBJECTS = \ test_plugin_app-test-plugin+app.$(OBJEXT) test_plugin_app_OBJECTS = $(am_test_plugin_app_OBJECTS) test_plugin_app_DEPENDENCIES = $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a $(am__DEPENDENCIES_2) am_test_uget_OBJECTS = test-uget.$(OBJEXT) test_uget_OBJECTS = $(am_test_uget_OBJECTS) test_uget_DEPENDENCIES = $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a $(am__DEPENDENCIES_2) am_test_uglib_OBJECTS = test-uglib.$(OBJEXT) test_uglib_OBJECTS = $(am_test_uglib_OBJECTS) test_uglib_DEPENDENCIES = $(top_builddir)/uglib/libuglib.a \ $(am__DEPENDENCIES_2) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/test-info.Po \ ./$(DEPDIR)/test-json.Po ./$(DEPDIR)/test-jsonrpc.Po \ ./$(DEPDIR)/test-uget.Po ./$(DEPDIR)/test-uglib.Po \ ./$(DEPDIR)/test_plugin_app-test-plugin+app.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(test_info_SOURCES) $(test_json_SOURCES) \ $(test_jsonrpc_SOURCES) $(test_plugin_app_SOURCES) \ $(test_uget_SOURCES) $(test_uglib_SOURCES) DIST_SOURCES = $(test_info_SOURCES) $(test_json_SOURCES) \ $(test_jsonrpc_SOURCES) $(test_plugin_app_SOURCES) \ $(test_uget_SOURCES) $(test_uglib_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # test-uglib-cxx test-uget-cxx TESTS_LIBS = @PTHREAD_LIBS@ @CURL_LIBS@ @GLIB_LIBS@ $(am__append_1) # set the include path found by configure AM_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget AM_CFLAGS = @PTHREAD_CFLAGS@ @LFS_CFLAGS@ @CURL_CFLAGS@ @GLIB_CFLAGS@ AM_LDFLAGS = @LFS_LDFLAGS@ # test_json_CPPFLAGS = -I$(top_srcdir)/uglib test_json_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_json_SOURCES = test-json.c # test_jsonrpc_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget test_jsonrpc_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_jsonrpc_SOURCES = test-jsonrpc.c test_plugin_app_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget @LIBGCRYPT_CFLAGS@ @LIBCRYPTO_CFLAGS@ test_plugin_app_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) @LIBGCRYPT_LIBS@ @LIBCRYPTO_LIBS@ test_plugin_app_SOURCES = test-plugin+app.c # test_info_CPPFLAGS = -I$(top_srcdir)/uglib test_info_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_info_SOURCES = test-info.c # test_uglib_CPPFLAGS = -I$(top_srcdir)/uglib test_uglib_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_uglib_SOURCES = test-uglib.c # test_uget_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget test_uget_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_uget_SOURCES = test-uget.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) test-info$(EXEEXT): $(test_info_OBJECTS) $(test_info_DEPENDENCIES) $(EXTRA_test_info_DEPENDENCIES) @rm -f test-info$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_info_OBJECTS) $(test_info_LDADD) $(LIBS) test-json$(EXEEXT): $(test_json_OBJECTS) $(test_json_DEPENDENCIES) $(EXTRA_test_json_DEPENDENCIES) @rm -f test-json$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_json_OBJECTS) $(test_json_LDADD) $(LIBS) test-jsonrpc$(EXEEXT): $(test_jsonrpc_OBJECTS) $(test_jsonrpc_DEPENDENCIES) $(EXTRA_test_jsonrpc_DEPENDENCIES) @rm -f test-jsonrpc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_jsonrpc_OBJECTS) $(test_jsonrpc_LDADD) $(LIBS) test-plugin+app$(EXEEXT): $(test_plugin_app_OBJECTS) $(test_plugin_app_DEPENDENCIES) $(EXTRA_test_plugin_app_DEPENDENCIES) @rm -f test-plugin+app$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_plugin_app_OBJECTS) $(test_plugin_app_LDADD) $(LIBS) test-uget$(EXEEXT): $(test_uget_OBJECTS) $(test_uget_DEPENDENCIES) $(EXTRA_test_uget_DEPENDENCIES) @rm -f test-uget$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_uget_OBJECTS) $(test_uget_LDADD) $(LIBS) test-uglib$(EXEEXT): $(test_uglib_OBJECTS) $(test_uglib_DEPENDENCIES) $(EXTRA_test_uglib_DEPENDENCIES) @rm -f test-uglib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_uglib_OBJECTS) $(test_uglib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-info.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-json.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-jsonrpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-uget.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-uglib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_plugin_app-test-plugin+app.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` test_plugin_app-test-plugin+app.o: test-plugin+app.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_plugin_app_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_plugin_app-test-plugin+app.o -MD -MP -MF $(DEPDIR)/test_plugin_app-test-plugin+app.Tpo -c -o test_plugin_app-test-plugin+app.o `test -f 'test-plugin+app.c' || echo '$(srcdir)/'`test-plugin+app.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_plugin_app-test-plugin+app.Tpo $(DEPDIR)/test_plugin_app-test-plugin+app.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-plugin+app.c' object='test_plugin_app-test-plugin+app.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_plugin_app_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_plugin_app-test-plugin+app.o `test -f 'test-plugin+app.c' || echo '$(srcdir)/'`test-plugin+app.c test_plugin_app-test-plugin+app.obj: test-plugin+app.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_plugin_app_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_plugin_app-test-plugin+app.obj -MD -MP -MF $(DEPDIR)/test_plugin_app-test-plugin+app.Tpo -c -o test_plugin_app-test-plugin+app.obj `if test -f 'test-plugin+app.c'; then $(CYGPATH_W) 'test-plugin+app.c'; else $(CYGPATH_W) '$(srcdir)/test-plugin+app.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_plugin_app-test-plugin+app.Tpo $(DEPDIR)/test_plugin_app-test-plugin+app.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-plugin+app.c' object='test_plugin_app-test-plugin+app.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_plugin_app_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_plugin_app-test-plugin+app.obj `if test -f 'test-plugin+app.c'; then $(CYGPATH_W) 'test-plugin+app.c'; else $(CYGPATH_W) '$(srcdir)/test-plugin+app.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/test-info.Po -rm -f ./$(DEPDIR)/test-json.Po -rm -f ./$(DEPDIR)/test-jsonrpc.Po -rm -f ./$(DEPDIR)/test-uget.Po -rm -f ./$(DEPDIR)/test-uglib.Po -rm -f ./$(DEPDIR)/test_plugin_app-test-plugin+app.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/test-info.Po -rm -f ./$(DEPDIR)/test-json.Po -rm -f ./$(DEPDIR)/test-jsonrpc.Po -rm -f ./$(DEPDIR)/test-uget.Po -rm -f ./$(DEPDIR)/test-uglib.Po -rm -f ./$(DEPDIR)/test_plugin_app-test-plugin+app.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile #test_uglib_cxx_CPPFLAGS = -I$(top_srcdir)/uglib #test_uglib_cxx_CXXFLAGS = -std=c++11 #test_uglib_cxx_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) #test_uglib_cxx_SOURCES = test-uglib-cxx.cxx #test_uget_cxx_CXXFLAGS = -std=c++11 #test_uget_cxx_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) #test_uget_cxx_SOURCES = test-uget-cxx.cxx # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/tests/test-jsonrpc.c0000664000175000017500000003015613470304402013347 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #else #include // sleep() #endif #if defined _WIN32 || defined _WIN64 #define ug_sleep Sleep #else #define ug_sleep(millisecond) usleep (millisecond * 1000) #endif static void socket_receiver (UgSocketServer* server, SOCKET client_fd, void* data) { char buf[5]; ug_socket_server_ref (server); // ug_socket_recv (client_fd, buf, 5, 0); recv (client_fd, buf, 5, 0); puts ("socket server: get ping"); // ug_socket_send (client_fd, "pong", 4, 0); send (client_fd, "pong", 4, 0); // ug_socket_close (client_fd); closesocket (client_fd); ug_socket_server_unref (server); } void test_socket_server_client (SOCKET server_fd, SOCKET client_fd) { UgSocketServer* server; char buf[5]; server = ug_socket_server_new (server_fd); ug_socket_server_set_receiver (server, socket_receiver, NULL); ug_socket_server_start (server); // --- client begin --- // ug_socket_send (client_fd, "ping", 4, 0); send (client_fd, "ping", 4, 0); // ug_socket_recv (client_fd, buf, 5, 0); recv (client_fd, buf, 5, 0); puts ("socket client: get pong"); // ug_socket_close (client_fd); // close (client_fd); closesocket (client_fd); // --- client end --- ug_socket_server_stop (server); ug_socket_server_unref (server); } void test_socket (void) { SOCKET server_fd; SOCKET client_fd; puts ("------------------"); // server_fd = ug_socket_new (AF_INET, SOCK_STREAM, 0); server_fd = socket (AF_INET, SOCK_STREAM, 0); ug_socket_listen (server_fd, "127.0.0.1", "8088", 5); // client_fd = ug_socket_new (AF_INET, SOCK_STREAM, 0); client_fd = socket (AF_INET, SOCK_STREAM, 0); ug_socket_connect (client_fd, "127.0.0.1", "8088"); test_socket_server_client (server_fd, client_fd); ug_sleep (1000); #if !(defined _WIN32 || defined _WIN64) puts ("------------------"); // server_fd = ug_socket_new (AF_INET, SOCK_STREAM, 0); server_fd = socket (AF_UNIX, SOCK_STREAM, 0); ug_socket_listen_unix (server_fd, "/tmp/test-socket-unix", -1, 5); // client_fd = ug_socket_new (AF_INET, SOCK_STREAM, 0); client_fd = socket (AF_UNIX, SOCK_STREAM, 0); ug_socket_connect_unix (client_fd, "/tmp/test-socket-unix", -1); test_socket_server_client (server_fd, client_fd); ug_sleep (1000); #endif } // ---------------------------------------------------------------------------- // test parser & writer void parse_rpc_object (UgJsonrpcObject* jobj, const char* json_string) { UgJson json; int code; ug_json_init (&json); ug_json_begin_parse (&json); ug_json_push (&json, ug_json_parse_entry, jobj, (void*)UgJsonrpcObjectEntry); ug_json_push (&json, ug_json_parse_object, NULL, NULL); code = ug_json_parse (&json, json_string, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); ug_json_final (&json); } void print_rpc_object (UgJsonrpcObject* jobj) { UgJson json; UgBuffer buffer; ug_json_init (&json); ug_buffer_init (&buffer, 4096); ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); // ug_json_write_entry (&json, req, requestEntry); ug_json_write_rpc_object (&json, jobj); ug_json_end_write (&json); ug_json_final (&json); ug_buffer_write_char (&buffer, '\0'); puts (buffer.beg); } void test_rpc_parser (void) { UgJsonrpcArray* jarray; UgJsonrpcObject* jobj; const char* json_string1 = // "{\"jsonrpc\": \"2.0\", \"method\": \"update\", \"params\": [1,2,3,4,5], \"id\":1}"; "{\"jsonrpc\": \"2.0\", \"method\": \"foobar\", \"id\":2}"; const char* json_string2 = "{\"jsonrpc\": \"2.0\", \"error\": {\"code\": -32601, \"message\": \"Method not found.\"}, \"id\": 1}"; // "{\"jsonrpc\": \"2.0\", \"result\": 19, \"id\":1}"; const char* json_string3 = "{\"id\":2,\"jsonrpc\":\"2.0\",\"result\":\"fc585c5fec7319bf\"}"; puts ("----- test_rpc_parser()"); jarray = malloc (sizeof (UgJsonrpcArray)); ug_jsonrpc_array_init (jarray, 8); jobj = ug_jsonrpc_array_alloc (jarray); parse_rpc_object (jobj, json_string1); print_rpc_object (jobj); jobj = ug_jsonrpc_array_alloc (jarray); parse_rpc_object (jobj, json_string2); print_rpc_object (jobj); jobj = ug_jsonrpc_array_alloc (jarray); parse_rpc_object (jobj, json_string3); print_rpc_object (jobj); ug_jsonrpc_array_clear (jarray, 1); free (jarray); } void test_rpc_curl_packet (UgJsonrpcCurl* jrcurl) { int error; UgJsonrpcObject* request; UgJsonrpcObject* response; const char* json_string = "{" "\"jsonrpc\": \"2.0\"," "\"method\": \"aria2.addUri\"," "\"params\": [[\"http:\\/\\/localhost\\/file\"], {}]," "\"id\":2" "}"; request = ug_jsonrpc_object_new (); response = ug_jsonrpc_object_new (); parse_rpc_object (request, json_string); print_rpc_object (request); error = ug_jsonrpc_call (&jrcurl->rpc, request, response); if (error == 0) print_rpc_object (response); ug_jsonrpc_object_free (request); ug_jsonrpc_object_free (response); } void test_jsonrpc_curl (void) { // UgJsonrpcHttp* jrhttp; UgJsonrpcCurl* jrcurl; UgJsonrpcArray* jarray; puts ("----- test_jsonrpc_curl()"); // jrhttp = malloc (sizeof (UgJsonrpcHttp)); // ug_jsonrpc_http_init (jrhttp); jrcurl = malloc (sizeof (UgJsonrpcCurl)); ug_jsonrpc_curl_init (jrcurl); jarray = malloc (sizeof (UgJsonrpcArray)); ug_jsonrpc_array_init (jarray, 8); // ug_jsonrpc_http_set_client (jrhttp, "http://localhost:6800/jsonrpc"); // test_rpc_http_packet (jrhttp); ug_jsonrpc_curl_set_url (jrcurl, "http://localhost:6800/jsonrpc"); // test_rpc_curl_packet (jrcurl); // ug_jsonrpc_http_final (jrhttp); // free (jrhttp); ug_jsonrpc_curl_final (jrcurl); free (jrcurl); ug_jsonrpc_array_clear (jarray, 1); free (jarray); } // ---------------------------------------------------------------------------- // test UgJsonrpcSocket static void jsonrpc_accepted (UgJsonrpc* jrpc, void* data, void* data2) { UgJsonrpcObject* request; UgJsonrpcObject* response; int result; request = ug_jsonrpc_object_new (); response = ug_jsonrpc_object_new (); response->result.type = UG_VALUE_STRING; response->result.c.string = "pong"; do { result = ug_jsonrpc_receive (jrpc, request, NULL); if (result == UG_JSON_OBJECT) { print_rpc_object (request); response->id.type = request->id.type; response->id.c = request->id.c; ug_jsonrpc_response (jrpc, response); ug_jsonrpc_object_clear (request); } } while (result != 0); response->id.type = UG_JSON_NULL; response->result.c.string = NULL; ug_jsonrpc_object_free (response); ug_jsonrpc_object_free (request); puts ("server: client connection closed."); } void test_jsonrpc_socket (void) { UgJsonrpcObject* request; UgJsonrpcObject* response; UgJsonrpcSocket* jclient; UgSocketServer* server; #if 0 UgJsonrpcSocket* jserver; #endif puts ("----- test_jsonrpc_socket()"); server = ug_socket_server_new_addr ("127.0.0.1", "14777"); if (server == NULL) { puts ("failed to create UgJsonrpcSocketServer"); return; } #if 0 jserver = ug_malloc (sizeof (UgJsonrpcSocket)); ug_jsonrpc_socket_init (jserver); ug_jsonrpc_socket_use_server (jserver, server, jsonrpc_accepted, NULL, NULL); ug_socket_server_start (server); #else ug_socket_server_run_jsonrpc (server, jsonrpc_accepted, NULL, NULL); #endif ug_sleep (1000); jclient = ug_malloc (sizeof (UgJsonrpcSocket)); ug_jsonrpc_socket_init (jclient); ug_jsonrpc_socket_connect (jclient, "127.0.0.1", "14777"); // ping server request = ug_jsonrpc_object_new (); response = ug_jsonrpc_object_new (); request->method_static = "ping"; ug_jsonrpc_call (&jclient->rpc, request, response); print_rpc_object (response); ug_jsonrpc_object_free (response); ug_jsonrpc_object_free (request); ug_jsonrpc_socket_close (jclient); ug_jsonrpc_socket_final (jclient); ug_free (jclient); ug_sleep (1000); #if 0 ug_jsonrpc_socket_final(jserver); #endif ug_socket_server_stop (server); ug_socket_server_unref (server); } // ---------------------------------------------------------------------------- // test_uget_aria2 void test_uget_aria2_rpc_object (UgetAria2* uaria2) { UgValue* value; UgValue* vobj; UgJsonrpcObject* req1; UgJsonrpcObject* res1; UgJsonrpcObject* req2; UgJsonrpcObject* res2; // request 1 req1 = uget_aria2_alloc (uaria2, TRUE, TRUE); req1->method_static = "aria2.getGlobalStat"; uget_aria2_request (uaria2, req1); // request 2 req2 = uget_aria2_alloc (uaria2, TRUE, TRUE); req2->method_static = "aria2.changeGlobalOption"; ug_value_init_array (&req2->params, 2); vobj = ug_value_alloc (&req2->params, 1); ug_value_init_object (vobj, 2); value = ug_value_alloc (vobj, 1); value->name = "max-overall-download-limit"; value->type = UG_VALUE_STRING; value->c.string = "100k"; value = ug_value_alloc (vobj, 1); value->name = "max-overall-upload-limit"; value->type = UG_VALUE_STRING; value->c.string = "100k"; uget_aria2_request (uaria2, req2); // response 1 res1 = uget_aria2_respond (uaria2, req1); if (res1) { print_rpc_object (res1); ug_value_sort_name (&res1->result); value = ug_value_find_name (&res1->result, "downloadSpeed"); printf ("current downloadSpeed %d\n", ug_value_get_int (value)); } // recycle 1 uget_aria2_recycle (uaria2, req1); uget_aria2_recycle (uaria2, res1); // response 2 res2 = uget_aria2_respond (uaria2, req2); if (res2) { print_rpc_object (res2); } // recycle 2 ug_value_foreach (&req2->params, ug_value_set_name_string, NULL); uget_aria2_recycle (uaria2, req2); uget_aria2_recycle (uaria2, res2); } void test_uget_aria2 (void) { UgetAria2* uaria2; puts ("----- test_uget_aria2()"); uaria2 = uget_aria2_new (); uget_aria2_start_thread (uaria2); #if defined _WIN32 || defined _WIN64 uget_aria2_set_path (uaria2, "C:\\Program Files\\uGet\\bin\\aria2c.exe"); #endif uget_aria2_launch (uaria2); uaria2->shutdown = TRUE; test_uget_aria2_rpc_object (uaria2); // uget_aria2_shutdown (uaria2); uget_aria2_stop_thread (uaria2); uget_aria2_unref (uaria2); ug_sleep (2000); } // ---------------------------------------------------------------------------- // main int main (void) { #if defined _WIN32 || defined _WIN64 WSADATA WSAData; WSAStartup (MAKEWORD (2, 2), &WSAData); #endif // _WIN32 || _WIN64 // libcurl curl_global_init (CURL_GLOBAL_ALL); test_socket (); test_rpc_parser (); test_jsonrpc_socket (); test_jsonrpc_curl (); test_uget_aria2 (); // libcurl curl_global_cleanup (); #if defined _WIN32 || defined _WIN64 WSACleanup (); #endif return 0; } uget-2.2.2/tests/test-json.c0000664000175000017500000005777613470304402012663 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include #include #include #include #include #include // ---------------------------------------------------------------------------- // WorkedId typedef struct { int worked; char* id; } WorkedId; UgJsonError worked_id_custom_parse (UgJson* json, const char* name, const char* value, void* dest, void* none); void worked_id_custom_write (UgJson* json, void* data); UgEntry WorkedIdEntry[] = { {"worked", offsetof (WorkedId, worked), UG_ENTRY_BOOL, NULL, NULL}, {"id", offsetof (WorkedId, id), UG_ENTRY_STRING, NULL, NULL}, {NULL}, }; // used by test_json_object_custom() UgEntry WorkedIdCustomEntry[] = { {NULL, 0, UG_ENTRY_CUSTOM, (UgJsonParseFunc) worked_id_custom_parse, (UgJsonWriteFunc) worked_id_custom_write }, {NULL} }; // ------------------------------------ // WorkedId functions void worked_id_init (WorkedId* wid) { wid->worked = 0; wid->id = NULL; } void worked_id_final (WorkedId* wid) { ug_free (wid->id); } WorkedId* worked_id_new (void) { WorkedId* wid; wid = ug_malloc (sizeof (WorkedId)); worked_id_init(wid); return wid; } void worked_id_free (WorkedId* wid) { worked_id_final (wid); } // UgEntry.type = UG_ENTRY_CUSTOM // UgEntry.param1 = (UgJsonParseFunc) worked_id_custom_parse UgJsonError worked_id_custom_parse (UgJson* json, const char* name, const char* value, void* dest, void* none) { // WorkedId's type is UG_JSON_OBJECT if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } // initialize WorkedId. If you have initialized it, don't initialize again. // worked_id_init (dest); // push JSON parser, only UG_JSON_OBJECT or UG_JSON_ARRAY need to push parser. ug_json_push (json, ug_json_parse_entry, dest, WorkedIdEntry); // return error code return UG_JSON_ERROR_NONE; } // UgEntry.type = UG_ENTRY_CUSTOM // UgEntry.param2 = (UgJsonWriteFunc) worked_id_custom_write void worked_id_custom_write (UgJson* json, void* data) { ug_json_write_object_head (json); ug_json_write_entry (json, data, WorkedIdEntry); ug_json_write_object_tail (json); } // ---------------------------------------------------------------------------- // WorkedIdArray typedef UG_ARRAY (WorkedId) WorkedIdArray; UgJsonError worked_id_array_parse (UgJson* json, const char* name, const char* value, void* array, void* none) { WorkedId* wid; // WorkedId's type is UG_JSON_OBJECT if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } wid = ug_array_alloc (array, 1); worked_id_init (wid); // push JSON parser, only UG_JSON_OBJECT or UG_JSON_ARRAY need to push parser. ug_json_push (json, ug_json_parse_entry, wid, WorkedIdEntry); // return error code return UG_JSON_ERROR_NONE; } void worked_id_array_write (UgJson* json, void* array) { WorkedId* cur; WorkedId* end; cur = ((WorkedIdArray*)array)->at; end = ((WorkedIdArray*)array)->at + ((WorkedIdArray*)array)->length; for (; cur < end; cur++) worked_id_custom_write (json, cur); } // ---------------------------------------------------------------------------- // SampleJs typedef struct { char* name; struct Info { struct FtpInfo { char* user; char* password; int active_mode; } ftp; struct HttpInfo { char* user_agent; char* referrer; } http; UgArrayStr sarray; UgArrayInt iarray; UG_ARRAY(WorkedId) oarray; } info; } SampleJs; // SampleJs.Info.FtpInfo UgEntry FtpInfoEntry[] = { {"user", offsetof (struct FtpInfo, user), UG_ENTRY_STRING, NULL, NULL}, {"password", offsetof (struct FtpInfo, password), UG_ENTRY_STRING, NULL, NULL}, {"active-mode",offsetof (struct FtpInfo, active_mode),UG_ENTRY_BOOL, NULL, NULL}, {NULL}, }; // SampleJs.Info.HttpInfo UgEntry HttpInfoEntry[] = { {"user-agent", offsetof (struct HttpInfo, user_agent), UG_ENTRY_STRING, NULL, NULL}, {"referrer", offsetof (struct HttpInfo, referrer), UG_ENTRY_STRING, NULL, NULL}, {NULL}, }; // SampleJs.Info UgEntry InfoEntry[] = { {"ftp", offsetof (struct Info, ftp), UG_ENTRY_OBJECT, FtpInfoEntry, (UgInitFunc) NULL}, {"http", offsetof (struct Info, http), UG_ENTRY_OBJECT, HttpInfoEntry, (UgInitFunc) NULL}, {"sarray", offsetof (struct Info, sarray), UG_ENTRY_ARRAY, ug_json_parse_array_string, ug_json_write_array_string}, {"iarray", offsetof (struct Info, iarray), UG_ENTRY_ARRAY, ug_json_parse_array_int, ug_json_write_array_int}, {"oarray", offsetof (struct Info, oarray), UG_ENTRY_ARRAY, worked_id_array_parse, worked_id_array_write}, {NULL}, }; // SampleJs UgEntry SampleJsEntry[] = { {"name", offsetof (SampleJs, name), UG_ENTRY_STRING, NULL, NULL}, {"info", offsetof (SampleJs, info), UG_ENTRY_OBJECT, InfoEntry, (UgInitFunc) NULL}, {NULL}, }; // used by sample_js_parse() UgEntry SampleJsObjectEntry[] = { {NULL, 0, UG_ENTRY_OBJECT, SampleJsEntry, (UgInitFunc) NULL}, {NULL} }; // ------------------------------------ // SampleJs functions SampleJs* sample_js_new (void) { SampleJs* samplejs; samplejs = calloc (1, sizeof (SampleJs)); ug_array_init (&samplejs->info.sarray, sizeof (char*), 0); ug_array_init (&samplejs->info.iarray, sizeof (int), 0); ug_array_init (&samplejs->info.oarray, sizeof (WorkedId), 0); return samplejs; } void sample_js_free (SampleJs* samplejs) { ug_array_clear (&samplejs->info.sarray); ug_array_clear (&samplejs->info.iarray); ug_array_clear (&samplejs->info.oarray); free (samplejs); } // UgJsonParseFunc UgJsonError json_debug_parser (UgJson* json, const char* name, const char* value, void* dest, void* none) { printf ("scope : %s\n", (json->scope == UG_JSON_ARRAY) ? "A" : "O"); if (json->type == UG_JSON_ARRAY || json->type == UG_JSON_OBJECT) ug_json_push (json, json_debug_parser, NULL, NULL); // UgJson.index[0] : index of name // UgJson.index[1] : index of value // debug if (json->index[0]) printf ("'%s' : ", json->buf.at + json->index[0]); switch (json->type) { case UG_JSON_NULL: // null printf ("NULL '%s'", json->buf.at + json->index[1]); break; case UG_JSON_TRUE: // true printf ("TRUE '%s'", json->buf.at + json->index[1]); break; case UG_JSON_FALSE: // false printf ("FALSE '%s'", json->buf.at + json->index[1]); break; case UG_JSON_NUMBER: // 1234, 0.567 printf ("NUMBER '%s'", json->buf.at + json->index[1]); break; case UG_JSON_STRING: // "string" printf ("STRING '%s'", json->buf.at + json->index[1]); break; case UG_JSON_OBJECT: // { printf ("OBJECT"); break; case UG_JSON_ARRAY: // [ printf ("ARRAY"); break; } printf ("\n"); return 0; } static const char* sample_js_string = { "{" " \"name\": \"\\u5927\\u4E2Dfile.torrent\"," " \"info\":" " {" " \"ftp\":" " {" " \"user\": \"anonymous\"," " \"password\": \"guest@unknown\"," " \"active-mode\": false" " }," " \"http\":" " {" " \"user-agent\": \"Browser\\/version\"," " \"referrer\": \"http:\\/\\/127.0.0.1\\/\" " " }," " \"sarray\":" " [" " \"element1\", \"element2\"," " \"element3\", \"element\\n4\" " " ]," " \"iarray\":" " [" " 1234, 2012," " 4567, 2011 " " ]," " \"oarray\":" " [" " { \"worked\" : false, \"id\": \"KMan\" }," " { \"worked\" : true , \"id\": \"Kimi\" }," " { \"worked\" : false, \"id\": \"XMan\" }," " { \"worked\" : true , \"id\": \"WMan\" }" " ]" " }" "}" }; void sample_js_parse (SampleJs* samplejs) { UgJson json; int code; // JSON string for SampleJs const char* json_string = sample_js_string; memset (&json, 0, sizeof (json)); ug_json_init (&json); ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of object ug_json_push (&json, ug_json_parse_entry, samplejs, SampleJsObjectEntry); #elif 1 // method 2: push ug_json_parse_object() to parse start of object ug_json_push (&json, ug_json_parse_entry, samplejs, SampleJsEntry); ug_json_push (&json, ug_json_parse_object, NULL, NULL); #else // debug ug_json_push (&json, json_debug_parser, NULL, NULL); ug_json_push (&json, ug_json_parse_object, NULL, NULL); #endif code = ug_json_parse (&json, json_string, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); ug_json_final (&json); } void sample_js_reparse (SampleJs* samplejs) { UgJson json; UgValue value; ug_value_init (&value); memset (&json, 0, sizeof (json)); ug_json_init (&json); ug_json_begin_parse (&json); ug_json_push (&json, ug_json_parse_value, &value, NULL); ug_json_parse (&json, sample_js_string, -1); ug_json_end_parse (&json); // convert UgValue to UgEntry ug_json_begin_parse (&json); ug_json_push (&json, ug_json_parse_entry, samplejs, SampleJsObjectEntry); ug_json_parse_by_value (&json, &value); ug_json_end_parse (&json); ug_json_final (&json); ug_value_clear (&value); } void sample_js_print (SampleJs* samplejs) { UgJson json; UgBuffer buffer; printf ("\n" "obj.info.ftp.user: %s\n" "obj.info.ftp.password: %s\n" "obj.info.ftp.active_mode: %d\n" "obj.info.http.user_agent: %s\n" "obj.info.http.referrer: %s\n", samplejs->info.ftp.user, samplejs->info.ftp.password, samplejs->info.ftp.active_mode, samplejs->info.http.user_agent, samplejs->info.http.referrer ); printf ("obj.info.sarray[0]: %s\n" "obj.info.sarray[1]: %s\n" "obj.info.sarray[2]: %s\n" "obj.info.sarray[3]: %s\n", samplejs->info.sarray.at[0], samplejs->info.sarray.at[1], samplejs->info.sarray.at[2], samplejs->info.sarray.at[3]); printf ("obj.info.iarray[0]: %d\n" "obj.info.iarray[1]: %d\n" "obj.info.iarray[2]: %d\n" "obj.info.iarray[3]: %d\n", samplejs->info.iarray.at[0], samplejs->info.iarray.at[1], samplejs->info.iarray.at[2], samplejs->info.iarray.at[3]); printf ("obj.info.oarray[0].worked: %d\n" "obj.info.oarray[0].id: %s\n" "obj.info.oarray[1].worked: %d\n" "obj.info.oarray[1].id: %s\n" "obj.info.oarray[2].worked: %d\n" "obj.info.oarray[2].id: %s\n" "obj.info.oarray[3].worked: %d\n" "obj.info.oarray[3].id: %s\n", samplejs->info.oarray.at[0].worked, samplejs->info.oarray.at[0].id, samplejs->info.oarray.at[1].worked, samplejs->info.oarray.at[1].id, samplejs->info.oarray.at[2].worked, samplejs->info.oarray.at[2].id, samplejs->info.oarray.at[3].worked, samplejs->info.oarray.at[3].id); ug_json_init (&json); ug_buffer_init (&buffer, 1024); ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); #if 1 // method 1: use UgEntry to write start of object ug_json_write_entry (&json, samplejs, SampleJsObjectEntry); #else // method 2: call ug_json_write_object_head() to write start of object ug_json_write_object_head (&json); ug_json_write_entry (&json, samplejs, SampleJsEntry); ug_json_write_object_tail (&json); #endif ug_json_end_write (&json); ug_buffer_write_char (&buffer, '\0'); puts ((char*)buffer.beg); ug_buffer_clear (&buffer, 1); ug_json_final (&json); } // UgBufferFunc static int buffer_to_file (UgBuffer* buffer) { FILE* file = buffer->data; printf ("write %d bytes to file\n", ug_buffer_length (buffer)); fwrite (buffer->beg, 1, ug_buffer_length(buffer), file); buffer->cur = buffer->beg; return 0; } void sample_js_to_file (SampleJs* samplejs, const char* filename) { UgBuffer buffer; UgJson json; FILE* file; file = fopen (filename, "w"); ug_buffer_init (&buffer, 128); buffer.more = buffer_to_file; buffer.data = file; ug_json_init (&json); ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); #if 1 // method 1: use UgEntry to write start of object ug_json_write_entry (&json, samplejs, SampleJsObjectEntry); #else // method 2: call ug_json_write_object_head() to write start of object ug_json_write_object_head (&json); ug_json_write_entry (&json, samplejs, SampleJsEntry); ug_json_write_object_tail (&json); #endif ug_json_end_write (&json); ug_json_final (&json); fclose (file); } // ---------------------------------------------------------------------------- // JSON object sample void test_json_object_custom (void) { UgBuffer buffer; WorkedId worked; int code; UgJson json; const char* json_string = { "{ \"worked\" : true , \"id\": \"C.H. Huang\" }" }; puts ("\n--- test_json_object_custom:"); worked_id_init (&worked); ug_json_init (&json); ug_buffer_init (&buffer, 128); // parse ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of object ug_json_push (&json, ug_json_parse_entry, &worked, WorkedIdCustomEntry); #else // method 2: push ug_json_parse_object() to parse start of object ug_json_push (&json, ug_json_parse_entry, &worked, WorkedIdEntry); ug_json_push (&json, ug_json_parse_object, NULL, NULL); #endif code = ug_json_parse (&json, json_string, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); // write ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); #if 1 // method 1: use UgEntry to write start of object ug_json_write_entry (&json, &worked, WorkedIdCustomEntry); #else // method 2: call ug_json_write_object_head() to write start of object ug_json_write_object_head (&json); ug_json_write_entry (&json, &worked, WorkedIdEntry); ug_json_write_object_tail (&json); #endif ug_json_end_write (&json); ug_buffer_write_char (&buffer, '\0'); puts (buffer.beg); ug_buffer_clear (&buffer, 1); ug_json_final (&json); worked_id_final (&worked); } // ---------------------------------------------------------------------------- // JSON array sample // use UgArray to store JSON number array void test_json_int_array (void) { // method 1 const UgEntry intArrayEntry[] = { {NULL, 0, UG_ENTRY_ARRAY, ug_json_parse_array_int, ug_json_write_array_int}, {NULL} }; // common UgJson json; UgArrayInt array; UgJsonError code; char* teststr = "[12,22,34,56]"; int index; puts ("\n--- test_json_int_array:"); memset (&json, 0, sizeof (json)); ug_array_init (&array, sizeof (int), 0); // JSON begin ug_json_init (&json); // JSON parse ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of array ug_json_push (&json, ug_json_parse_entry, &array, (void*)intArrayEntry); #else // method 2: push ug_json_parse_array() to parse start of array ug_json_push (&json, ug_json_parse_array_int, &array, NULL); ug_json_push (&json, ug_json_parse_array, NULL, NULL); #endif code = ug_json_parse (&json, teststr, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); // JSON end ug_json_final (&json); printf ("array.length = '%d'\n" "array.allocated = '%d'\n\n", array.length, array.allocated); for (index = 0; index < array.length; index++) printf ("array.at[%d] = %d\n", index, array.at[index]); ug_array_clear (&array); } // use UgList to store JSON string and number array void test_json_array_by_list (void) { // method 1 const UgEntry stringListEntry[] = { {NULL, 0, UG_ENTRY_ARRAY, ug_json_parse_list_string, ug_json_write_list_string}, {NULL} }; const UgEntry intListEntry[] = { {NULL, 0, UG_ENTRY_ARRAY, ug_json_parse_list_int, ug_json_write_list_int}, {NULL} }; // common UgJson json; UgList list; UgLink* link; UgJsonError code; UgBuffer buffer; char* jarraystr = "[\"Str1\",\"Str2\",\"Str3\",\"Str4\"]"; char* jarrayint = "[21,32,43,54]"; puts ("\n--- test_json_array_by_list:"); memset (&json, 0, sizeof (json)); ug_list_init (&list); // JSON begin ug_json_init (&json); ug_buffer_init (&buffer, 4096); puts ("\n parse JSON string array:"); // JSON parse - string array ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of array ug_json_push (&json, ug_json_parse_entry, &list, (void*)stringListEntry); #else // method 2: push ug_json_parse_array() to parse start of array ug_json_push (&json, ug_json_parse_list_string, &list, NULL); ug_json_push (&json, ug_json_parse_array, NULL, NULL); #endif code = ug_json_parse (&json, jarraystr, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); printf ("list.size = '%d'\n", (int)list.size); for (link = list.head; link; link = link->next) printf ("link->data = \"%s\"\n", (char*)link->data); // JSON write - string array ug_json_begin_write (&json, 0, &buffer); #if 1 // method 1: use UgEntry to write start of array ug_json_write_entry (&json, &list, (void*)stringListEntry); #else // method 2: call ug_json_write_array_head() to write start of array ug_json_write_array_head (&json); ug_json_write_list_string (&json, &list); ug_json_write_array_tail (&json); #endif ug_json_end_write (&json); puts ("ug_json_write_list_string:"); ug_buffer_write_char (&buffer, '\0'); puts (buffer.beg); // free strings in list ug_list_foreach (&list, (UgForeachFunc) ug_free, NULL); ug_list_clear (&list, TRUE); puts ("\n parse JSON int array:"); // JSON parse - int array ug_json_begin_parse (&json); #if 1 // method 1: use UgEntry to parse start of array ug_json_push (&json, ug_json_parse_entry, &list, (void*)intListEntry); #else // method 2: push ug_json_parse_array() to parse start of array ug_json_push (&json, ug_json_parse_list_int, &list, NULL); ug_json_push (&json, ug_json_parse_array, NULL, NULL); #endif code = ug_json_parse (&json, jarrayint, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); printf ("list.size = '%d'\n", (int)list.size); for (link = list.head; link; link = link->next) printf ("link->data = %d\n", (int)(intptr_t)link->data); // JSON write - int array buffer.cur = buffer.beg; ug_json_begin_write (&json, 0, &buffer); #if 1 // method 1: use UgEntry to write start of array ug_json_write_entry (&json, &list, (void*)intListEntry); #else // method 2: call ug_json_write_array_head() to write start of array ug_json_write_array_head (&json); ug_json_write_list_int (&json, &list); ug_json_write_array_tail (&json); #endif ug_json_end_write (&json); puts ("ug_json_write_list_int:"); ug_buffer_write_char (&buffer, '\0'); puts (buffer.beg); // free list ug_list_clear (&list, TRUE); ug_buffer_clear (&buffer, 1); // JSON end ug_json_final (&json); } // ---------------------------------------------------------------------------- // JSON value sample void test_json_value (void) { UgJson json; int code; #if 0 const char* json_string = "1234"; #elif 0 const char* json_string = "-100"; #elif 0 const char* json_string = "\"This is string.\""; #elif 0 const char* json_string = "\"This is"; // uncompleted string #elif 0 const char* json_string = "true"; #elif 0 const char* json_string = "tr"; // uncompleted true #elif 0 const char* json_string = "{"; // uncompleted object #else // "Sam a tűzoltó - Világcsúcs kísérletek" const char* json_string = "\"Sam a t\\u0171zolt\\u00f3 - Vil\\u00e1gcs\\u00facs k\\u00eds\\u00e9rletek\""; #endif puts ("\n--- test_json_value:"); ug_json_init (&json); ug_json_begin_parse (&json); #if 1 // debug ug_json_push (&json, json_debug_parser, NULL, NULL); #endif code = ug_json_parse (&json, json_string, -1); printf ("ug_json_parse response %d\n", code); code = ug_json_end_parse (&json); printf ("ug_json_end_parse response %d\n", code); ug_json_final (&json); } // ---------------------------------------------------------------------------- // test JSON writer void test_json_writer (void) { UgJson json; UgBuffer buffer; puts ("\n--- test_json_writer:"); ug_json_init (&json); ug_buffer_init (&buffer, 4096); ug_json_begin_write (&json, UG_JSON_FORMAT_INDENT, &buffer); // --- object1 begin ug_json_write_object_head (&json); // --- array1 begin ug_json_write_array_head (&json); ug_json_write_array_tail (&json); // --- array1 end // --- object2 begin ug_json_write_object_head (&json); ug_json_write_string (&json, "name1"); // --- array2 begin ug_json_write_array_head (&json); ug_json_write_int (&json, 1205); ug_json_write_int (&json, 2011); ug_json_write_int (&json, 1102); ug_json_write_array_tail (&json); // --- array2 end ug_json_write_string (&json, "name2"); // ug_json_write_string (&json, "value2"); ug_json_write_string (&json, "Sam a tűzoltó - Világcsúcs kísérletek"); ug_json_write_object_tail (&json); // --- object2 end ug_json_write_object_tail (&json); // --- object1 end ug_json_end_write (&json); ug_buffer_write_char (&buffer, '\0'); puts (buffer.beg); ug_buffer_clear (&buffer, 1); ug_json_final (&json); } // ---------------------------------------------------------------------------- // test UgArray void test_array (void) { UgArrayChar array; char* str = "This one is test string."; puts ("\n--- test_array:"); ug_array_init (&array, sizeof (char), 0); ug_array_append (&array, str, strlen (str)); ug_array_end0 (&array); printf ("\n" "array.at = '%s'\n" "array.length = '%d'\n" "array.allocated = '%d'\n", array.at, array.length, array.allocated); } // ---------------------------------------------------------------------------- // test main function int main (void) { SampleJs* samplejs; // g_mem_set_vtable (glib_mem_profiler_table); // test UgArray test_array (); // test JSON writer test_json_writer (); // test simple JSON value test_json_value (); // use Custom type (WorkedId) to store JSON object test_json_object_custom (); // use UgArray(int) to store JSON number array test_json_int_array (); // use UgList to store JSON string and number array test_json_array_by_list (); puts ("\n--- SampleJs functions:"); // C struct sample code: parse, print, and save file. samplejs = sample_js_new (); sample_js_parse (samplejs); sample_js_print (samplejs); sample_js_to_file (samplejs, "test-SampleJs.json"); sample_js_free (samplejs); samplejs = sample_js_new (); sample_js_reparse (samplejs); sample_js_print (samplejs); sample_js_free (samplejs); // g_mem_profile (); return 0; } uget-2.2.2/tests/test-plugin+app.c0000664000175000017500000003037313470304402013744 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #define ug_sleep Sleep #else #include // usleep() #define ug_sleep(millisecond) usleep (millisecond * 1000) #endif // _WIN32 || _WIN64 // ---------------------------------------------------------------------------- // test_download void download_by_plugin(UgInfo* info, const UgetPluginInfo* pinfo) { UgetCommon* common; UgetFiles* files; UgetFile* file1; UgetPlugin* plugin; UgetEvent* events; UgetEvent* cur; UgetEvent* next; UgetProgress* progress; int index; int speed_limit[2]; char* string[5]; speed_limit[0] = 1000000; speed_limit[1] = 1000000; plugin = uget_plugin_new(pinfo); uget_plugin_accept(plugin, info); uget_plugin_ctrl(plugin, UGET_PLUGIN_CTRL_SPEED, speed_limit); if (uget_plugin_start(plugin) == FALSE) { uget_plugin_unref(plugin); puts("plug-in failed to start."); return; } while (uget_plugin_sync(plugin, info)) { ug_sleep(1000); // event events = uget_plugin_pop(plugin); for (cur = events; cur; cur = next) { next = cur->next; printf ("\n" "Event type: %d - %s\n", cur->type, cur->string); uget_event_free(cur); } // progress progress = ug_info_get(info, UgetProgressInfo); if (progress == NULL) continue; string[0] = ug_str_from_int_unit(progress->complete, NULL); string[1] = ug_str_from_int_unit(progress->total, NULL); string[2] = ug_str_from_int_unit(progress->uploaded, NULL); string[3] = ug_str_from_int_unit(progress->download_speed, "/s"); string[4] = ug_str_from_int_unit(progress->upload_speed, "/s"); printf("\r" "DL: %s / %s, %d%%, %s | UL: %s, %s" " ", string[0], string[1], progress->percent, string[3], string[2], string[4]); for (index = 0; index < 5; index++) ug_free(string[index]); } // these data may changed, print them. common = ug_info_get(info, UgetCommonInfo); printf("\n" "common->name : %s\n" "common->uri : %s\n" "common->file : %s\n", common->name, common->uri, common->file); // print children files = ug_info_realloc(info, UgetFilesInfo); for (file1 = (UgetFile*)files->list.head; file1; file1 = file1->next) printf("file name : %s\n", file1->path); uget_plugin_unref(plugin); } void test_download(void) { UgetCommon* common; UgetHttp* http; UgInfo* info; char* referrer; char* uri; char* mirrors; uri = "https://mega.nz/#F!i5FXiSoD!TObpvqxETCq8TbEhFevzpg"; // uri = "https://mega.nz/#!MSpjBRhZ!nZBsUQCAnf71842wXuals_ftSkga3fIQypzBsKEZbmk"; // uri = "https://www.youtube.com/watch?v=y2004Xaz2HU"; // uri = "http://download.tuxfamily.org/notepadplus/6.5.3/npp.6.5.3.Installer.exe"; // uri = "http://ftp.gimp.org/pub/gimp/v2.8/windows/gimp-2.8.10-setup.exe"; // mirrors = "ftp://195.220.108.108/linux/fedora/linux/updates/19/x86_64/kernel-3.11.2-201.fc19.x86_64.rpm"; mirrors = NULL; // referrer = "http://code.google.com/p/tortoisegit/wiki/Download?tm=2"; referrer = NULL; info = ug_info_new(8, 0); // commom options common = ug_info_realloc(info, UgetCommonInfo); common->uri = ug_strdup(uri); if (mirrors) common->mirrors = ug_strdup(mirrors); // common->folder = ug_strdup ("D:\\Downloads"); // common->max_connections = 2; common->debug_level = 1; common->retry_limit = 1; common->connect_timeout = 30; // http options http = ug_info_realloc(info, UgetHttpInfo); if (referrer) http->referrer = ug_strdup(referrer); // download_by_plugin(info, UgetPluginCurlInfo); // download_by_plugin(info, UgetPluginAria2Info); // download_by_plugin(info, UgetPluginMediaInfo); download_by_plugin(info, UgetPluginMegaInfo); ug_info_unref(info); } // ---------------------------------------------------------------------------- // test_plugin void test_setup_plugin_aria2 (void) { const UgetPluginInfo* pinfo; pinfo = UgetPluginAria2Info; uget_plugin_global_set(pinfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(pinfo, UGET_PLUGIN_ARIA2_GLOBAL_URI, "http://localhost/jsonrpc"); #if defined _WIN32 || defined _WIN64 uget_plugin_global_set(pinfo, UGET_PLUGIN_ARIA2_GLOBAL_PATH, "C:\\Program Files\\uGet\\bin\\aria2c.exe"); #endif uget_plugin_global_set(pinfo, UGET_PLUGIN_ARIA2_GLOBAL_ARGUMENT, "--enable-rpc=true -D --check-certificate=false"); uget_plugin_global_set(pinfo, UGET_PLUGIN_ARIA2_GLOBAL_LAUNCH, (void*) TRUE); uget_plugin_global_set(pinfo, UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN, (void*) TRUE); ug_sleep (1000); uget_plugin_global_set(pinfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); ug_sleep (1000); } // ---------------------------------------------------------------------------- // test_task void print_speed_limit (UgetNode** dnode, int count) { int total[2] = {0,0}; UgetRelation* relation; for (count = 0; count < 7; count++) { relation = ug_info_get (dnode[count]->info, UgetRelationInfo); if (relation->task) { printf ("limit D: %d, U: %d | speed D: %d, U: %d\n", relation->task->limit[0], relation->task->limit[1], relation->task->speed[0], relation->task->speed[1]); total[0] += relation->task->limit[0]; total[1] += relation->task->limit[1]; } } printf ("total limit D: %d, U: %d\n", total[0], total[1]); } void test_task (void) { UgetTask* task; UgetNode* dnode[7]; UgetRelation* relation; int count; task = calloc (1, sizeof (UgetTask)); uget_task_init (task); // task speed control ------------------- for (count = 0; count < 7; count++) { dnode[count] = uget_node_new (NULL); relation = ug_info_realloc (dnode[count]->info, UgetRelationInfo); uget_task_add (task, dnode[count], UgetPluginEmptyInfo); if (relation->task) { relation->task->limit[0] = 2000; relation->task->limit[1] = 1500; relation->task->speed[0] = 2000 - count * 200; relation->task->speed[1] = 1500 - count * 200; } } if (relation->task) { relation->task->limit[0] = 0; relation->task->limit[1] = 0; } uget_task_set_speed (task, 12000, 8000); print_speed_limit(dnode, 7); puts ("---"); uget_task_adjust_speed (task); print_speed_limit(dnode, 7); uget_task_remove_all (task); uget_task_final (task); free (task); for (count = 0; count < 7; count++) uget_node_free (dnode[count]); } // ---------------------------------------------------------------------------- // test_app void setup_app (UgetApp* app) { UgetNode* cnode; UgetCategory* category; UgetCommon* common; cnode = uget_node_new (NULL); category = ug_info_realloc (cnode->info, UgetCategoryInfo); *(char**)ug_array_alloc (&category->schemes, 1) = ug_strdup ("http"); *(char**)ug_array_alloc (&category->schemes, 1) = ug_strdup ("https"); *(char**)ug_array_alloc (&category->schemes, 1) = ug_strdup ("ftp"); common = ug_info_realloc (cnode->info, UgetCommonInfo); common->name = ug_strdup ("Home Category"); common->max_connections = 2; uget_app_add_category (app, cnode, TRUE); uget_app_add_plugin (app, UgetPluginAria2Info); uget_app_add_plugin (app, UgetPluginCurlInfo); uget_app_clear_plugins (app); uget_app_set_default_plugin (app, UgetPluginCurlInfo); } void start_app (UgetApp* app) { UgetNode* dnode; UgetCommon* common; char* string[2]; dnode = uget_node_new (NULL); common = ug_info_realloc (dnode->info, UgetCommonInfo); common->name = ug_strdup ("Download"); common->uri = ug_strdup ("http://www.utorrent.com/scripts/dl.php?track=stable&build=29812&client=utorrent"); common->folder = ug_strdup ("D:\\Downloads"); common->debug_level = 1; // common->keeping.enable = TRUE; // common->keeping.uri = TRUE; // common->keeping.folder = TRUE; // common->keeping.debug_level = TRUE; uget_app_add_download (app, dnode, NULL, FALSE); puts ("uget_app_grow()"); while (uget_app_grow (app, FALSE)) { ug_sleep (1000); string[0] = ug_str_from_int_unit (app->task.speed.download, "/s"); string[1] = ug_str_from_int_unit (app->task.speed.upload, "/s"); printf ("\r" "DL: %s | UL %s" " ", string[0], string[1]); ug_free (string[0]); ug_free (string[1]); } puts ("uget_app_grow() return 0"); puts ("call uget_app_grow() again"); uget_app_grow (app, FALSE); } void close_app (UgetApp* app) { uget_app_clear_plugins (app); } void test_app_node (UgetApp* app) { UgetNode* dnode[7]; UgetNode* cnode; UgetCommon* common; int count; for (count = 0; count < 7; count++) { dnode[count] = uget_node_new (NULL); common = ug_info_realloc (dnode[count]->info, UgetCommonInfo); common->uri = ug_strdup ("ftp://127.0.0.1/"); common->folder = ug_strdup ("D:\\Downloads"); common->keeping.enable = TRUE; common->keeping.uri = FALSE; common->keeping.folder = FALSE; uget_app_add_download (app, dnode[count], NULL, TRUE); } uget_app_move_download (app, dnode[5], NULL); uget_app_delete_download (app, dnode[2], TRUE); uget_app_delete_download (app, dnode[4], FALSE); uget_app_delete_download (app, dnode[6], FALSE); cnode = app->real.children; if (cnode) printf ("%d\n", cnode->n_children); cnode = app->split.children; if (cnode) printf ("%d\n", cnode->n_children); cnode = app->mix.children; if (cnode) printf ("%d\n", cnode->n_children); cnode = app->mix_split.children; if (cnode) printf ("%d\n", cnode->n_children); } void test_app (void) { UgetApp* app; app = calloc (1, sizeof (UgetApp)); uget_app_init (app); setup_app (app); start_app (app); // test_app_node (app); uget_app_save_categories (app, NULL); // uget_app_load_categories (app, NULL); uget_app_final (app); free (app); } // ---------------------------------------------------------------------------- // main int main (void) { // initialize plug-in uget_plugin_global_set(UgetPluginCurlInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginMegaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); // test_setup_plugin_aria2(); test_download(); // test_task(); // test_app(); // uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN_NOW, (void*) TRUE); // finalize plug-in uget_plugin_global_set(UgetPluginCurlInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginMegaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); ug_sleep(1000); return 0; } uget-2.2.2/tests/Makefile.am0000664000175000017500000000406613470304402012605 00000000000000noinst_PROGRAMS = \ test-json test-jsonrpc test-plugin+app test-info \ test-uglib test-uget # test-uglib-cxx test-uget-cxx TESTS_LIBS = @PTHREAD_LIBS@ @CURL_LIBS@ @GLIB_LIBS@ if WITH_LIBPWMD TESTS_LIBS += @LIBPWMD_LIBS@ endif # set the include path found by configure AM_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget AM_CFLAGS = @PTHREAD_CFLAGS@ @LFS_CFLAGS@ @CURL_CFLAGS@ @GLIB_CFLAGS@ AM_LDFLAGS = @LFS_LDFLAGS@ # test_json_CPPFLAGS = -I$(top_srcdir)/uglib test_json_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_json_SOURCES = test-json.c # test_jsonrpc_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget test_jsonrpc_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_jsonrpc_SOURCES = test-jsonrpc.c test_plugin_app_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget @LIBGCRYPT_CFLAGS@ @LIBCRYPTO_CFLAGS@ test_plugin_app_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) @LIBGCRYPT_LIBS@ @LIBCRYPTO_LIBS@ test_plugin_app_SOURCES = test-plugin+app.c # test_info_CPPFLAGS = -I$(top_srcdir)/uglib test_info_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_info_SOURCES = test-info.c # test_uglib_CPPFLAGS = -I$(top_srcdir)/uglib test_uglib_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_uglib_SOURCES = test-uglib.c # test_uget_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget test_uget_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) test_uget_SOURCES = test-uget.c ## test C++ standard-layout #test_uglib_cxx_CPPFLAGS = -I$(top_srcdir)/uglib #test_uglib_cxx_CXXFLAGS = -std=c++11 #test_uglib_cxx_LDADD = $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) #test_uglib_cxx_SOURCES = test-uglib-cxx.cxx ## test_uget_cxx_CPPFLAGS = -I$(top_srcdir)/uglib -I$(top_srcdir)/uget #test_uget_cxx_CXXFLAGS = -std=c++11 #test_uget_cxx_LDADD = $(top_builddir)/uget/libuget.a $(top_builddir)/uglib/libuglib.a $(TESTS_LIBS) #test_uget_cxx_SOURCES = test-uget-cxx.cxx uget-2.2.2/tests/test-uglib.c0000664000175000017500000003103213470304402012765 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #include #include // ShellExecuteW() void test_launch (void) { uint16_t* pathutf16; uint16_t* parmutf16; int result; pathutf16 = ug_utf8_to_utf16 ("C:\\Program Files\\uGet\\bin\\aria2c", -1, NULL); parmutf16 = ug_utf8_to_utf16 ("--enable-rpc=true", -1, NULL); wprintf (L"%s %s", pathutf16, parmutf16); result = (int)ShellExecuteW (NULL, L"open", pathutf16, parmutf16, NULL, SW_HIDE); if (result > 32) puts ("ShellExecuteW - OK"); free (parmutf16); free (pathutf16); } #else void test_launch (void) { } #endif // ---------------------------------------------------------------------------- // test UgUri void dump_uri (UgUri* uri) { } void test_uri (void) { char* temp; char* hosts[] = {"ftp.you.com", ".your.org", ".edu", NULL}; char* exts[] = {"png", "bmp", "jpg", NULL}; char* schemes[] = {"ftp", "http", "git", NULL}; // const char* uri = "ftp://i.am.ftp.you.com/file.bmp"; const char* uri = "http://my.and.your.org/file%200.png?field1=value1&field2=value2&field3"; // const char* uri = "git://this.edu/file.jpg"; const char* query; UgUriQuery uquery; UgUri uuri; int index; puts ("\n--- test_uri:"); ug_uri_init (&uuri, uri); index = ug_uri_match_hosts (&uuri, hosts); printf ("ug_uri_match_hosts () return %d\n", index); index = ug_uri_match_schemes (&uuri, schemes); printf ("ug_uri_match_schemes () return %d\n", index); index = ug_uri_match_file_exts (&uuri, exts); printf ("ug_uri_match_file_exts () return %d\n", index); temp = ug_uri_get_file (&uuri); puts (temp); ug_free (temp); query = uri + uuri.query; while ((index = ug_uri_query_part (&uquery, query)) > 0) { printf ("ug_uri_query_part() return %d, %.*s=%.*s\n", index, uquery.field_len, query, uquery.value_len, uquery.value); query = uquery.field_next; } temp = ug_strdup ("file%2020%%20100%2f%20.jpg"); index = ug_decode_uri (temp, -1, temp); printf ("ug_decode_uri() return %d, output - '%s'\n", index, temp); ug_free (temp); } // ---------------------------------------------------------------------------- // test UgList static UgLink link[4]; void test_list (void) { UgLink* temp; UgList list; uintptr_t index; ug_list_init (&list); for (index = 0; index < 4; index++) link[index].data = (void*) index; ug_list_append (&list, link + 0); ug_list_append (&list, link + 1); ug_list_append (&list, link + 2); ug_list_append (&list, link + 3); ug_list_remove (&list, link + 2); ug_list_insert (&list, link + 3, link + 2); for (temp = list.head; temp; temp = temp->next) { printf ("%d, %p, %p\n", (int)(intptr_t)temp->data, temp->prev, temp->next); } } // ---------------------------------------------------------------------------- // test UgNode void dump_node (UgNode* root) { UgNode* cur; printf ("node->next : %p\n", root->next); printf ("node->prev : %p\n", root->prev); printf ("node->parent : %p\n", root->parent); printf ("node->children : %p\n", root->children); printf ("node->n_children : %d\n", root->n_children); for (cur = root->children; cur; cur = cur->next) printf ("%u\n", (unsigned)(uintptr_t)cur->data); } void test_node (void) { UgNode* root; UgNode* node1; UgNode* node2; UgNode* node3; UgNode* node4; puts ("\n--- test_node:"); root = ug_node_new (); node1 = ug_node_new (); node1->data = (void*)(uintptr_t) 1; node2 = ug_node_new (); node2->data = (void*)(uintptr_t) 2; node3 = ug_node_new (); node3->data = (void*)(uintptr_t) 3; node4 = ug_node_new (); node4->data = (void*)(uintptr_t) 4; ug_node_append (root, node3); printf ("ug_node_append (3)\n"); ug_node_prepend (root, node1); printf ("ug_node_prepend (1)\n"); ug_node_insert (root, node3, node2); printf ("ug_node_insert (2) before 3\n"); ug_node_append (root, node4); printf ("ug_node_append (4)\n"); printf ("root.n_children : %d\n", root->n_children); dump_node (root); ug_node_unlink (node2); dump_node (node2); ug_node_free (root); ug_node_free (node1); ug_node_free (node2); ug_node_free (node3); ug_node_free (node4); } // ---------------------------------------------------------------------------- // UgBuffer void test_buffer () { UgBuffer buffer; puts ("\n--- test_buffer:"); ug_buffer_init (&buffer, 3); ug_buffer_write (&buffer, "This is test string.", -1); ug_buffer_write_char (&buffer, 'K'); *ug_buffer_alloc (&buffer, 1) = 'S'; *ug_buffer_alloc (&buffer, 1) = 'D'; ug_buffer_write_char (&buffer, 'K'); ug_buffer_write_char (&buffer, '\0'); puts ((char*)buffer.beg); ug_buffer_clear (&buffer, 1); } // ---------------------------------------------------------------------------- // UgSLink static void slinks_add_range (UgSLinks* slinks, char** strings, int beg, int end) { for (; beg < end; beg++) { strings[beg] = ug_strdup_printf ("%.3d", beg); ug_slinks_add (slinks, strings[beg]); } } static void slinks_remove_range (UgSLinks* slinks, char** strings, int beg, int end) { for (; beg < end; beg++) { ug_slinks_remove (slinks, strings[beg], NULL); ug_free (strings[beg]); strings[beg] = NULL; } } void test_slink () { char** strings; UgSLinks slinks; puts ("\n--- test_slink:"); ug_slinks_init (&slinks, 16); strings = ug_malloc0 (sizeof (char*) * 100); slinks_add_range (&slinks, strings, 40, 60); slinks_add_range (&slinks, strings, 0, 20); slinks_add_range (&slinks, strings, 80, 100); slinks_add_range (&slinks, strings, 20, 40); slinks_add_range (&slinks, strings, 60, 80); slinks_remove_range (&slinks, strings, 0, 10); slinks_remove_range (&slinks, strings, 90, 100); slinks_remove_range (&slinks, strings, 70, 90); slinks_remove_range (&slinks, strings, 10, 30); slinks_remove_range (&slinks, strings, 30, 50); slinks_remove_range (&slinks, strings, 50, 70); slinks_add_range (&slinks, strings, 0, 20); slinks_add_range (&slinks, strings, 80, 100); slinks_remove_range (&slinks, strings, 0, 10); slinks_remove_range (&slinks, strings, 90, 100); ug_slinks_foreach (&slinks, (void*)puts, NULL); slinks_remove_range (&slinks, strings, 10, 20); slinks_remove_range (&slinks, strings, 80, 90); ug_free (strings); ug_slinks_final (&slinks); } // ---------------------------------------------------------------------------- // UgUtil void test_base64 () { const char* test_string = "This is a test string."; char* base64; char* orig; int len; puts ("\n--- test_base64:"); base64 = ug_base64_encode ((uint8_t*)test_string, strlen (test_string), &len); printf ("%.*s\n", len, base64); puts (base64); orig = (char*) ug_base64_decode(base64, len, NULL); printf ("%.*s\n", len, orig); ug_free (base64); ug_free (orig); } // ---------------------------------------------------------------------------- // Utility void test_utility () { char* temp; time_t res; int n; res = ug_str_rfc822_to_time ("Sat, 07 Sep 2002 00:00:01 GMT"); if (res != -1) puts (ctime (&res)); res = ug_str_rfc3339_to_time ("2013-09-12T22:50:20+08:00"); if (res != -1) puts (ctime (&res)); temp = ug_build_filename ("basedir", "path", "file", NULL); printf ("ug_build_filename() - %s\n", temp); ug_free (temp); temp = ug_strdup ("\nThis\n one\r"); puts ("--- ug_str_remove_crlf () --- start ---"); puts (temp); n = ug_str_remove_crlf (temp, temp); puts (temp); printf ("--- ug_str_remove_crlf () return %d --- end ---", n); ug_free (temp); } // ---------------------------------------------------------------------------- // Option struct Opt { int index; char* name; }; UgOptionEntry opt_entry[] = { {"category-index", "ci", offsetof (struct Opt, index), UG_ENTRY_INT, "", "=N", NULL}, {"category-name", "cn", offsetof (struct Opt, name), UG_ENTRY_STRING, "", "=name", NULL}, {NULL} }; int print_option_callback (UgOption* option, const char* name, const char* value, void* dest, void* data) { printf ("%s = %s\n", name, value); return TRUE; } void test_option (void) { UgOption option; struct Opt dest; ug_option_init (&option); // ug_option_set_parser (&option, print_option_callback, NULL, NULL); ug_option_set_parser (&option, ug_option_parse_entry, &dest, opt_entry); ug_option_parse (&option, "--category-index=1", -1); ug_option_parse (&option, "-cn=hhk", -1); ug_option_final (&option); } void test_cmd_arg (void) { const char* cmd = "--enable --file=\"\" --arg "; char** argv; int argc; int count; argv = ug_argv_from_cmd (cmd, &argc, 0); for (count = 0; count < argc; count++) puts (argv[count]); ug_argv_free (argv); } // ---------------------------------------------------------------------------- // HTML void start_element (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { int index; printf ("<%s", element_name); for (index = 0; attribute_names[index]; index++) printf (" %s=%s", attribute_names[index], attribute_values[index]); printf (">"); } void end_element (UgHtml* uhtml, const char* element_name, void* dest, void* data) { printf ("\n", element_name); } void text (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { printf ("%s", text); } UgHtmlParser testparser = { start_element, end_element, text }; void test_html (void) { UgHtml* uhtml; uhtml = ug_html_new (); ug_html_begin_parse (uhtml); ug_html_push (uhtml, &testparser, NULL, NULL); ug_html_parse (uhtml, "< p attr1=\"value1\" attr2=val2/> < &xxxxx; ", -1); ug_html_end_parse (uhtml); puts("\n"); } void test_unicode (void) { const char* utf8_name = "\xE9\xBB\x83\xE6\xAD\xA3\xE9\x9B\x84"; char* utf8_str; uint32_t* ucs4_str; int len; int idx; ucs4_str = ug_utf8_to_ucs4 (utf8_name, -1, &len); for (idx = 0; idx < len; idx++) printf ("\\x%X", ucs4_str[idx]); puts (""); utf8_str = ug_ucs4_to_utf8 (ucs4_str, -1, &len); for (idx = 0; idx < len; idx++) printf ("\\x%X", (unsigned)(uint8_t)utf8_str[idx]); puts (""); ug_free (ucs4_str); ug_free (utf8_str); } // ---------------------------------------------------------------------------- // main int main (void) { test_unicode (); test_html (); test_cmd_arg (); test_option (); test_list (); test_node (); test_uri (); test_buffer (); test_slink (); // test_launch (); test_base64 (); test_utility (); return 0; } uget-2.2.2/tests/test-info.c0000664000175000017500000001522713470304402012626 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include // ---------------------------------------------------------------------------- // Test1 typedef struct { UG_DATA_MEMBERS; // const UgDataInfo* info; int type; } Test1; const UgEntry Test1Entry[] = { {"type", offsetof(Test1, type), UG_ENTRY_INT, NULL, NULL}, {NULL} }; void test1_init(Test1* t1); const UgDataInfo Test1Info = { "Test1", sizeof(Test1), (UgInitFunc) test1_init, (UgFinalFunc) NULL, (UgAssignFunc) NULL, Test1Entry, // UgEntry }; void test1_init(Test1* t1) { t1->info = &Test1Info; t1->type = 1; } // ---------------------------------------------------------------------------- // Test2 typedef struct { UG_DATA_MEMBERS; // const UgDataInfo* info; int type; } Test2; const UgEntry Test2Entry[] = { {"type", offsetof(Test2, type), UG_ENTRY_INT, NULL, NULL}, {NULL} }; void test2_init(Test2* t2); const UgDataInfo Test2Info = { "Test2", sizeof(Test2), (UgInitFunc) test2_init, (UgFinalFunc) NULL, (UgAssignFunc) NULL, Test2Entry, // UgEntry }; void test2_init(Test2* t2) { t2->info = &Test2Info; t2->type = 2; } // ---------------------------------------------------------------------------- // Test3 typedef struct { UG_DATA_MEMBERS; // const UgDataInfo* info; int type; } Test3; const UgEntry Test3Entry[] = { {"type", offsetof(Test3, type), UG_ENTRY_INT, NULL, NULL}, {NULL} }; void test3_init(Test3* t3); const UgDataInfo Test3Info = { "Test3", sizeof(Test3), (UgInitFunc) test3_init, (UgFinalFunc) NULL, (UgAssignFunc) NULL, Test3Entry, // UgEntry }; void test3_init(Test3* t3) { t3->info = &Test3Info; t3->type = 3; } // ---------------------------------------------------------------------------- // test UgInfo UgEntry InfoCustomEntry[] = { {NULL, 0, UG_ENTRY_CUSTOM, (UgJsonParseFunc) ug_json_parse_info, (UgJsonWriteFunc) ug_json_write_info}, {NULL} }; void test_info(UgInfo* info) { void* data; puts("\n--- test_info:"); data = ug_info_realloc(info, &Test2Info); printf("ug_info_realloc (Test2Info) : %d\n", ((Test2*)data)->type); data = ug_info_realloc(info, &Test1Info); printf("ug_info_realloc (Test1Info) : %d\n", ((Test1*)data)->type); data = ug_info_realloc(info, &Test3Info); printf("ug_info_realloc (Test3Info) : %d\n", ((Test3*)data)->type); } void parse_info(UgInfo* info) { int code; UgJson json; UgRegistry registry; const char* json_string = { "{" " \"Test1\": {" " \"type\": 1" " }," " \"Test2\": {" " \"type\": 2" " }," " \"Test3\": {" " \"type\": 3" " }" "}" }; // UgRegistry is used by ug_json_parse_info() and ug_json_parse_info_entry() ug_registry_init(®istry); ug_registry_add(®istry, &Test2Info); ug_registry_add(®istry, &Test3Info); ug_registry_add(®istry, &Test1Info); // ug_registry_sort(®istry); // ug_json_parse_info() must use default UgInfoKeys. ug_info_set_registry(®istry); ug_json_init(&json); ug_json_begin_parse(&json); #if 1 // method 1: use UgEntry to parse start of object ug_json_push(&json, ug_json_parse_entry, info, InfoCustomEntry); #else // method 2: push ug_json_parse_info() to parse start of object ug_json_push(&json, ug_json_parse_info, info, ®istry); #endif code = ug_json_parse(&json, json_string, -1); ug_json_end_parse(&json); ug_json_final(&json); printf("ug_json_parse response %d\n", code); ug_info_set_registry(NULL); ug_registry_final(®istry); } void dump_info(UgInfo* info) { UgPair* cur; UgPair* end; for (cur = info->at, end = info->at + info->length; cur < end; cur++) { if (cur->key == NULL) { puts("NULL"); continue; } printf("%s", ((UgDataInfo*)cur->key)->name); if (cur->data) printf(" : %d", ((Test1*)cur->data)->type); puts(""); } } // UgBufferFunc static int buffer_to_file(UgBuffer* buffer) { FILE* file = buffer->data; printf("write %d bytes to file\n", ug_buffer_length(buffer)); fwrite(buffer->beg, 1, ug_buffer_length(buffer), file); buffer->cur = buffer->beg; return 0; } void write_info_to_file(UgInfo* info, char* filename) { UgJson json; FILE* file; UgBuffer buffer; file = fopen(filename, "w"); ug_buffer_init(&buffer, 128); buffer.more = buffer_to_file; buffer.data = file; ug_json_init(&json); ug_json_begin_write(&json, UG_JSON_FORMAT_INDENT, &buffer); #if 1 // method 1: use UgEntry to write start of object ug_json_write_entry(&json, info, InfoCustomEntry); #else // method 2: call ug_json_write_object_head() to write start of object ug_json_write_object_head(&json); ug_json_write_info(&json, info); ug_json_write_object_tail(&json); #endif ug_json_end_write(&json); ug_json_final(&json); ug_buffer_clear(&buffer, 1); fclose(file); } // ---------------------------------------------------------------------------- // main int main(void) { UgInfo info; puts("\n--- test UgInfo functions:"); ug_info_init(&info, 8, 2); #if 0 test_info(&info); #else parse_info(&info); #endif dump_info(&info); write_info_to_file(&info, "test-info.json"); ug_info_final(&info); return 0; } uget-2.2.2/Makefile.in0000664000175000017500000007005513470304625011464 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # intltool : add "po" in SUBDIRS VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(appsdir)" DATA = $(apps_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README ar-lib compile depcomp \ install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ uglib \ uget \ ui-gtk \ ui-gtk-1to2 \ pixmaps \ sounds \ tests \ po \ doc \ Windows EXTRA_DIST = \ uget-gtk.desktop \ .snapcraft.yaml appsdir = $(datadir)/applications apps_DATA = uget-gtk.desktop all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-appsDATA: $(apps_DATA) @$(NORMAL_INSTALL) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(appsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(appsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appsdir)" || exit $$?; \ done uninstall-appsDATA: @$(NORMAL_UNINSTALL) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(appsdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(appsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-appsDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-appsDATA .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-appsDATA install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-appsDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/depcomp0000755000175000017500000005602013250314767010772 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: uget-2.2.2/INSTALL0000644000175000017500000003661413245070103010440 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a 'Makefile' in each directory of the package. It may also create one or more '.h' files containing system-dependent definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how 'configure' could check whether to do them, and mail diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing 'make clean'. To also remove the files that 'configure' created (so you can compile the package for a different kind of computer), type 'make distclean'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' to specify different values for particular kinds of files. Run 'configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving 'configure' the option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. Some packages pay attention to '--enable-FEATURE' options to 'configure', where FEATURE indicates an optional part of the package. They may also pay attention to '--with-PACKAGE' options, where PACKAGE is something like 'gnu-as' or 'x' (for the X Window System). The 'README' should mention any '--enable-' and '--with-' options that the package recognizes. For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, you can use the 'configure' options '--x-includes=DIR' and '--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. uget-2.2.2/ui-gtk/0000775000175000017500000000000013470305210010657 500000000000000uget-2.2.2/ui-gtk/UgtkSettingDialog.h0000664000175000017500000000616513470304403014353 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SETTING_DIALOG_H #define UGTK_SETTING_DIALOG_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkSettingDialog UgtkSettingDialog; typedef enum { UGTK_SETTING_PAGE_UI, UGTK_SETTING_PAGE_CLIPBOARD, UGTK_SETTING_PAGE_OTHERS, } UgtkSettingDialogPage; struct UgtkSettingDialog { GtkDialog* self; UgtkApp* app; GtkTreeView* tree_view; GtkListStore* list_store; GtkNotebook* notebook; struct UgtkUserInterfaceForm ui; struct UgtkClipboardForm clipboard; struct UgtkBandwidthForm bandwidth; struct UgtkCompletionForm completion; struct UgtkAutoSaveForm auto_save; struct UgtkScheduleForm scheduler; struct UgtkCommandlineForm commandline; struct UgtkPluginForm plugin; struct UgtkMediaWebsiteForm media_website; }; UgtkSettingDialog* ugtk_setting_dialog_new (); void ugtk_setting_dialog_free (UgtkSettingDialog* sdialog); void ugtk_setting_dialog_run (UgtkSettingDialog* dialog, UgtkApp* app); void ugtk_setting_dialog_set (UgtkSettingDialog* dialog, UgtkSetting* setting); void ugtk_setting_dialog_get (UgtkSettingDialog* dialog, UgtkSetting* setting); void ugtk_setting_dialog_add (UgtkSettingDialog* sdialog, const gchar* title, GtkWidget* page); void ugtk_setting_dialog_set_page (UgtkSettingDialog* sdialog, int nth); #ifdef __cplusplus } #endif #endif // End of UGTK_SETTING_DIALOG_H uget-2.2.2/ui-gtk/UgtkApp-timeout.c0000664000175000017500000005635013470304403014016 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include # if HAVE_LIBNOTIFY # include # endif # if HAVE_GSTREAMER # include # endif #endif #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif // _MSC_VER #if defined _WIN32 || defined _WIN64 #ifndef _WIN32_IE #define _WIN32_IE 0x0600 #endif // _WIN32_IE #include #include #endif // _WIN32 || _WIN64 #include #include #include #include #include static void ugtk_app_notify_error (UgtkApp* app); static void ugtk_app_notify_starting (UgtkApp* app); static void ugtk_app_notify_completed (UgtkApp* app); // GSourceFunc #ifdef HAVE_RSS_NOTIFY static gboolean ugtk_app_timeout_rss (UgtkApp* app); #endif static gboolean ugtk_app_timeout_rpc (UgtkApp* app); static gboolean ugtk_app_timeout_queuing (UgtkApp* app); static gboolean ugtk_app_timeout_clipboard (UgtkApp* app); static gboolean ugtk_app_timeout_autosave (UgtkApp* app); void ugtk_app_init_timeout (UgtkApp* app) { // 0.5 seconds g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 500, (GSourceFunc) ugtk_app_timeout_rpc, app, NULL); // 0.5 seconds g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 500, (GSourceFunc) ugtk_app_timeout_queuing, app, NULL); // 2 seconds g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, 2, (GSourceFunc) ugtk_app_timeout_clipboard, app, NULL); #ifdef HAVE_RSS_NOTIFY // 3 seconds g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, 3, (GSourceFunc) ugtk_app_timeout_rss, app, NULL); #endif // HAVE_RSS_NOTIFY // 1 minutes g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, 60, (GSourceFunc) ugtk_app_timeout_autosave, app, NULL); } static gboolean ugtk_app_timeout_autosave (UgtkApp* app) { static int counts = 0; counts++; // "app->setting.auto_save.interval" may changed by user if (counts >= app->setting.auto_save.interval) { counts = 0; if (app->setting.auto_save.enable) ugtk_app_save (app); } // return FALSE if the source should be removed. return TRUE; } // ---------------------------------------------------------------------------- // Queuing // scheduler static gboolean ugtk_app_decide_schedule_state (UgtkApp* app) { struct tm* timem; time_t timet; guint weekdays, dayhours; gboolean changed; UgetNode* cnode; UgtkScheduleState state; if (app->setting.scheduler.enable == FALSE) { app->schedule_state = UGTK_SCHEDULE_NORMAL; return FALSE; } // get current time timet = time (NULL); timem = localtime (&timet); dayhours = timem->tm_hour; if (timem->tm_wday == 0) weekdays = 6; else weekdays = timem->tm_wday - 1; // get current schedule state state = app->setting.scheduler.state.at[weekdays*24 + dayhours]; if (app->schedule_state == state) changed = FALSE; else { app->schedule_state = state; changed = TRUE; // switch mode switch (state) { case UGTK_SCHEDULE_TURN_OFF: for (cnode = app->real.children; cnode; cnode = cnode->next) uget_app_stop_category ((UgetApp*)app, cnode); // Don't notify anything app->user_action = TRUE; break; case UGTK_SCHEDULE_LIMITED_SPEED: // ug_running_set_speed (&app->running, // app->setting.speed_limit.scheduler.download, 0); break; default: // no speed limit uget_task_set_speed (&app->task, 0, 0); break; } } if (changed) { // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.download.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); } return changed; } static gboolean ugtk_app_timeout_queuing (UgtkApp* app) { static int n_counts = 0; static int n_active_last = 0; int n_active; int no_queuing = FALSE; gchar* string; ugtk_app_decide_schedule_state (app); if (app->setting.offline_mode || app->schedule_state == UGTK_SCHEDULE_TURN_OFF) { no_queuing = TRUE; } // if current status is "All" or "Active" if (app->traveler.state.cursor.pos == 0 || app->traveler.state.cursor.pos == 1) { ugtk_traveler_reserve_selection (&app->traveler); } n_active = uget_app_grow ((UgetApp*) app, no_queuing); if (n_active != n_active_last) { // start downloading if (n_active > 0 && n_active_last == 0) { // starting notification if (app->setting.ui.start_notification) ugtk_app_notify_starting (app); } // stop downloading else if (n_active == 0 && n_active_last > 0) { if (app->n_error > 0) { // error notification ugtk_app_notify_error (app); // This will show error icon at tray. app->trayicon.error_occurred = TRUE; } else if (app->user_action == FALSE) { // completed notification ugtk_app_notify_completed (app); // This will show normal icon at tray. app->trayicon.error_occurred = FALSE; } else { // This will show normal icon at tray. app->trayicon.error_occurred = FALSE; } // Completion Auto-Actions if (app->setting.completion.action > 0 && app->user_action == FALSE) { ugtk_app_save (app); switch (app->setting.completion.action) { case 1: // hibernate ug_hibernate (); break; case 2: // suspend ug_suspend (); break; case 3: // shutdown ug_shutdown (); break; case 4: // reboot ug_reboot (); break; case 5: // custom if (app->n_error > 0) { if (app->setting.completion.on_error) system (app->setting.completion.on_error); } else { if (app->setting.completion.command) system (app->setting.completion.command); } break; } } // reset counter app->n_error = 0; app->n_completed = 0; } // change window title if (n_active == 0) gtk_window_set_title (app->window.self, UGTK_APP_NAME); else { string = g_strdup_printf (UGTK_APP_NAME " - %u %s", n_active, _("tasks")); gtk_window_set_title (app->window.self, string); g_free (string); } } if (n_active > 0 || n_active != n_active_last || app->n_moved > 0) { // adjust speed limit every 1 seconds if (n_counts & 1) uget_task_adjust_speed (&app->task); // summary ugtk_summary_show (&app->summary, ugtk_traveler_get_cursor (&app->traveler)); // status bar ugtk_statusbar_set_speed (&app->statusbar, app->task.speed.download, app->task.speed.upload); // tray icon ugtk_tray_icon_set_info (&app->trayicon, n_active, app->task.speed.download, app->task.speed.upload); } // if current status is "All" or "Active" if (app->traveler.state.cursor.pos == 0 || app->traveler.state.cursor.pos == 1) { if (app->n_moved > 0) ugtk_traveler_restore_selection (&app->traveler); } uget_app_trim((UgetApp*) app, NULL); if (app->n_moved > 0) { // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.download.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); } app->user_action = FALSE; app->n_moved = 0; // reset counter n_active_last = n_active; n_counts++; return TRUE; } // ---------------------------------------------------------------------------- // Clipboard // static void on_keep_above_window_show (GtkWindow *window, gpointer user_data) { gtk_window_present (window); gtk_window_set_keep_above (window, FALSE); } static void ugtk_app_add_uris_quietly (UgtkApp* app, GList* list, UgInfo* node_info, int nth_category) { GList* link; UgUri uuri; UgetNode* cnode; UgetNode* dnode; UgetCommon* common; // filter existing if (app->setting.ui.skip_existing) { if (ugtk_app_filter_existing (app, list) == 0) return; } for (link = list; link; link = link->next) { // check existing if (link->data == NULL) continue; // select category cnode = NULL; if (nth_category != -1) cnode = uget_node_nth_child (&app->real, nth_category); if (cnode == NULL) { // match category by URI ug_uri_init (&uuri, link->data); cnode = uget_app_match_category ((UgetApp*) app, &uuri, NULL); } if (cnode == NULL && node_info) { // match category by filename common = ug_info_realloc(node_info, UgetCommonInfo); if (common && common->file) { ug_uri_init (&uuri, common->file); cnode = uget_app_match_category ((UgetApp*) app, &uuri, NULL); } } if (cnode == NULL) { if (node_info == NULL) { cnode = uget_node_nth_child (&app->real, app->setting.clipboard.nth_category); } else { cnode = uget_node_nth_child (&app->real, app->setting.commandline.nth_category); } } if (cnode == NULL) cnode = uget_node_nth_child (&app->real, 0); // add download if (node_info == NULL) { // add and free URI uget_app_add_download_uri ((UgetApp*) app, link->data, cnode, TRUE); g_free (link->data); } else { dnode = uget_node_new (NULL); ug_info_assign(dnode->info, node_info, NULL); common = ug_info_realloc(dnode->info, UgetCommonInfo); common->uri = link->data; uget_app_add_download ((UgetApp*) app, dnode, cnode, TRUE); } link->data = NULL; } } static void ugtk_app_add_uris_selected (UgtkApp* app, GList* list, UgInfo* node_info, int nth_category) { UgtkBatchDialog* bdialog; UgtkSelectorPage* page; UgetCommon* common; UgetNode* cnode; UgUri uuri; gchar* title; // filter existing if (app->setting.ui.skip_existing) { if (ugtk_app_filter_existing (app, list) == 0) return; } // choose title for clipboard or command-line if (node_info == NULL) title = g_strconcat (UGTK_APP_NAME " - ", _("New from Clipboard"), NULL); else title = g_strconcat (UGTK_APP_NAME " - ", _("New Download"), NULL); bdialog = ugtk_batch_dialog_new (title, app); g_free (title); // disable batch if only one uri in list. if (list->next == NULL) ugtk_batch_dialog_disable_batch (bdialog); // apply other setting if (node_info) { ugtk_download_form_set(&bdialog->download, node_info, FALSE); ugtk_proxy_form_set(&bdialog->proxy, node_info, FALSE); } // add URIs if (list->next == NULL) { gtk_entry_set_text (GTK_ENTRY (bdialog->download.uri_entry), list->data); bdialog->download.changed.uri = TRUE; } else { // After calling ugtk_selector_page_add_uris(), // all uris in list will be freed. ugtk_batch_dialog_use_selector (bdialog); ugtk_selector_hide_href (&bdialog->selector); if (node_info == NULL) page = ugtk_selector_add_page (&bdialog->selector, _("Clipboard")); else page = ugtk_selector_add_page (&bdialog->selector, _("Command line")); ugtk_selector_page_add_uris (page, list); } // set folder history and info ugtk_download_form_set_folders (&bdialog->download, &app->setting); // select category cnode = NULL; if (nth_category != -1) cnode = uget_node_nth_child (&app->real, nth_category); if (cnode == NULL && list->data) { // match category by URI ug_uri_init (&uuri, list->data); if (node_info == NULL) cnode = uget_app_match_category ((UgetApp*) app, &uuri, NULL); else { common = ug_info_realloc(node_info, UgetCommonInfo); cnode = uget_app_match_category ((UgetApp*) app, &uuri, common->file); } } if (cnode == NULL) { if (node_info == NULL) { cnode = uget_node_nth_child (&app->real, app->setting.clipboard.nth_category); } else { cnode = uget_node_nth_child (&app->real, app->setting.commandline.nth_category); } } if (cnode == NULL) cnode = uget_node_nth_child (&app->real, 0); ugtk_batch_dialog_set_category (bdialog, cnode); // connect signal and set data in download dialog g_signal_connect_after (bdialog->self, "show", G_CALLBACK (on_keep_above_window_show), NULL); // Make sure dilaog will show on top first time. // uget_on_keep_above_window_show () will set keep_above = FALSE gtk_window_set_keep_above ((GtkWindow*) bdialog->self, TRUE); ugtk_batch_dialog_run (bdialog); } static void on_clipboard_text_received (GtkClipboard* clipboard, const gchar* text, gpointer user_data) { UgtkApp* app; GList* list; app = (UgtkApp*) user_data; list = ugtk_clipboard_get_matched (&app->clipboard, text); if (list) { if (app->setting.clipboard.quiet) ugtk_app_add_uris_quietly (app, list, NULL, -1); else ugtk_app_add_uris_selected (app, list, NULL, -1); g_list_free (list); // refresh gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); } app->clipboard.processing = FALSE; } static gboolean ugtk_app_timeout_clipboard (UgtkApp* app) { if (app->setting.clipboard.monitor && app->clipboard.processing == FALSE) { // set FALSE in on_clipboard_text_received() app->clipboard.processing = TRUE; gtk_clipboard_request_text (app->clipboard.self, on_clipboard_text_received, app); } // return FALSE if the source should be removed. return TRUE; } // ---------------------------------------------------------------------------- // RPC static gboolean ugtk_app_timeout_rpc (UgtkApp* app) { UgetRpcReq* req; UgetRpcCmd* cmd; UgInfo* node_info; for (;;) { if (uget_rpc_has_request(app->rpc) == FALSE) return TRUE; req = uget_rpc_get_request (app->rpc); switch (req->method_id) { case UGET_RPC_PRESENT: // if (gtk_widget_get_visible ((GtkWidget*) app->window.self) == FALSE) // gtk_window_deiconify (app->window.self); gtk_window_present (app->window.self); // set position and size gtk_window_move (app->window.self, app->setting.window.x, app->setting.window.y); gtk_window_resize (app->window.self, app->setting.window.width, app->setting.window.height); break; case UGET_RPC_SEND_COMMAND: cmd = (UgetRpcCmd*) req; // control online/offline switch (cmd->value.ctrl.offline) { case 0: app->setting.offline_mode = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.file.offline_mode, FALSE); break; case 1: app->setting.offline_mode = TRUE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.file.offline_mode, TRUE); break; default: break; } // if user want to add downloads quietly. if (app->setting.commandline.quiet) cmd->value.quiet = TRUE; // URIs if (cmd->uris.size == 0) break; // add downloads node_info = ug_info_new(8, 0); uget_option_value_to_info(&cmd->value, node_info); if (cmd->value.quiet) { ugtk_app_add_uris_quietly (app, (GList*) cmd->uris.head, node_info, cmd->value.category_index); } else { ugtk_app_add_uris_selected (app, (GList*) cmd->uris.head, node_info, cmd->value.category_index); } ug_info_unref(node_info); break; default: break; } req->free (req); } return TRUE; } // ---------------------------------------------------------------------------- // RSS #ifdef HAVE_RSS_NOTIFY static gboolean ugtk_app_timeout_rss_update (UgtkApp* app) { uget_rss_update (app->rss_builtin, FALSE); // check RSS ready every 3 seconds g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, 3, (GSourceFunc) ugtk_app_timeout_rss, app, NULL); // return FALSE if the source should be removed. return FALSE; } static gboolean ugtk_app_timeout_rss (UgtkApp* app) { if (app->rss_builtin->updating == FALSE) { if (app->rss_builtin->n_updated > 0) { ugtk_banner_show_rss (&app->banner, app->rss_builtin); app->rss_builtin->n_updated = 0; } // update RSS every 30 minutes g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, 60 * 30, (GSourceFunc) ugtk_app_timeout_rss_update, app, NULL); // return FALSE if the source should be removed. return FALSE; } return TRUE; } #endif // HAVE_RSS_NOTIFY // ---------------------------------------------------------------------------- // sound // static void uget_play_sound (const gchar* sound_file); // GStreamer #ifdef HAVE_GSTREAMER static gboolean ugst_bus_func (GstBus* bus, GstMessage* msg, gpointer data) { GstElement* playbin = data; GError* error = NULL; switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_WARNING: gst_message_parse_warning (msg, &error, NULL); // g_print ("uget-gtk: gstreamer: %s\n", error->message); g_error_free (error); break; case GST_MESSAGE_ERROR: gst_message_parse_error (msg, &error, NULL); // g_print ("uget-gtk: gstreamer: %s\n", error->message); g_error_free (error); // clean up case GST_MESSAGE_EOS: gst_element_set_state (playbin, GST_STATE_NULL); gst_object_unref (GST_OBJECT (playbin)); break; default: break; } return TRUE; } static void ugtk_play_sound (const gchar* sound_file) { GstElement* playbin = NULL; GstBus* bus = NULL; char* uri; gchar* file_os; extern gboolean gst_inited; // ui-gtk/UgtkApp-main.c if (gst_inited == FALSE) return; file_os = g_filename_from_utf8 (sound_file, -1, NULL, NULL, NULL); if (g_file_test (file_os, G_FILE_TEST_EXISTS) == FALSE) { g_free (file_os); return; } playbin = gst_element_factory_make ("playbin", "play"); if (playbin == NULL) { g_free (file_os); return; } uri = g_filename_to_uri (file_os, NULL, NULL); g_free (file_os); g_object_set (G_OBJECT (playbin), "uri", uri, NULL); bus = gst_pipeline_get_bus (GST_PIPELINE (playbin)); gst_bus_add_watch (bus, ugst_bus_func, playbin); gst_element_set_state (playbin, GST_STATE_PLAYING); gst_object_unref (bus); g_free (uri); } #elif defined (_WIN32) static void ugtk_play_sound (const gchar* sound_file) { gunichar2* file_wcs; if (g_file_test (sound_file, G_FILE_TEST_EXISTS) == FALSE) return; file_wcs = g_utf8_to_utf16 (sound_file, -1, NULL, NULL, NULL); PlaySoundW (file_wcs, NULL, SND_ASYNC | SND_FILENAME); g_free (file_wcs); } #else // --disable-gstreamer static void ugtk_play_sound (const gchar* sound_file) { } #endif // HAVE_GSTREAMER // ---------------------------------------------------------------------------- // notification // #if defined HAVE_LIBNOTIFY static void ugtk_app_notify (UgtkApp* app, const gchar* title, const gchar* body) { static NotifyNotification* notification = NULL; gchar* string; if (notify_is_initted () == FALSE) return; // set title and body string = g_strconcat (UGTK_APP_NAME " - ", title, NULL); if (notification == NULL) { #if defined (NOTIFY_VERSION_MINOR) && NOTIFY_VERSION_MAJOR >= 0 && NOTIFY_VERSION_MINOR >= 7 notification = notify_notification_new (string, body, UGTK_APP_ICON_NAME); #else notification = notify_notification_new (string, body, UGTK_APP_ICON_NAME, NULL); #endif notify_notification_set_timeout (notification, 7000); // milliseconds } else { notify_notification_update (notification, string, body, UGTK_APP_ICON_NAME); } g_free (string); notify_notification_show (notification, NULL); } #elif defined _WIN32 || defined _WIN64 static void ugtk_app_notify (UgtkApp* app, const gchar* title, const gchar* body) { static NOTIFYICONDATAW* pNotifyData = NULL; gchar* string; gunichar2* string_wcs; if (pNotifyData == NULL) { pNotifyData = g_malloc0 (sizeof (NOTIFYICONDATAW)); pNotifyData->cbSize = sizeof (NOTIFYICONDATAW); pNotifyData->uFlags = NIF_INFO; // Use a balloon ToolTip instead of a standard ToolTip. pNotifyData->uTimeout = 7000; // milliseconds, This member is deprecated as of Windows Vista. pNotifyData->dwInfoFlags = NIIF_INFO | NIIF_NOSOUND; // Add an information icon to balloon ToolTip. // gtkstatusicon.c // (create_tray_observer): WNDCLASS.lpszClassName = "gtkstatusicon-observer" pNotifyData->hWnd = FindWindowA ("gtkstatusicon-observer", NULL); } if (pNotifyData->hWnd == NULL) return; // gtkstatusicon.c // (gtk_status_icon_init): priv->nid.uID = GPOINTER_TO_UINT (status_icon); pNotifyData->uID = GPOINTER_TO_UINT (app->trayicon.self); // title string = g_strconcat (UGTK_APP_NAME " - ", title, NULL); string_wcs = g_utf8_to_utf16 (string, -1, NULL, NULL, NULL); wcsncpy (pNotifyData->szInfoTitle, string_wcs, 64 -1); // null-terminated g_free (string); g_free (string_wcs); // body string_wcs = g_utf8_to_utf16 (body, -1, NULL, NULL, NULL); wcsncpy (pNotifyData->szInfo, string_wcs, 256 -1); // null-terminated g_free (string_wcs); Shell_NotifyIconW (NIM_MODIFY, pNotifyData); } #else static void ugtk_app_notify (UgtkApp* app, const gchar* title, const gchar* info) { // do nothing } #endif // HAVE_LIBNOTIFY #define NOTIFICATION_ERROR_TITLE _("Error Occurred") #define NOTIFICATION_ERROR_STRING _("Error Occurred during downloading.") #define NOTIFICATION_STARTING_TITLE _("Download Starting") #define NOTIFICATION_STARTING_STRING _("Starting download queue.") #define NOTIFICATION_COMPLETED_TITLE _("Download Completed") #define NOTIFICATION_COMPLETED_STRING _("All queuing downloads have been completed.") static void ugtk_app_notify_error (UgtkApp* app) { gchar* path; ugtk_app_notify (app, NOTIFICATION_ERROR_TITLE, NOTIFICATION_ERROR_STRING); if (app->setting.ui.sound_notification) { path = g_build_filename (ugtk_get_data_dir (), "sounds", "uget", "notification.wav", NULL); ugtk_play_sound (path); g_free (path); } } static void ugtk_app_notify_completed (UgtkApp* app) { gchar* path; ugtk_app_notify (app, NOTIFICATION_COMPLETED_TITLE, NOTIFICATION_COMPLETED_STRING); if (app->setting.ui.sound_notification) { path = g_build_filename (ugtk_get_data_dir (), "sounds", "uget", "notification.wav", NULL); ugtk_play_sound (path); g_free (path); } } static void ugtk_app_notify_starting (UgtkApp* app) { // gchar* path; ugtk_app_notify (app, NOTIFICATION_STARTING_TITLE, NOTIFICATION_STARTING_STRING); // if (app->setting.ui.sound_notification) { // path = g_build_filename (ugtk_get_data_dir (), // "sounds", "uget", "notification.wav", NULL); // ugtk_play_sound (path); // g_free (path); // } } uget-2.2.2/ui-gtk/UgtkApp-main.c0000664000175000017500000002041213470304403013242 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ // ---------------------------------------------------------------------------- // Windows #if defined _WIN32 || defined _WIN64 // This is for ATTACH_PARENT_PROCESS #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x501 // WinXP #endif #include #include #if defined _WINDOWS static void atexit_callback (void) { FreeConsole (); } static void win32_console_init (void) { typedef BOOL (CALLBACK* LPFNATTACHCONSOLE) (DWORD); LPFNATTACHCONSOLE AttachConsole; HMODULE hmod; // If stdout hasn't been redirected to a file, alloc a console // (_istty() doesn't work for stuff using the GUI subsystem) if (_fileno(stdout) == -1 || _fileno(stdout) == -2) { AttachConsole = NULL; #ifdef UNICODE if ((hmod = GetModuleHandle(L"kernel32.dll"))) #else if ((hmod = GetModuleHandle("kernel32.dll"))) #endif { AttachConsole = (LPFNATTACHCONSOLE) GetProcAddress(hmod, "AttachConsole"); } if ( (AttachConsole && AttachConsole (ATTACH_PARENT_PROCESS)) || AllocConsole() ) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); atexit (atexit_callback); } } } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { int main (int argc, char** argv); // below main() return main (__argc, __argv); } #endif // _WINDOWS #else #include // sync() #endif // _WIN32 || _WIN64 // ---------------------------------------------------------------------------- #include // exit(), EXIT_SUCCESS, EXIT_FAILURE #include // signal(), SIGTERM #include #include #include // OpenSSL #ifdef USE_OPENSSL #include #include static UgMutex* lockarray; static void lock_callback (int mode, int type, char *file, int line) { (void)file; (void)line; if (mode & CRYPTO_LOCK) { ug_mutex_lock (&(lockarray[type])); } else { ug_mutex_unlock (&(lockarray[type])); } } static unsigned long thread_id (void) { unsigned long ret; ret = (unsigned long) ug_thread_self(); return(ret); } static void init_locks (void) { int i; lockarray = (UgMutex*) OPENSSL_malloc (CRYPTO_num_locks() * sizeof(UgMutex)); for (i=0; i #include GCRY_THREAD_OPTION_PTHREAD_IMPL; static void init_locks (void) { gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); } #define kill_locks() #endif // USE_GNUTLS // libnotify #ifdef HAVE_LIBNOTIFY #include #endif // GStreamer #ifdef HAVE_GSTREAMER #include gboolean gst_inited = FALSE; #endif #include // ---------------------------------------------------------------------------- // SIGTERM UgtkApp* ugtk_app; gboolean ugtk_quitting = FALSE; static void sys_signal_handler (int sig) { // void ug_socket_server_close (UgSocketServer* server); switch (sig) { case SIGINT: // Ctrl-C case SIGTERM: // termination request case SIGABRT: // Abnormal termination (abort) // case SIGQUIT: // avoid crash when program re-enter signal handler. if (ugtk_quitting == FALSE) { ugtk_quitting = TRUE; // This will quit gtk_main() to main() ugtk_app_quit (ugtk_app); #if !(defined _WIN32 || defined _WIN64) sync(); #endif } break; // case SIGSEGV: // signal (SIGSEGV, NULL); // ug_socket_server_close (ugtk_app->rpc->server); // break; default: break; } } /* static void sys_set_sigaction () { struct sigaction action, old_action; action.sa_handler = sys_signal_handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; //action.sa_flags |= SA_RESTART; sigaction(SIGINT, NULL, &old_action); if (old_action.sa_handler != SIG_IGN) { sigaction(SIGINT, &action, NULL); } } */ // ---------------------------------------------------------------------------- // main () int main (int argc, char** argv) { UgetRpc* rpc; // I18N bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); // Command line if (ug_args_find_version (argc-1, argv+1)) { #if (defined _WIN32 || defined _WIN64) && defined _WINDOWS win32_console_init (); #endif g_print ("uGet " PACKAGE_VERSION " for GTK+" "\n"); return EXIT_SUCCESS; } if (ug_args_find_help (argc-1, argv+1)) { #if (defined _WIN32 || defined _WIN64) && defined _WINDOWS win32_console_init (); #endif ug_option_entry_print_help (uget_option_entry, argv[0], "[URL]", NULL); return EXIT_SUCCESS; } // JSON-RPC server rpc = uget_rpc_new (NULL); #ifdef USE_UNIX_DOMAIN_SOCKET rpc->backup_dir = ug_build_filename (ugtk_get_config_dir (), UGTK_APP_DIR, "RPC-socket", NULL); uget_rpc_use_unix_socket (rpc, rpc->backup_dir, -1); ug_free (rpc->backup_dir); #endif rpc->backup_dir = g_build_filename (ugtk_get_config_dir (), UGTK_APP_DIR, "attachment", NULL); ug_create_dir_all (rpc->backup_dir, -1); if (uget_rpc_start_server (rpc, TRUE)) uget_rpc_send_command (rpc, argc-1, argv+1); else { uget_rpc_send_command (rpc, argc-1, argv+1); uget_rpc_free (rpc); return EXIT_SUCCESS; } // GTK+ gtk_init (&argc, &argv); // SSL #if defined USE_GNUTLS || defined USE_OPENSSL init_locks (); #endif // libnotify #ifdef HAVE_LIBNOTIFY notify_init ("uGet"); #endif // GStreamer #ifdef HAVE_GSTREAMER gst_inited = gst_init_check (&argc, &argv, NULL); #endif ugtk_app = g_malloc0 (sizeof (UgtkApp)); ugtk_app_init (ugtk_app, rpc); // signal handler signal (SIGINT, sys_signal_handler); signal (SIGTERM, sys_signal_handler); signal (SIGABRT, sys_signal_handler); // signal (SIGSEGV, sys_signal_handler); // signal (SIGQUIT, sys_signal_handler); gtk_main (); // avoid crash when program re-enter signal handler. ugtk_quitting = TRUE; // clear/free other resource uget_app_clear_attachment ((UgetApp*) ugtk_app); ugtk_app_final (ugtk_app); g_free (ugtk_app); // sleep 2 second to wait thread and shutdown RPC g_usleep (1000000); uget_rpc_free (rpc); g_usleep (1000000); // libnotify #ifdef HAVE_LIBNOTIFY if (notify_is_initted ()) notify_uninit (); #endif // SSL #if defined USE_GNUTLS || defined USE_OPENSSL kill_locks (); #endif return EXIT_SUCCESS; } uget-2.2.2/ui-gtk/UgtkDownloadForm.c0000664000175000017500000011641513470304403014204 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include // UGTK_APP_NAME #include static void ugtk_download_form_init_page1 (UgtkDownloadForm* dform, UgtkProxyForm* proxy); static void ugtk_download_form_init_page2 (UgtkDownloadForm* dform); // signal handler static void on_spin_changed (GtkEditable *editable, UgtkDownloadForm* dform); static void on_entry_changed (GtkEditable *editable, UgtkDownloadForm* dform); static void on_uri_entry_changed (GtkEditable *editable, UgtkDownloadForm* dform); static void on_http_entry_changed (GtkEditable *editable, UgtkDownloadForm* dform); static void on_select_folder (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform); static void on_select_cookie (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform); static void on_select_post (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform); void ugtk_download_form_init (UgtkDownloadForm* dform, UgtkProxyForm* proxy, GtkWindow* parent) { dform->changed.enable = TRUE; dform->changed.uri = FALSE; dform->changed.file = FALSE; dform->changed.folder = FALSE; dform->changed.user = FALSE; dform->changed.password = FALSE; dform->changed.referrer = FALSE; dform->changed.cookie = FALSE; dform->changed.post = FALSE; dform->changed.agent = FALSE; dform->changed.retry = FALSE; dform->changed.delay = FALSE; dform->changed.timestamp= FALSE; dform->parent = parent; ugtk_download_form_init_page1 (dform, proxy); ugtk_download_form_init_page2 (dform); gtk_widget_show_all (dform->page1); gtk_widget_show_all (dform->page2); } static void ugtk_download_form_init_page1 (UgtkDownloadForm* dform, UgtkProxyForm* proxy) { GtkWidget* widget; GtkGrid* top_grid; GtkGrid* grid; GtkWidget* frame; GtkBox* top_vbox; GtkWidget* vbox; GtkWidget* hbox; dform->page1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); top_vbox = (GtkBox*) dform->page1; gtk_container_set_border_width (GTK_CONTAINER (top_vbox), 2); top_grid = (GtkGrid*) gtk_grid_new (); gtk_box_pack_start (top_vbox, (GtkWidget*) top_grid, FALSE, FALSE, 0); // URL - entry widget = gtk_entry_new (); // gtk_entry_set_width_chars (GTK_ENTRY (widget), 20); // remove for GTK+ 3.12 gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin-left", 1, "margin-right", 1, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); g_object_set (widget, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, widget, 1, 0, 2, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_uri_entry_changed), dform); dform->uri_entry = widget; // URL - label widget = gtk_label_new_with_mnemonic (_("_URI:")); gtk_label_set_mnemonic_widget (GTK_LABEL(widget), dform->uri_entry); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (top_grid, widget, 0, 0, 1, 1); dform->uri_label = widget; // Mirrors - entry widget = gtk_entry_new (); // gtk_entry_set_width_chars (GTK_ENTRY (widget), 20); // remove for GTK+ 3.12 gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin-left", 1, "margin-right", 1, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); g_object_set (widget, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, widget, 1, 1, 2, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_uri_entry_changed), dform); dform->mirrors_entry = widget; // Mirrors - label widget = gtk_label_new_with_mnemonic (_("Mirrors:")); gtk_label_set_mnemonic_widget (GTK_LABEL(widget), dform->mirrors_entry); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (top_grid, widget, 0, 1, 1, 1); dform->mirrors_label = widget; // File - entry widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_entry_set_placeholder_text (GTK_ENTRY (widget), _("Leave blank to use default filename ...")); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, widget, 1, 2, 2, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_entry_changed), dform); dform->file_entry = widget; // File - label widget = gtk_label_new_with_mnemonic (_("File:")); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dform->file_entry); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (top_grid, widget, 0, 2, 1, 1); dform->file_label = widget; // Folder - combo entry + icon dform->folder_combo = gtk_combo_box_text_new_with_entry (); dform->folder_entry = gtk_bin_get_child (GTK_BIN (dform->folder_combo)); widget = dform->folder_entry; gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, "folder"); #else gtk_entry_set_icon_from_stock (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIRECTORY); #endif gtk_entry_set_icon_tooltip_text (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, _("Select Folder")); g_object_set (dform->folder_combo, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, dform->folder_combo, 1, 3, 1, 1); g_signal_connect (widget, "icon-release", G_CALLBACK (on_select_folder), dform); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_entry_changed), dform); // Folder - label widget = gtk_label_new_with_mnemonic (_("_Folder:")); gtk_label_set_mnemonic_widget(GTK_LABEL (widget), dform->folder_combo); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (top_grid, widget, 0, 3, 1, 1); // Referrer - entry widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, widget, 1, 4, 2, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_http_entry_changed), dform); dform->referrer_entry = widget; // Referrer - label widget = gtk_label_new_with_mnemonic (_("Referrer:")); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dform->referrer_entry); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (top_grid, widget, 0, 4, 1, 1); // dform->referrer_label = widget; // ---------------------------------------------------- // Connections // HBox for Connections hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (top_vbox, hbox, FALSE, FALSE, 2); // connections - label // widget = gtk_label_new (_("connections")); // gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 2); // dform->label_connections = widget; // connections - spin button widget = gtk_spin_button_new_with_range (1.0, 16.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY (widget), 3); // remove for GTK+ 3.12 gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 2); dform->spin_connections = widget; // "Max Connections:" - title label widget = gtk_label_new_with_mnemonic (_("_Max Connections:")); gtk_label_set_mnemonic_widget ((GtkLabel*)widget, dform->spin_connections); gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 2); dform->title_connections = widget; // ---------------------------------------------------- // HBox for "Status" and "Login" hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (top_vbox, hbox, FALSE, FALSE, 2); // ---------------------------------------------------- // frame for Status (start mode) frame = gtk_frame_new (_("Status")); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); dform->radio_runnable = gtk_radio_button_new_with_mnemonic (NULL, _("_Runnable")); dform->radio_pause = gtk_radio_button_new_with_mnemonic_from_widget ( (GtkRadioButton*)dform->radio_runnable, _("P_ause")); gtk_box_pack_start (GTK_BOX (vbox), dform->radio_runnable, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), dform->radio_pause, FALSE, FALSE, 0); // ---------------------------------------------------- // frame for login frame = gtk_frame_new (_("Login")); grid = (GtkGrid*) gtk_grid_new (); gtk_container_set_border_width (GTK_CONTAINER (grid), 2); gtk_container_add (GTK_CONTAINER (frame), (GtkWidget*) grid); gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 2); // User - entry widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 1, 0, 1, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_entry_changed), dform); dform->username_entry = widget; // User - label widget = gtk_label_new (_("User:")); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 0, 1, 1); // dform->username_label = widget; // Password - entry widget = gtk_entry_new (); gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 1, 1, 1, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_entry_changed), dform); dform->password_entry = widget; // Password - label widget = gtk_label_new (_("Password:")); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 1, 1, 1); // dform->password_label = widget; // ---------------------------------------------------- // proxy // ug_proxy_widget_init (&dform->proxy_dform); if (proxy) { widget = proxy->self; gtk_box_pack_start (top_vbox, widget, FALSE, FALSE, 2); } } static void ugtk_download_form_init_page2 (UgtkDownloadForm* dform) { GtkWidget* widget; GtkGrid* grid; dform->page2 = gtk_grid_new (); grid = (GtkGrid*) dform->page2; gtk_container_set_border_width (GTK_CONTAINER (grid), 2); // label - cookie file widget = gtk_label_new (_("Cookie file:")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 0, 1, 1); dform->cookie_label = widget; // entry - cookie file widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, "text-x-generic"); #else gtk_entry_set_icon_from_stock (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FILE); #endif gtk_entry_set_icon_tooltip_text (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, _("Select Cookie File")); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 1, 0, 3, 1); g_signal_connect (widget, "icon-release", G_CALLBACK (on_select_cookie), dform); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_http_entry_changed), dform); dform->cookie_entry = widget; // label - post file widget = gtk_label_new (_("Post file:")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 1, 1, 1); dform->post_label = widget; // entry - post file widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, "text-x-generic"); #else gtk_entry_set_icon_from_stock (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FILE); #endif gtk_entry_set_icon_tooltip_text (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY, _("Select Post File")); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 1, 1, 3, 1); g_signal_connect (widget, "icon-release", G_CALLBACK (on_select_post), dform); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_http_entry_changed), dform); dform->post_entry = widget; // label - user agent widget = gtk_label_new (_("User Agent:")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 2, 1, 1); dform->agent_label = widget; // entry - user agent widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 1, 2, 3, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_http_entry_changed), dform); dform->agent_entry = widget; // Retry limit - label widget = gtk_label_new_with_mnemonic (_("Retry _limit:")); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dform->spin_retry); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 3, 2, 1); // Retry limit - spin button widget = gtk_spin_button_new_with_range (0.0, 99.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 2, 3, 1, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_spin_changed), dform); dform->spin_retry = widget; // counts - label widget = gtk_label_new (_("counts")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 3, 3, 1, 1); // Retry delay - label widget = gtk_label_new_with_mnemonic (_("Retry _delay:")); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dform->spin_delay); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 4, 2, 1); // Retry delay - spin button widget = gtk_spin_button_new_with_range (0.0, 600.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 2, 4, 1, 1); g_signal_connect (GTK_EDITABLE (widget), "changed", G_CALLBACK (on_spin_changed), dform); dform->spin_delay = widget; // seconds - label widget = gtk_label_new (_("seconds")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 3, 4, 1, 1); // label - Max upload speed widget = gtk_label_new (_("Max upload speed:")); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 5, 2, 1); // spin - Max upload speed widget = gtk_spin_button_new_with_range (0, 99999999, 1); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY (widget), 8); g_object_set (widget, "margin", 1, NULL); gtk_grid_attach (grid, widget, 2, 5, 1, 1); dform->spin_upload_speed = (GtkSpinButton*) widget; // label - "KiB/s" widget = gtk_label_new (_("KiB/s")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 3, 5, 1, 1); // label - Max download speed widget = gtk_label_new (_("Max download speed:")); g_object_set (widget, "margin-left", 2, "margin-right", 2, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 6, 2, 1); // spin - Max download speed widget = gtk_spin_button_new_with_range (0, 99999999, 1); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY (widget), 8); g_object_set (widget, "margin", 1, NULL); gtk_grid_attach (grid, widget, 2, 6, 1, 1); dform->spin_download_speed = (GtkSpinButton*) widget; // label - "KiB/s" widget = gtk_label_new (_("KiB/s")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 3, 6, 1, 1); // Retrieve timestamp widget = gtk_check_button_new_with_label (_("Retrieve timestamp")); g_object_set (widget, "margin-top", 3, "margin-bottom", 1, NULL); gtk_grid_attach (grid, widget, 0, 7, 3, 1); dform->timestamp = (GtkToggleButton*) widget; } void ugtk_download_form_get (UgtkDownloadForm* dform, UgInfo* node_info) { UgUri uuri; const gchar* text; gint number; union { UgetRelation* relation; UgetCommon* common; UgetHttp* http; } temp; // ------------------------------------------ // UgetCommon temp.common = ug_info_realloc(node_info, UgetCommonInfo); // folder text = gtk_entry_get_text ((GtkEntry*)dform->folder_entry); ug_free (temp.common->folder); temp.common->folder = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->folder, temp.common->folder); // user text = gtk_entry_get_text ((GtkEntry*)dform->username_entry); ug_free (temp.common->user); temp.common->user = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->user, temp.common->user); // password text = gtk_entry_get_text ((GtkEntry*)dform->password_entry); ug_free (temp.common->password); temp.common->password = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->password, temp.common->password); // retry_limit number = gtk_spin_button_get_value_as_int ((GtkSpinButton*) dform->spin_retry); temp.common->retry_limit = number; // retry_delay number = gtk_spin_button_get_value_as_int ((GtkSpinButton*) dform->spin_delay); temp.common->retry_delay = number; // max_upload_speed number = gtk_spin_button_get_value_as_int ((GtkSpinButton*) dform->spin_upload_speed) * 1024; temp.common->max_upload_speed = number; // max_download_speed number = gtk_spin_button_get_value_as_int ((GtkSpinButton*) dform->spin_download_speed) * 1024; temp.common->max_download_speed = number; // max_connections number = gtk_spin_button_get_value_as_int ((GtkSpinButton*) dform->spin_connections); temp.common->max_connections = number; // timestamp temp.common->timestamp = gtk_toggle_button_get_active (dform->timestamp); // URI if (gtk_widget_is_sensitive (dform->uri_entry) == TRUE) { text = gtk_entry_get_text ((GtkEntry*)dform->uri_entry); ug_free (temp.common->uri); temp.common->uri = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->uri, temp.common->uri); if (temp.common->uri) { ug_uri_init (&uuri, temp.common->uri); // set user number = ug_uri_user (&uuri, &text); if (number > 0) { ug_free (temp.common->user); temp.common->user = ug_strndup (text, number); } // set password number = ug_uri_password (&uuri, &text); if (number > 0) { ug_free (temp.common->password); temp.common->password = ug_strndup (text, number); } // Remove user & password from URL if (uuri.authority != uuri.host) { memmove ((char*)uuri.uri + uuri.authority, (char*)uuri.uri + uuri.host, strlen (uuri.uri + uuri.host) + 1); } } } // mirrors if (gtk_widget_is_sensitive (dform->mirrors_entry) == TRUE) { text = gtk_entry_get_text ((GtkEntry*)dform->mirrors_entry); ug_free (temp.common->mirrors); temp.common->mirrors = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->mirrors, temp.common->mirrors); } // file if (gtk_widget_is_sensitive (dform->file_entry) == TRUE) { text = gtk_entry_get_text ((GtkEntry*)dform->file_entry); ug_free (temp.common->file); temp.common->file = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.common->file, temp.common->file); } // ------------------------------------------ // UgetHttp temp.http = ug_info_realloc(node_info, UgetHttpInfo); // referrer text = gtk_entry_get_text ((GtkEntry*) dform->referrer_entry); ug_free (temp.http->referrer); temp.http->referrer = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.http->referrer, temp.http->referrer); // cookie_file text = gtk_entry_get_text ((GtkEntry*) dform->cookie_entry); ug_free (temp.http->cookie_file); temp.http->cookie_file = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.http->cookie_file, temp.http->cookie_file); // post_file text = gtk_entry_get_text ((GtkEntry*) dform->post_entry); ug_free (temp.http->post_file); temp.http->post_file = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.http->post_file, temp.http->post_file); // user_agent text = gtk_entry_get_text ((GtkEntry*) dform->agent_entry); ug_free (temp.http->user_agent); temp.http->user_agent = (*text) ? ug_strdup (text) : NULL; ug_str_remove_crlf (temp.http->user_agent, temp.http->user_agent); // ------------------------------------------ // UgetRelation if (gtk_widget_get_sensitive (dform->radio_pause)) { temp.relation = ug_info_realloc(node_info, UgetRelationInfo); if (gtk_toggle_button_get_active ((GtkToggleButton*) dform->radio_pause)) temp.relation->group |= UGET_GROUP_PAUSED; else temp.relation->group &= ~UGET_GROUP_PAUSED; } } void ugtk_download_form_set (UgtkDownloadForm* dform, UgInfo* node_info, gboolean keep_changed) { UgetRelation* relation; UgetCommon* common; UgetHttp* http; common = ug_info_realloc(node_info, UgetCommonInfo); http = ug_info_get(node_info, UgetHttpInfo); // disable changed flags dform->changed.enable = FALSE; // ------------------------------------------ // UgetCommon // set changed flags if (keep_changed == FALSE && common) { dform->changed.uri = common->keeping.uri; dform->changed.mirrors = common->keeping.mirrors; dform->changed.file = common->keeping.file; dform->changed.folder = common->keeping.folder; dform->changed.user = common->keeping.user; dform->changed.password = common->keeping.password; dform->changed.retry = common->keeping.retry_limit; dform->changed.delay = common->keeping.retry_delay; dform->changed.max_upload_speed = common->keeping.max_upload_speed; dform->changed.max_download_speed = common->keeping.max_download_speed; dform->changed.timestamp = common->keeping.timestamp; } // set data if (keep_changed==FALSE || dform->changed.uri==FALSE) { if (gtk_widget_is_sensitive (dform->uri_entry)) { gtk_entry_set_text ((GtkEntry*) dform->uri_entry, (common && common->uri) ? common->uri : ""); } } if (keep_changed==FALSE || dform->changed.mirrors==FALSE) { if (gtk_widget_is_sensitive (dform->mirrors_entry)) { gtk_entry_set_text ((GtkEntry*) dform->mirrors_entry, (common && common->mirrors) ? common->mirrors : ""); } } if (keep_changed==FALSE || dform->changed.file==FALSE) { if (gtk_widget_is_sensitive (dform->file_entry)) { gtk_entry_set_text ((GtkEntry*) dform->file_entry, (common && common->file) ? common->file : ""); // set changed flags if (common && common->file) dform->changed.file = TRUE; } } if (keep_changed==FALSE || dform->changed.folder==FALSE) { g_signal_handlers_block_by_func (GTK_EDITABLE (dform->folder_entry), on_entry_changed, dform); gtk_entry_set_text ((GtkEntry*) dform->folder_entry, (common && common->folder) ? common->folder : ""); g_signal_handlers_unblock_by_func (GTK_EDITABLE (dform->folder_entry), on_entry_changed, dform); } if (keep_changed==FALSE || dform->changed.user==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->username_entry, (common && common->user) ? common->user : ""); } if (keep_changed==FALSE || dform->changed.password==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->password_entry, (common && common->password) ? common->password : ""); } if (keep_changed==FALSE || dform->changed.retry==FALSE) { gtk_spin_button_set_value ((GtkSpinButton*) dform->spin_retry, (common) ? common->retry_limit : 99); } if (keep_changed==FALSE || dform->changed.delay==FALSE) { gtk_spin_button_set_value ((GtkSpinButton*) dform->spin_delay, (common) ? common->retry_delay : 6); } if (keep_changed==FALSE || dform->changed.max_upload_speed==FALSE) { gtk_spin_button_set_value ((GtkSpinButton*) dform->spin_upload_speed, (gdouble) (common->max_upload_speed / 1024)); } if (keep_changed==FALSE || dform->changed.max_download_speed==FALSE) { gtk_spin_button_set_value ((GtkSpinButton*) dform->spin_download_speed, (gdouble) (common->max_download_speed / 1024)); } if (keep_changed==FALSE || dform->changed.connections==FALSE) { gtk_spin_button_set_value ((GtkSpinButton*) dform->spin_connections, common->max_connections); } if (keep_changed==FALSE || dform->changed.timestamp==FALSE) gtk_toggle_button_set_active (dform->timestamp, common->timestamp); // ------------------------------------------ // UgetHttp // set data if (keep_changed==FALSE || dform->changed.referrer==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->referrer_entry, (http && http->referrer) ? http->referrer : ""); } if (keep_changed==FALSE || dform->changed.cookie==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->cookie_entry, (http && http->cookie_file) ? http->cookie_file : ""); } if (keep_changed==FALSE || dform->changed.post==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->post_entry, (http && http->post_file) ? http->post_file : ""); } if (keep_changed==FALSE || dform->changed.agent==FALSE) { gtk_entry_set_text ((GtkEntry*) dform->agent_entry, (http && http->user_agent) ? http->user_agent : ""); } // set changed flags if (keep_changed==FALSE && http) { dform->changed.referrer = http->keeping.referrer; dform->changed.cookie = http->keeping.cookie_file; dform->changed.post = http->keeping.post_file; dform->changed.agent = http->keeping.user_agent; } // ------------------------------------------ // UgetRelation if (gtk_widget_get_sensitive (dform->radio_pause)) { relation = ug_info_realloc(node_info, UgetRelationInfo); if (relation->group & UGET_GROUP_PAUSED) gtk_toggle_button_set_active ((GtkToggleButton*) dform->radio_pause, TRUE); else gtk_toggle_button_set_active ((GtkToggleButton*) dform->radio_runnable, TRUE); } // enable changed flags dform->changed.enable = TRUE; // complete entry ugtk_download_form_complete_entry (dform); } void ugtk_download_form_set_multiple (UgtkDownloadForm* dform, gboolean multiple_mode) { // dform->multiple = multiple_mode; if (multiple_mode) { gtk_widget_hide (dform->uri_label); gtk_widget_hide (dform->uri_entry); gtk_widget_hide (dform->mirrors_label); gtk_widget_hide (dform->mirrors_entry); gtk_widget_hide (dform->file_label); gtk_widget_hide (dform->file_entry); } else { gtk_widget_show (dform->uri_label); gtk_widget_show (dform->uri_entry); gtk_widget_show (dform->mirrors_label); gtk_widget_show (dform->mirrors_entry); gtk_widget_show (dform->file_label); gtk_widget_show (dform->file_entry); } multiple_mode = !multiple_mode; gtk_widget_set_sensitive (dform->uri_label, multiple_mode); gtk_widget_set_sensitive (dform->uri_entry, multiple_mode); gtk_widget_set_sensitive (dform->mirrors_label, multiple_mode); gtk_widget_set_sensitive (dform->mirrors_entry, multiple_mode); gtk_widget_set_sensitive (dform->file_label, multiple_mode); gtk_widget_set_sensitive (dform->file_entry, multiple_mode); } void ugtk_download_form_set_folders (UgtkDownloadForm* dform, UgtkSetting* setting) { GtkComboBoxText* combo; UgLink* link; dform->changed.enable = FALSE; g_signal_handlers_block_by_func (GTK_EDITABLE (dform->folder_entry), on_entry_changed, dform); combo = GTK_COMBO_BOX_TEXT (dform->folder_combo); for (link = setting->folder_history.head; link; link = link->next) gtk_combo_box_text_append_text (combo, link->data); // set default folder gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); g_signal_handlers_unblock_by_func (GTK_EDITABLE (dform->folder_entry), on_entry_changed, dform); dform->changed.enable = TRUE; } void ugtk_download_form_get_folders (UgtkDownloadForm* dform, UgtkSetting* setting) { const gchar* current; current = gtk_entry_get_text ((GtkEntry*) dform->folder_entry); ugtk_setting_add_folder (setting, current); } void ugtk_download_form_complete_entry (UgtkDownloadForm* dform) { const gchar* text; // gchar* temp; UgUri upart; gboolean completed = FALSE; // URL text = gtk_entry_get_text ((GtkEntry*) dform->uri_entry); ug_uri_init (&upart, text); if (upart.host != -1) { // disable changed flags dform->changed.enable = FALSE; #if 0 // complete file entry text = gtk_entry_get_text ((GtkEntry*) dform->file_entry); if (text[0] == 0 || dform->changed.file == FALSE) { temp = ug_uri_get_file (&upart); gtk_entry_set_text ((GtkEntry*) dform->file_entry, (temp) ? temp : "index.htm"); g_free (temp); } // complete user entry text = gtk_entry_get_text ((GtkEntry*) dform->username_entry); if (text[0] == 0 || dform->changed.user == FALSE) { temp = ug_uri_get_user (&upart); gtk_entry_set_text ((GtkEntry*) dform->username_entry, (temp) ? temp : ""); g_free (temp); } // complete password entry text = gtk_entry_get_text ((GtkEntry*) dform->password_entry); if (text[0] == 0 || dform->changed.password == FALSE) { temp = ug_uri_get_password (&upart); gtk_entry_set_text ((GtkEntry*) dform->password_entry, (temp) ? temp : ""); g_free (temp); } #endif // enable changed flags dform->changed.enable = TRUE; // status completed = TRUE; } #if 1 // check existing for file name else if (ug_uri_part_file (&upart, &text) > 0) { completed = TRUE; } #else // file extension else if (ug_uri_part_file_ext (&upart, &text) > 0) { // torrent or metalink file path if (*text == 'm' || *text == 'M' || *text == 't' || *text == 'T') completed = TRUE; } #endif else if (upart.path > 0 && upart.uri[upart.path] != 0) completed = TRUE; else if (gtk_widget_is_sensitive (dform->uri_entry) == FALSE) completed = TRUE; dform->completed = completed; } // ---------------------------------------------------------------------------- // signal handler static void on_spin_changed (GtkEditable* editable, UgtkDownloadForm* dform) { if (dform->changed.enable) { if (editable == GTK_EDITABLE (dform->spin_retry)) dform->changed.retry = TRUE; else if (editable == GTK_EDITABLE (dform->spin_delay)) dform->changed.delay = TRUE; } } static void on_entry_changed (GtkEditable* editable, UgtkDownloadForm* dform) { if (dform->changed.enable) { if (editable == GTK_EDITABLE (dform->file_entry)) dform->changed.file = TRUE; else if (editable == GTK_EDITABLE (dform->folder_entry)) dform->changed.folder = TRUE; else if (editable == GTK_EDITABLE (dform->username_entry)) dform->changed.user = TRUE; else if (editable == GTK_EDITABLE (dform->password_entry)) dform->changed.password = TRUE; } } static void on_uri_entry_changed (GtkEditable* editable, UgtkDownloadForm* dform) { if (dform->changed.enable) { dform->changed.uri = TRUE; ugtk_download_form_complete_entry (dform); } } static void on_http_entry_changed (GtkEditable* editable, UgtkDownloadForm* dform) { if (dform->changed.enable) { if (editable == GTK_EDITABLE (dform->referrer_entry)) dform->changed.referrer = TRUE; else if (editable == GTK_EDITABLE (dform->cookie_entry)) dform->changed.cookie = TRUE; else if (editable == GTK_EDITABLE (dform->post_entry)) dform->changed.post = TRUE; else if (editable == GTK_EDITABLE (dform->agent_entry)) dform->changed.agent = TRUE; } } static void on_select_folder_response (GtkDialog* chooser, gint response, UgtkDownloadForm* dform) { gchar* file; gchar* path; if (response == GTK_RESPONSE_OK ) { file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); path = g_filename_to_utf8 (file, -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (dform->folder_entry), path); g_free (path); g_free (file); } gtk_widget_destroy (GTK_WIDGET (chooser)); if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, TRUE); } static void on_select_folder (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform) { GtkWidget* chooser; gchar* path; gchar* title; // disable sensitive of parent window // enable sensitive in function on_file_chooser_response() if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, FALSE); title = g_strconcat (UGTK_APP_NAME " - ", _("Select Folder"), NULL); chooser = gtk_file_chooser_dialog_new (title, dform->parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_free (title); gtk_window_set_transient_for ((GtkWindow*) chooser, dform->parent); gtk_window_set_destroy_with_parent ((GtkWindow*) chooser, TRUE); path = (gchar*) gtk_entry_get_text ((GtkEntry*) dform->folder_entry); if (*path) { path = g_filename_from_utf8 (path, -1, NULL, NULL, NULL); gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (chooser), path); g_free (path); } g_signal_connect (chooser, "response", G_CALLBACK (on_select_folder_response), dform); if (gtk_window_get_modal (dform->parent)) gtk_dialog_run ((GtkDialog*) chooser); else { gtk_window_set_modal ((GtkWindow*) chooser, FALSE); gtk_widget_show (chooser); } } static void on_select_cookie_response (GtkDialog* chooser, gint response, UgtkDownloadForm* dform) { gchar* file; gchar* path; if (response == GTK_RESPONSE_OK ) { file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); path = g_filename_to_utf8 (file, -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (dform->cookie_entry), path); g_free (path); g_free (file); } gtk_widget_destroy (GTK_WIDGET (chooser)); if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, TRUE); } static void on_select_cookie (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform) { GtkWidget* chooser; gchar* path; gchar* title; // disable sensitive of parent window // enable sensitive in function on_file_chooser_response() if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, FALSE); title = g_strconcat (UGTK_APP_NAME " - ", _("Select Cookie File"), NULL); chooser = gtk_file_chooser_dialog_new (title, dform->parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_free (title); gtk_window_set_transient_for ((GtkWindow*) chooser, dform->parent); gtk_window_set_destroy_with_parent ((GtkWindow*) chooser, TRUE); path = (gchar*) gtk_entry_get_text ((GtkEntry*) dform->cookie_entry); if (*path) { path = g_filename_from_utf8 (path, -1, NULL, NULL, NULL); gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (chooser), path); g_free (path); } g_signal_connect (chooser, "response", G_CALLBACK (on_select_cookie_response), dform); if (gtk_window_get_modal (dform->parent)) gtk_dialog_run ((GtkDialog*) chooser); else { gtk_window_set_modal ((GtkWindow*) chooser, FALSE); gtk_widget_show (chooser); } } static void on_select_post_response (GtkDialog* chooser, gint response, UgtkDownloadForm* dform) { gchar* file; gchar* path; if (response == GTK_RESPONSE_OK ) { file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); path = g_filename_to_utf8 (file, -1, NULL, NULL, NULL); gtk_entry_set_text (GTK_ENTRY (dform->post_entry), path); g_free (path); g_free (file); } gtk_widget_destroy (GTK_WIDGET (chooser)); if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, TRUE); } static void on_select_post (GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent* event, UgtkDownloadForm* dform) { GtkWidget* chooser; gchar* path; gchar* title; // disable sensitive of parent window // enable sensitive in function on_file_chooser_response() if (dform->parent) gtk_widget_set_sensitive ((GtkWidget*) dform->parent, FALSE); title = g_strconcat (UGTK_APP_NAME " - ", _("Select Post File"), NULL); chooser = gtk_file_chooser_dialog_new (title, dform->parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_free (title); gtk_window_set_transient_for ((GtkWindow*) chooser, dform->parent); gtk_window_set_destroy_with_parent ((GtkWindow*) chooser, TRUE); path = (gchar*) gtk_entry_get_text ((GtkEntry*) dform->post_entry); if (*path) { path = g_filename_from_utf8 (path, -1, NULL, NULL, NULL); gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (chooser), path); g_free (path); } g_signal_connect (chooser, "response", G_CALLBACK (on_select_post_response), dform); if (gtk_window_get_modal (dform->parent)) gtk_dialog_run ((GtkDialog*) chooser); else { gtk_window_set_modal ((GtkWindow*) chooser, FALSE); gtk_widget_show (chooser); } } uget-2.2.2/ui-gtk/UgtkBanner.c0000664000175000017500000002305413470304403013012 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include static GdkCursor* hand_cursor = NULL; static GdkCursor* regular_cursor = NULL; static gboolean motion_notify_event (GtkWidget* tv_widget, GdkEventMotion* event, UgtkBanner* banner); static gboolean event_after (GtkWidget* text_view, GdkEvent* ev, UgtkBanner* banner); static GtkWidget* create_x_button (UgtkBanner* banner); void ugtk_banner_init (struct UgtkBanner* banner) { GtkStyleContext* style_context; GdkRGBA rgba; hand_cursor = gdk_cursor_new (GDK_HAND2); regular_cursor = gdk_cursor_new (GDK_XTERM); banner->self = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); banner->buffer = gtk_text_buffer_new (NULL); banner->tag_link = gtk_text_buffer_create_tag (banner->buffer, NULL, "underline", PANGO_UNDERLINE_SINGLE, NULL); banner->text_view = (GtkTextView*) gtk_text_view_new_with_buffer (banner->buffer); g_object_unref (banner->buffer); gtk_text_view_set_cursor_visible (banner->text_view, FALSE); gtk_text_view_set_editable (banner->text_view, FALSE); gtk_box_pack_start (GTK_BOX (banner->self), GTK_WIDGET (banner->text_view), TRUE, TRUE, 0); g_signal_connect (banner->text_view, "event-after", G_CALLBACK (event_after), banner); g_signal_connect (banner->text_view, "motion-notify-event", G_CALLBACK (motion_notify_event), banner); // style: color style_context = gtk_widget_get_style_context (GTK_WIDGET (banner->text_view)); gtk_style_context_get_background_color (style_context, GTK_STATE_FLAG_SELECTED, &rgba); // gtk_widget_override_background_color ( // GTK_WIDGET (banner->text_view), GTK_STATE_FLAG_NORMAL, &rgba); gtk_style_context_get_color (style_context, GTK_STATE_FLAG_SELECTED, &rgba); // gtk_widget_override_color ( // GTK_WIDGET (banner->text_view), GTK_STATE_FLAG_NORMAL, &rgba); // close button gtk_box_pack_end (GTK_BOX (banner->self), create_x_button (banner), FALSE, FALSE, 0); banner->show_builtin = 2; banner->rss.self = NULL; banner->rss.feed = NULL; banner->rss.item = NULL; } int ugtk_banner_show_rss (UgtkBanner* banner, UgetRss* urss) { banner->rss.self = urss; banner->rss.feed = NULL; banner->rss.item = NULL; banner->rss.feed = uget_rss_find_updated (urss, NULL); if (banner->rss.feed) banner->rss.item = uget_rss_feed_find (banner->rss.feed, banner->rss.feed->checked); if (banner->rss.item) ugtk_banner_show (banner, banner->rss.item->title, banner->rss.item->link); else { gtk_widget_hide (banner->self); return FALSE; } return TRUE; } void ugtk_banner_show (UgtkBanner* banner, const char* title, const char* url) { GtkTextIter iter; gtk_text_buffer_set_text(banner->buffer, "", 0); gtk_text_buffer_get_iter_at_offset (banner->buffer, &iter, 0); gtk_text_buffer_insert (banner->buffer, &iter, " ", 2); g_free (banner->link); if (url == NULL) { banner->link = NULL; gtk_text_buffer_insert (banner->buffer, &iter, title, -1); } else { banner->link = g_strdup (url); gtk_text_buffer_insert_with_tags (banner->buffer, &iter, title, -1, banner->tag_link, NULL); } gtk_widget_show (banner->self); } void ugtk_banner_show_donation (UgtkBanner* banner) { GtkTextIter iter; gtk_text_buffer_set_text(banner->buffer, "", 0); gtk_text_buffer_get_iter_at_offset (banner->buffer, &iter, 0); gtk_text_buffer_insert (banner->buffer, &iter, " ", 2); gtk_text_buffer_insert (banner->buffer, &iter, _("Attention uGetters:"), -1); gtk_text_buffer_insert (banner->buffer, &iter, " ", 1); gtk_text_buffer_insert (banner->buffer, &iter, _("we are running a Donation Drive " "for uGet's Future Development, please click "), -1); gtk_text_buffer_insert_with_tags (banner->buffer, &iter, _("HERE"), -1, banner->tag_link, NULL); g_free (banner->link); banner->link = g_strdup ("http://ugetdm.com/donate"); gtk_widget_show (banner->self); } void ugtk_banner_show_survey (UgtkBanner* banner) { GtkTextIter iter; gtk_text_buffer_set_text(banner->buffer, "", 0); gtk_text_buffer_get_iter_at_offset (banner->buffer, &iter, 0); gtk_text_buffer_insert (banner->buffer, &iter, " ", 2); gtk_text_buffer_insert (banner->buffer, &iter, _("Attention uGetters:"), -1); gtk_text_buffer_insert (banner->buffer, &iter, " ", 1); gtk_text_buffer_insert (banner->buffer, &iter, _("please fill out this quick User Survey for uGet."), -1); gtk_text_buffer_insert (banner->buffer, &iter, " - ", 3); gtk_text_buffer_insert_with_tags (banner->buffer, &iter, _("click here to take survey"), -1, banner->tag_link, NULL); g_free (banner->link); banner->link = g_strdup ("http://ugetdm.com/survey"); gtk_widget_show (banner->self); } // ---------------------------------------------------------------------------- // static functions /* Links can also be activated by clicking. */ static gboolean event_after (GtkWidget* text_view, GdkEvent* ev, UgtkBanner* banner) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; GdkEventButton *event; gint x, y; GSList* slist; if (ev->type != GDK_BUTTON_RELEASE) return FALSE; event = (GdkEventButton *)ev; if (event->button != GDK_BUTTON_PRIMARY) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); /* we shouldn't follow a link if the user has selected something */ gtk_text_buffer_get_selection_bounds (buffer, &start, &end); if (gtk_text_iter_get_offset (&start) != gtk_text_iter_get_offset (&end)) return FALSE; gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, (gint) event->x, (gint) event->y, &x, &y); gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (text_view), &iter, x, y); slist = gtk_text_iter_get_tags (&iter); if (slist) { if (banner->link) ugtk_launch_uri (banner->link); g_slist_free (slist); } return FALSE; } /* Update the cursor image if the pointer moved. */ /* Looks at all tags covering the position (x, y) in the text view, * and if one of them is a link, change the cursor to the "hands" cursor * typically used by web browsers. */ static gboolean motion_notify_event (GtkWidget* tv_widget, GdkEventMotion* event, UgtkBanner* banner) { GtkTextView* text_view; gint x, y; gboolean hovering = FALSE; GSList* slist; GtkTextIter iter; text_view = GTK_TEXT_VIEW (tv_widget); gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_WIDGET, (gint) event->x, (gint) event->y, &x, &y); // set cursor if appropriate gtk_text_view_get_iter_at_location (text_view, &iter, x, y); slist = gtk_text_iter_get_tags (&iter); if (slist) hovering = TRUE; if (banner->hovering_over_link != hovering) { banner->hovering_over_link = hovering; if (banner->hovering_over_link) { gdk_window_set_cursor (gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT), hand_cursor); } else { gdk_window_set_cursor (gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT), regular_cursor); } } if (slist) g_slist_free (slist); return FALSE; } // ------------------------------------ static gboolean on_x_button_release (GtkWidget* text_view, GdkEvent* ev, UgtkBanner* banner) { GdkEventButton* event; event = (GdkEventButton*) ev; if (event->button != GDK_BUTTON_PRIMARY) return FALSE; if (banner->rss.self) { if (banner->rss.feed && banner->rss.item) banner->rss.feed->checked = banner->rss.item->updated; if (ugtk_banner_show_rss (banner, banner->rss.self)) return FALSE; } if (banner->show_builtin > 0) { banner->show_builtin--; if (banner->show_builtin == 1) ugtk_banner_show_donation (banner); else { ugtk_banner_show_survey (banner); banner->show_builtin = 0; } return FALSE; } gtk_widget_hide (banner->self); return FALSE; } static GtkWidget* create_x_button (UgtkBanner* banner) { GtkWidget* event_box; GtkWidget* label; label = gtk_label_new (" X "); event_box = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (event_box), label); g_signal_connect (event_box, "button-release-event", G_CALLBACK (on_x_button_release), banner); return event_box; } uget-2.2.2/ui-gtk/UgtkConfirmDialog.h0000664000175000017500000000433113470304403014324 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_CONFIRM_DIALOG_H #define UGTK_CONFIRM_DIALOG_H #include #include #ifdef __cplusplus extern "C" { #endif typedef enum { UGTK_CONFIRM_DIALOG_EXIT, UGTK_CONFIRM_DIALOG_DELETE, UGTK_CONFIRM_DIALOG_DELETE_CATEGORY, } UgtkConfirmDialogMode; typedef struct UgtkConfirmDialog UgtkConfirmDialog; struct UgtkConfirmDialog { GtkDialog* self; UgtkApp* app; GtkToggleButton* confirmation; }; UgtkConfirmDialog* ugtk_confirm_dialog_new (UgtkConfirmDialogMode mode, UgtkApp* app); void ugtk_confirm_dialog_run (UgtkConfirmDialog* cdialog); #ifdef __cplusplus } #endif #endif // UGTK_CONFIRM_DIALOG_H uget-2.2.2/ui-gtk/UgtkUtil.c0000664000175000017500000001722613470304403012526 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #if defined _WIN32 || defined _WIN64 #include #include // ShellExecuteW() #endif #if defined _WIN32 || defined _WIN64 gboolean ugtk_launch_uri (const gchar* uri) { int result; result = (int) ShellExecuteA(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL); if (result > 32) return TRUE; return FALSE; } gboolean ugtk_launch_default_app (const gchar* folder, const gchar* file) { gchar* path; gunichar2* path_wcs; if (folder == NULL) path = g_build_filename (file, NULL); else path = g_build_filename (folder, file, NULL); if (g_file_test (path, G_FILE_TEST_EXISTS) == FALSE) { g_free (path); return FALSE; } // UNICODE path_wcs = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); g_free (path); ShellExecuteW (NULL, L"open", path_wcs, NULL, NULL, SW_SHOW); g_free (path_wcs); return TRUE; } #else gboolean ugtk_launch_uri (const gchar* uri) { GError* error = NULL; g_app_info_launch_default_for_uri (uri, NULL, &error); if (error) { g_error_free (error); return FALSE; } return TRUE; } gboolean ugtk_launch_default_app (const gchar* folder, const gchar* file) { GError* error = NULL; GFile* gfile; gchar* uri; gchar* path; gchar* path_wcs; path = g_build_filename (folder, file, NULL); path_wcs = g_filename_from_utf8 (path, -1, NULL, NULL, NULL); g_free (path); if (g_file_test (path_wcs, G_FILE_TEST_EXISTS) == FALSE) { g_free (path_wcs); return FALSE; } gfile = g_file_new_for_path (path_wcs); g_free (path_wcs); uri = g_file_get_uri (gfile); g_object_unref (gfile); g_app_info_launch_default_for_uri (uri, NULL, &error); g_free (uri); if (error) { #ifndef NDEBUG g_print ("%s", error->message); #endif g_error_free (error); } return TRUE; } #endif // _WIN32 || _WIN64 // ---------------------------------------------------------------------------- // URI list functions // get URIs from text file GList* ugtk_text_file_get_uris (const gchar* file_utf8, GError** error) { GIOChannel* channel; GList* list; gchar* string; gchar* escaped; gsize line_len; string = g_filename_from_utf8 (file_utf8, -1, NULL, NULL, NULL); channel = g_io_channel_new_file (string, "r", error); g_free (string); if (channel == NULL) return NULL; ugtk_io_channel_decide_encoding (channel); list = NULL; while (g_io_channel_read_line (channel, &string, NULL, &line_len, NULL) == G_IO_STATUS_NORMAL) { if (string == NULL) continue; string[line_len] = 0; // clear '\n' in tail // check URI scheme escaped = g_uri_parse_scheme (string); if (escaped == NULL) { g_free (escaped); g_free (string); } else { g_free (escaped); // if URI is not valid UTF-8 string, escape it. if (g_utf8_validate (string, -1, NULL) == FALSE) { escaped = g_uri_escape_string (string, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE); g_free (string); string = escaped; } list = g_list_prepend (list, string); } } g_io_channel_unref (channel); return g_list_reverse (list); } // get URIs from text GList* ugtk_text_get_uris (const gchar* text) { GList* list; gchar* escaped; gchar* line; gint line_len; gint text_len; gint offset; text_len = strlen (text); list = NULL; for (offset = 0; offset < text_len; offset += line_len +1) { line_len = strcspn (text + offset, "\r\n"); line = g_strndup (text + offset, line_len); // check URI scheme escaped = g_uri_parse_scheme (line); if (escaped == NULL) { g_free (escaped); g_free (line); } else { g_free (escaped); // if URI is not valid UTF-8 string, escape it. if (g_utf8_validate (line, -1, NULL) == FALSE) { escaped = g_uri_escape_string (line, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE); g_free (line); line = escaped; } list = g_list_prepend (list, line); } } return g_list_reverse (list); } GList* ugtk_uri_list_remove_scheme (GList* list, const gchar* scheme) { GList* link; gchar* text; for (link = list; link; link = link->next) { text = g_uri_parse_scheme (link->data); if (text == NULL || strcmp (text, scheme) == 0) { g_free (link->data); link->data = NULL; } g_free (text); } return g_list_remove_all (list, NULL); } // ---------------------------------------------------------------------------- // Used by ug_io_channel_decide_encoding() // BOM = Byte Order Mark #define UG_BOM_UTF32BE "\x00\x00\xFE\xFF" #define UG_BOM_UTF32BE_LEN 4 #define UG_BOM_UTF32LE "\xFF\xFE\x00\x00" #define UG_BOM_UTF32LE_LEN 4 #define UG_BOM_UTF8 "\xEF\xBB\xBF" #define UG_BOM_UTF8_LEN 3 #define UG_BOM_UTF16BE "\xFE\xFF" #define UG_BOM_UTF16BE_LEN 2 #define UG_BOM_UTF16LE "\xFF\xFE" #define UG_BOM_UTF16LE_LEN 2 const char* ugtk_io_channel_decide_encoding (GIOChannel* channel) { gchar* encoding; gchar bom[4]; guint bom_len; // The internal encoding is always UTF-8. // set encoding NULL is safe to use with binary data. g_io_channel_set_encoding (channel, NULL, NULL); // read 4 bytes BOM (Byte Order Mark) if (g_io_channel_read_chars (channel, bom, 4, NULL, NULL) != G_IO_STATUS_NORMAL) return NULL; if (memcmp (bom, UG_BOM_UTF32BE, UG_BOM_UTF32BE_LEN) == 0) { bom_len = UG_BOM_UTF32BE_LEN; encoding = "UTF-32BE"; } else if (memcmp (bom, UG_BOM_UTF32LE, UG_BOM_UTF32LE_LEN) == 0) { bom_len = UG_BOM_UTF32LE_LEN; encoding = "UTF-32LE"; } else if (memcmp (bom, UG_BOM_UTF8, UG_BOM_UTF8_LEN) == 0) { bom_len = UG_BOM_UTF8_LEN; encoding = "UTF-8"; } else if (memcmp (bom, UG_BOM_UTF16BE, UG_BOM_UTF16BE_LEN) == 0) { bom_len = UG_BOM_UTF16BE_LEN; encoding = "UTF-16BE"; } else if (memcmp (bom, UG_BOM_UTF16LE, UG_BOM_UTF16LE_LEN) == 0) { bom_len = UG_BOM_UTF16LE_LEN; encoding = "UTF-16LE"; } else { bom_len = 0; encoding = NULL; // encoding = "UTF-8"; } // repositioned before set encoding. This flushes all the internal buffers. g_io_channel_seek_position (channel, bom_len, G_SEEK_SET, NULL); // The encoding can be set now. g_io_channel_set_encoding (channel, encoding, NULL); return encoding; } uget-2.2.2/ui-gtk/Makefile.in0000664000175000017500000025160413470304627012667 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = uget-gtk$(EXEEXT) subdir = ui-gtk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_uget_gtk_OBJECTS = uget_gtk-UgtkUtil.$(OBJEXT) \ uget_gtk-UgtkConfig.$(OBJEXT) uget_gtk-UgtkSetting.$(OBJEXT) \ uget_gtk-UgtkNodeList.$(OBJEXT) \ uget_gtk-UgtkNodeTree.$(OBJEXT) \ uget_gtk-UgtkNodeView.$(OBJEXT) \ uget_gtk-UgtkTraveler.$(OBJEXT) uget_gtk-UgtkSummary.$(OBJEXT) \ uget_gtk-UgtkTrayIcon.$(OBJEXT) uget_gtk-UgtkBanner.$(OBJEXT) \ uget_gtk-UgtkSequence.$(OBJEXT) \ uget_gtk-UgtkSelector.$(OBJEXT) \ uget_gtk-UgtkProxyForm.$(OBJEXT) \ uget_gtk-UgtkDownloadForm.$(OBJEXT) \ uget_gtk-UgtkCategoryForm.$(OBJEXT) \ uget_gtk-UgtkNodeDialog.$(OBJEXT) \ uget_gtk-UgtkBatchDialog.$(OBJEXT) \ uget_gtk-UgtkScheduleForm.$(OBJEXT) \ uget_gtk-UgtkSettingForm.$(OBJEXT) \ uget_gtk-UgtkSettingDialog.$(OBJEXT) \ uget_gtk-UgtkConfirmDialog.$(OBJEXT) \ uget_gtk-UgtkAboutDialog.$(OBJEXT) \ uget_gtk-UgtkMenubar.$(OBJEXT) \ uget_gtk-UgtkMenubar-ui.$(OBJEXT) uget_gtk-UgtkApp.$(OBJEXT) \ uget_gtk-UgtkApp-ui.$(OBJEXT) \ uget_gtk-UgtkApp-callback.$(OBJEXT) \ uget_gtk-UgtkApp-timeout.$(OBJEXT) \ uget_gtk-UgtkApp-main.$(OBJEXT) uget_gtk_OBJECTS = $(am_uget_gtk_OBJECTS) uget_gtk_DEPENDENCIES = $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a uget_gtk_LINK = $(CCLD) $(uget_gtk_CFLAGS) $(CFLAGS) \ $(uget_gtk_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/uget_gtk-UgtkAboutDialog.Po \ ./$(DEPDIR)/uget_gtk-UgtkApp-callback.Po \ ./$(DEPDIR)/uget_gtk-UgtkApp-main.Po \ ./$(DEPDIR)/uget_gtk-UgtkApp-timeout.Po \ ./$(DEPDIR)/uget_gtk-UgtkApp-ui.Po \ ./$(DEPDIR)/uget_gtk-UgtkApp.Po \ ./$(DEPDIR)/uget_gtk-UgtkBanner.Po \ ./$(DEPDIR)/uget_gtk-UgtkBatchDialog.Po \ ./$(DEPDIR)/uget_gtk-UgtkCategoryForm.Po \ ./$(DEPDIR)/uget_gtk-UgtkConfig.Po \ ./$(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po \ ./$(DEPDIR)/uget_gtk-UgtkDownloadForm.Po \ ./$(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po \ ./$(DEPDIR)/uget_gtk-UgtkMenubar.Po \ ./$(DEPDIR)/uget_gtk-UgtkNodeDialog.Po \ ./$(DEPDIR)/uget_gtk-UgtkNodeList.Po \ ./$(DEPDIR)/uget_gtk-UgtkNodeTree.Po \ ./$(DEPDIR)/uget_gtk-UgtkNodeView.Po \ ./$(DEPDIR)/uget_gtk-UgtkProxyForm.Po \ ./$(DEPDIR)/uget_gtk-UgtkScheduleForm.Po \ ./$(DEPDIR)/uget_gtk-UgtkSelector.Po \ ./$(DEPDIR)/uget_gtk-UgtkSequence.Po \ ./$(DEPDIR)/uget_gtk-UgtkSetting.Po \ ./$(DEPDIR)/uget_gtk-UgtkSettingDialog.Po \ ./$(DEPDIR)/uget_gtk-UgtkSettingForm.Po \ ./$(DEPDIR)/uget_gtk-UgtkSummary.Po \ ./$(DEPDIR)/uget_gtk-UgtkTraveler.Po \ ./$(DEPDIR)/uget_gtk-UgtkTrayIcon.Po \ ./$(DEPDIR)/uget_gtk-UgtkUtil.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(uget_gtk_SOURCES) DIST_SOURCES = $(uget_gtk_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ uget_gtk_CPPFLAGS = \ -DUG_DATADIR='"$(datadir)"' \ -I$(top_srcdir)/ui-gtk \ -I$(top_srcdir)/uget \ -I$(top_srcdir)/uglib uget_gtk_CFLAGS = \ @PTHREAD_CFLAGS@ \ @LFS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBGCRYPT_CFLAGS@ \ @LIBCRYPTO_CFLAGS@ \ @GTK_CFLAGS@ \ @LIBNOTIFY_CFLAGS@ \ @APP_INDICATOR_CFLAGS@ \ @GSTREAMER_CFLAGS@ \ @LIBPWMD_CFLAGS@ uget_gtk_LDFLAGS = @LFS_LDFLAGS@ uget_gtk_LDADD = \ $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a \ @PTHREAD_LIBS@ \ @CURL_LIBS@ \ @LIBGCRYPT_LIBS@ \ @LIBCRYPTO_LIBS@ \ @GTK_LIBS@ \ @LIBNOTIFY_LIBS@ \ @APP_INDICATOR_LIBS@ \ @GSTREAMER_LIBS@ \ @LIBPWMD_LIBS@ uget_gtk_SOURCES = \ UgtkUtil.c UgtkConfig.c UgtkSetting.c \ UgtkNodeList.c UgtkNodeTree.c UgtkNodeView.c \ UgtkTraveler.c UgtkSummary.c \ UgtkTrayIcon.c UgtkBanner.c \ UgtkSequence.c UgtkSelector.c \ UgtkProxyForm.c UgtkDownloadForm.c UgtkCategoryForm.c \ UgtkNodeDialog.c UgtkBatchDialog.c \ UgtkScheduleForm.c UgtkSettingForm.c UgtkSettingDialog.c \ UgtkConfirmDialog.c UgtkAboutDialog.c \ UgtkMenubar.c UgtkMenubar-ui.c \ UgtkApp.c UgtkApp-ui.c UgtkApp-callback.c \ UgtkApp-timeout.c UgtkApp-main.c noinst_HEADERS = \ UgtkUtil.h UgtkConfig.h UgtkSetting.h \ UgtkNodeList.h UgtkNodeTree.h UgtkNodeView.h \ UgtkTraveler.h UgtkSummary.h \ UgtkTrayIcon.h UgtkBanner.h \ UgtkSequence.h UgtkSelector.h \ UgtkProxyForm.h UgtkDownloadForm.h UgtkCategoryForm.h \ UgtkNodeDialog.h UgtkBatchDialog.h \ UgtkScheduleForm.h UgtkSettingForm.h UgtkSettingDialog.h \ UgtkConfirmDialog.h UgtkAboutDialog.h \ UgtkMenubar.h \ UgtkApp.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ui-gtk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ui-gtk/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) uget-gtk$(EXEEXT): $(uget_gtk_OBJECTS) $(uget_gtk_DEPENDENCIES) $(EXTRA_uget_gtk_DEPENDENCIES) @rm -f uget-gtk$(EXEEXT) $(AM_V_CCLD)$(uget_gtk_LINK) $(uget_gtk_OBJECTS) $(uget_gtk_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkAboutDialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkApp-callback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkApp-main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkApp-timeout.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkApp-ui.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkApp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkBanner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkBatchDialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkCategoryForm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkConfig.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkDownloadForm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkMenubar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkNodeDialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkNodeList.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkNodeTree.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkNodeView.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkProxyForm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkScheduleForm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSelector.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSequence.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSetting.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSettingDialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSettingForm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkSummary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkTraveler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkTrayIcon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uget_gtk-UgtkUtil.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` uget_gtk-UgtkUtil.o: UgtkUtil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkUtil.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkUtil.Tpo -c -o uget_gtk-UgtkUtil.o `test -f 'UgtkUtil.c' || echo '$(srcdir)/'`UgtkUtil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkUtil.Tpo $(DEPDIR)/uget_gtk-UgtkUtil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkUtil.c' object='uget_gtk-UgtkUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkUtil.o `test -f 'UgtkUtil.c' || echo '$(srcdir)/'`UgtkUtil.c uget_gtk-UgtkUtil.obj: UgtkUtil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkUtil.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkUtil.Tpo -c -o uget_gtk-UgtkUtil.obj `if test -f 'UgtkUtil.c'; then $(CYGPATH_W) 'UgtkUtil.c'; else $(CYGPATH_W) '$(srcdir)/UgtkUtil.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkUtil.Tpo $(DEPDIR)/uget_gtk-UgtkUtil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkUtil.c' object='uget_gtk-UgtkUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkUtil.obj `if test -f 'UgtkUtil.c'; then $(CYGPATH_W) 'UgtkUtil.c'; else $(CYGPATH_W) '$(srcdir)/UgtkUtil.c'; fi` uget_gtk-UgtkConfig.o: UgtkConfig.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkConfig.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkConfig.Tpo -c -o uget_gtk-UgtkConfig.o `test -f 'UgtkConfig.c' || echo '$(srcdir)/'`UgtkConfig.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkConfig.Tpo $(DEPDIR)/uget_gtk-UgtkConfig.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkConfig.c' object='uget_gtk-UgtkConfig.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkConfig.o `test -f 'UgtkConfig.c' || echo '$(srcdir)/'`UgtkConfig.c uget_gtk-UgtkConfig.obj: UgtkConfig.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkConfig.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkConfig.Tpo -c -o uget_gtk-UgtkConfig.obj `if test -f 'UgtkConfig.c'; then $(CYGPATH_W) 'UgtkConfig.c'; else $(CYGPATH_W) '$(srcdir)/UgtkConfig.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkConfig.Tpo $(DEPDIR)/uget_gtk-UgtkConfig.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkConfig.c' object='uget_gtk-UgtkConfig.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkConfig.obj `if test -f 'UgtkConfig.c'; then $(CYGPATH_W) 'UgtkConfig.c'; else $(CYGPATH_W) '$(srcdir)/UgtkConfig.c'; fi` uget_gtk-UgtkSetting.o: UgtkSetting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSetting.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSetting.Tpo -c -o uget_gtk-UgtkSetting.o `test -f 'UgtkSetting.c' || echo '$(srcdir)/'`UgtkSetting.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSetting.Tpo $(DEPDIR)/uget_gtk-UgtkSetting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSetting.c' object='uget_gtk-UgtkSetting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSetting.o `test -f 'UgtkSetting.c' || echo '$(srcdir)/'`UgtkSetting.c uget_gtk-UgtkSetting.obj: UgtkSetting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSetting.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSetting.Tpo -c -o uget_gtk-UgtkSetting.obj `if test -f 'UgtkSetting.c'; then $(CYGPATH_W) 'UgtkSetting.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSetting.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSetting.Tpo $(DEPDIR)/uget_gtk-UgtkSetting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSetting.c' object='uget_gtk-UgtkSetting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSetting.obj `if test -f 'UgtkSetting.c'; then $(CYGPATH_W) 'UgtkSetting.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSetting.c'; fi` uget_gtk-UgtkNodeList.o: UgtkNodeList.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeList.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeList.Tpo -c -o uget_gtk-UgtkNodeList.o `test -f 'UgtkNodeList.c' || echo '$(srcdir)/'`UgtkNodeList.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeList.Tpo $(DEPDIR)/uget_gtk-UgtkNodeList.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeList.c' object='uget_gtk-UgtkNodeList.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeList.o `test -f 'UgtkNodeList.c' || echo '$(srcdir)/'`UgtkNodeList.c uget_gtk-UgtkNodeList.obj: UgtkNodeList.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeList.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeList.Tpo -c -o uget_gtk-UgtkNodeList.obj `if test -f 'UgtkNodeList.c'; then $(CYGPATH_W) 'UgtkNodeList.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeList.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeList.Tpo $(DEPDIR)/uget_gtk-UgtkNodeList.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeList.c' object='uget_gtk-UgtkNodeList.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeList.obj `if test -f 'UgtkNodeList.c'; then $(CYGPATH_W) 'UgtkNodeList.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeList.c'; fi` uget_gtk-UgtkNodeTree.o: UgtkNodeTree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeTree.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeTree.Tpo -c -o uget_gtk-UgtkNodeTree.o `test -f 'UgtkNodeTree.c' || echo '$(srcdir)/'`UgtkNodeTree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeTree.Tpo $(DEPDIR)/uget_gtk-UgtkNodeTree.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeTree.c' object='uget_gtk-UgtkNodeTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeTree.o `test -f 'UgtkNodeTree.c' || echo '$(srcdir)/'`UgtkNodeTree.c uget_gtk-UgtkNodeTree.obj: UgtkNodeTree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeTree.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeTree.Tpo -c -o uget_gtk-UgtkNodeTree.obj `if test -f 'UgtkNodeTree.c'; then $(CYGPATH_W) 'UgtkNodeTree.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeTree.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeTree.Tpo $(DEPDIR)/uget_gtk-UgtkNodeTree.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeTree.c' object='uget_gtk-UgtkNodeTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeTree.obj `if test -f 'UgtkNodeTree.c'; then $(CYGPATH_W) 'UgtkNodeTree.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeTree.c'; fi` uget_gtk-UgtkNodeView.o: UgtkNodeView.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeView.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeView.Tpo -c -o uget_gtk-UgtkNodeView.o `test -f 'UgtkNodeView.c' || echo '$(srcdir)/'`UgtkNodeView.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeView.Tpo $(DEPDIR)/uget_gtk-UgtkNodeView.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeView.c' object='uget_gtk-UgtkNodeView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeView.o `test -f 'UgtkNodeView.c' || echo '$(srcdir)/'`UgtkNodeView.c uget_gtk-UgtkNodeView.obj: UgtkNodeView.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeView.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeView.Tpo -c -o uget_gtk-UgtkNodeView.obj `if test -f 'UgtkNodeView.c'; then $(CYGPATH_W) 'UgtkNodeView.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeView.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeView.Tpo $(DEPDIR)/uget_gtk-UgtkNodeView.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeView.c' object='uget_gtk-UgtkNodeView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeView.obj `if test -f 'UgtkNodeView.c'; then $(CYGPATH_W) 'UgtkNodeView.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeView.c'; fi` uget_gtk-UgtkTraveler.o: UgtkTraveler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkTraveler.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkTraveler.Tpo -c -o uget_gtk-UgtkTraveler.o `test -f 'UgtkTraveler.c' || echo '$(srcdir)/'`UgtkTraveler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkTraveler.Tpo $(DEPDIR)/uget_gtk-UgtkTraveler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkTraveler.c' object='uget_gtk-UgtkTraveler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkTraveler.o `test -f 'UgtkTraveler.c' || echo '$(srcdir)/'`UgtkTraveler.c uget_gtk-UgtkTraveler.obj: UgtkTraveler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkTraveler.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkTraveler.Tpo -c -o uget_gtk-UgtkTraveler.obj `if test -f 'UgtkTraveler.c'; then $(CYGPATH_W) 'UgtkTraveler.c'; else $(CYGPATH_W) '$(srcdir)/UgtkTraveler.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkTraveler.Tpo $(DEPDIR)/uget_gtk-UgtkTraveler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkTraveler.c' object='uget_gtk-UgtkTraveler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkTraveler.obj `if test -f 'UgtkTraveler.c'; then $(CYGPATH_W) 'UgtkTraveler.c'; else $(CYGPATH_W) '$(srcdir)/UgtkTraveler.c'; fi` uget_gtk-UgtkSummary.o: UgtkSummary.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSummary.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSummary.Tpo -c -o uget_gtk-UgtkSummary.o `test -f 'UgtkSummary.c' || echo '$(srcdir)/'`UgtkSummary.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSummary.Tpo $(DEPDIR)/uget_gtk-UgtkSummary.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSummary.c' object='uget_gtk-UgtkSummary.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSummary.o `test -f 'UgtkSummary.c' || echo '$(srcdir)/'`UgtkSummary.c uget_gtk-UgtkSummary.obj: UgtkSummary.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSummary.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSummary.Tpo -c -o uget_gtk-UgtkSummary.obj `if test -f 'UgtkSummary.c'; then $(CYGPATH_W) 'UgtkSummary.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSummary.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSummary.Tpo $(DEPDIR)/uget_gtk-UgtkSummary.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSummary.c' object='uget_gtk-UgtkSummary.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSummary.obj `if test -f 'UgtkSummary.c'; then $(CYGPATH_W) 'UgtkSummary.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSummary.c'; fi` uget_gtk-UgtkTrayIcon.o: UgtkTrayIcon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkTrayIcon.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkTrayIcon.Tpo -c -o uget_gtk-UgtkTrayIcon.o `test -f 'UgtkTrayIcon.c' || echo '$(srcdir)/'`UgtkTrayIcon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkTrayIcon.Tpo $(DEPDIR)/uget_gtk-UgtkTrayIcon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkTrayIcon.c' object='uget_gtk-UgtkTrayIcon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkTrayIcon.o `test -f 'UgtkTrayIcon.c' || echo '$(srcdir)/'`UgtkTrayIcon.c uget_gtk-UgtkTrayIcon.obj: UgtkTrayIcon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkTrayIcon.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkTrayIcon.Tpo -c -o uget_gtk-UgtkTrayIcon.obj `if test -f 'UgtkTrayIcon.c'; then $(CYGPATH_W) 'UgtkTrayIcon.c'; else $(CYGPATH_W) '$(srcdir)/UgtkTrayIcon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkTrayIcon.Tpo $(DEPDIR)/uget_gtk-UgtkTrayIcon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkTrayIcon.c' object='uget_gtk-UgtkTrayIcon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkTrayIcon.obj `if test -f 'UgtkTrayIcon.c'; then $(CYGPATH_W) 'UgtkTrayIcon.c'; else $(CYGPATH_W) '$(srcdir)/UgtkTrayIcon.c'; fi` uget_gtk-UgtkBanner.o: UgtkBanner.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkBanner.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkBanner.Tpo -c -o uget_gtk-UgtkBanner.o `test -f 'UgtkBanner.c' || echo '$(srcdir)/'`UgtkBanner.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkBanner.Tpo $(DEPDIR)/uget_gtk-UgtkBanner.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkBanner.c' object='uget_gtk-UgtkBanner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkBanner.o `test -f 'UgtkBanner.c' || echo '$(srcdir)/'`UgtkBanner.c uget_gtk-UgtkBanner.obj: UgtkBanner.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkBanner.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkBanner.Tpo -c -o uget_gtk-UgtkBanner.obj `if test -f 'UgtkBanner.c'; then $(CYGPATH_W) 'UgtkBanner.c'; else $(CYGPATH_W) '$(srcdir)/UgtkBanner.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkBanner.Tpo $(DEPDIR)/uget_gtk-UgtkBanner.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkBanner.c' object='uget_gtk-UgtkBanner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkBanner.obj `if test -f 'UgtkBanner.c'; then $(CYGPATH_W) 'UgtkBanner.c'; else $(CYGPATH_W) '$(srcdir)/UgtkBanner.c'; fi` uget_gtk-UgtkSequence.o: UgtkSequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSequence.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSequence.Tpo -c -o uget_gtk-UgtkSequence.o `test -f 'UgtkSequence.c' || echo '$(srcdir)/'`UgtkSequence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSequence.Tpo $(DEPDIR)/uget_gtk-UgtkSequence.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSequence.c' object='uget_gtk-UgtkSequence.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSequence.o `test -f 'UgtkSequence.c' || echo '$(srcdir)/'`UgtkSequence.c uget_gtk-UgtkSequence.obj: UgtkSequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSequence.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSequence.Tpo -c -o uget_gtk-UgtkSequence.obj `if test -f 'UgtkSequence.c'; then $(CYGPATH_W) 'UgtkSequence.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSequence.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSequence.Tpo $(DEPDIR)/uget_gtk-UgtkSequence.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSequence.c' object='uget_gtk-UgtkSequence.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSequence.obj `if test -f 'UgtkSequence.c'; then $(CYGPATH_W) 'UgtkSequence.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSequence.c'; fi` uget_gtk-UgtkSelector.o: UgtkSelector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSelector.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSelector.Tpo -c -o uget_gtk-UgtkSelector.o `test -f 'UgtkSelector.c' || echo '$(srcdir)/'`UgtkSelector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSelector.Tpo $(DEPDIR)/uget_gtk-UgtkSelector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSelector.c' object='uget_gtk-UgtkSelector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSelector.o `test -f 'UgtkSelector.c' || echo '$(srcdir)/'`UgtkSelector.c uget_gtk-UgtkSelector.obj: UgtkSelector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSelector.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSelector.Tpo -c -o uget_gtk-UgtkSelector.obj `if test -f 'UgtkSelector.c'; then $(CYGPATH_W) 'UgtkSelector.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSelector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSelector.Tpo $(DEPDIR)/uget_gtk-UgtkSelector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSelector.c' object='uget_gtk-UgtkSelector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSelector.obj `if test -f 'UgtkSelector.c'; then $(CYGPATH_W) 'UgtkSelector.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSelector.c'; fi` uget_gtk-UgtkProxyForm.o: UgtkProxyForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkProxyForm.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkProxyForm.Tpo -c -o uget_gtk-UgtkProxyForm.o `test -f 'UgtkProxyForm.c' || echo '$(srcdir)/'`UgtkProxyForm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkProxyForm.Tpo $(DEPDIR)/uget_gtk-UgtkProxyForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkProxyForm.c' object='uget_gtk-UgtkProxyForm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkProxyForm.o `test -f 'UgtkProxyForm.c' || echo '$(srcdir)/'`UgtkProxyForm.c uget_gtk-UgtkProxyForm.obj: UgtkProxyForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkProxyForm.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkProxyForm.Tpo -c -o uget_gtk-UgtkProxyForm.obj `if test -f 'UgtkProxyForm.c'; then $(CYGPATH_W) 'UgtkProxyForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkProxyForm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkProxyForm.Tpo $(DEPDIR)/uget_gtk-UgtkProxyForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkProxyForm.c' object='uget_gtk-UgtkProxyForm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkProxyForm.obj `if test -f 'UgtkProxyForm.c'; then $(CYGPATH_W) 'UgtkProxyForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkProxyForm.c'; fi` uget_gtk-UgtkDownloadForm.o: UgtkDownloadForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkDownloadForm.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkDownloadForm.Tpo -c -o uget_gtk-UgtkDownloadForm.o `test -f 'UgtkDownloadForm.c' || echo '$(srcdir)/'`UgtkDownloadForm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkDownloadForm.Tpo $(DEPDIR)/uget_gtk-UgtkDownloadForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkDownloadForm.c' object='uget_gtk-UgtkDownloadForm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkDownloadForm.o `test -f 'UgtkDownloadForm.c' || echo '$(srcdir)/'`UgtkDownloadForm.c uget_gtk-UgtkDownloadForm.obj: UgtkDownloadForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkDownloadForm.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkDownloadForm.Tpo -c -o uget_gtk-UgtkDownloadForm.obj `if test -f 'UgtkDownloadForm.c'; then $(CYGPATH_W) 'UgtkDownloadForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkDownloadForm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkDownloadForm.Tpo $(DEPDIR)/uget_gtk-UgtkDownloadForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkDownloadForm.c' object='uget_gtk-UgtkDownloadForm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkDownloadForm.obj `if test -f 'UgtkDownloadForm.c'; then $(CYGPATH_W) 'UgtkDownloadForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkDownloadForm.c'; fi` uget_gtk-UgtkCategoryForm.o: UgtkCategoryForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkCategoryForm.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkCategoryForm.Tpo -c -o uget_gtk-UgtkCategoryForm.o `test -f 'UgtkCategoryForm.c' || echo '$(srcdir)/'`UgtkCategoryForm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkCategoryForm.Tpo $(DEPDIR)/uget_gtk-UgtkCategoryForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkCategoryForm.c' object='uget_gtk-UgtkCategoryForm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkCategoryForm.o `test -f 'UgtkCategoryForm.c' || echo '$(srcdir)/'`UgtkCategoryForm.c uget_gtk-UgtkCategoryForm.obj: UgtkCategoryForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkCategoryForm.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkCategoryForm.Tpo -c -o uget_gtk-UgtkCategoryForm.obj `if test -f 'UgtkCategoryForm.c'; then $(CYGPATH_W) 'UgtkCategoryForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkCategoryForm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkCategoryForm.Tpo $(DEPDIR)/uget_gtk-UgtkCategoryForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkCategoryForm.c' object='uget_gtk-UgtkCategoryForm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkCategoryForm.obj `if test -f 'UgtkCategoryForm.c'; then $(CYGPATH_W) 'UgtkCategoryForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkCategoryForm.c'; fi` uget_gtk-UgtkNodeDialog.o: UgtkNodeDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeDialog.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeDialog.Tpo -c -o uget_gtk-UgtkNodeDialog.o `test -f 'UgtkNodeDialog.c' || echo '$(srcdir)/'`UgtkNodeDialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeDialog.Tpo $(DEPDIR)/uget_gtk-UgtkNodeDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeDialog.c' object='uget_gtk-UgtkNodeDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeDialog.o `test -f 'UgtkNodeDialog.c' || echo '$(srcdir)/'`UgtkNodeDialog.c uget_gtk-UgtkNodeDialog.obj: UgtkNodeDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkNodeDialog.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkNodeDialog.Tpo -c -o uget_gtk-UgtkNodeDialog.obj `if test -f 'UgtkNodeDialog.c'; then $(CYGPATH_W) 'UgtkNodeDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeDialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkNodeDialog.Tpo $(DEPDIR)/uget_gtk-UgtkNodeDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkNodeDialog.c' object='uget_gtk-UgtkNodeDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkNodeDialog.obj `if test -f 'UgtkNodeDialog.c'; then $(CYGPATH_W) 'UgtkNodeDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkNodeDialog.c'; fi` uget_gtk-UgtkBatchDialog.o: UgtkBatchDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkBatchDialog.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkBatchDialog.Tpo -c -o uget_gtk-UgtkBatchDialog.o `test -f 'UgtkBatchDialog.c' || echo '$(srcdir)/'`UgtkBatchDialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkBatchDialog.Tpo $(DEPDIR)/uget_gtk-UgtkBatchDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkBatchDialog.c' object='uget_gtk-UgtkBatchDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkBatchDialog.o `test -f 'UgtkBatchDialog.c' || echo '$(srcdir)/'`UgtkBatchDialog.c uget_gtk-UgtkBatchDialog.obj: UgtkBatchDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkBatchDialog.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkBatchDialog.Tpo -c -o uget_gtk-UgtkBatchDialog.obj `if test -f 'UgtkBatchDialog.c'; then $(CYGPATH_W) 'UgtkBatchDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkBatchDialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkBatchDialog.Tpo $(DEPDIR)/uget_gtk-UgtkBatchDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkBatchDialog.c' object='uget_gtk-UgtkBatchDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkBatchDialog.obj `if test -f 'UgtkBatchDialog.c'; then $(CYGPATH_W) 'UgtkBatchDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkBatchDialog.c'; fi` uget_gtk-UgtkScheduleForm.o: UgtkScheduleForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkScheduleForm.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkScheduleForm.Tpo -c -o uget_gtk-UgtkScheduleForm.o `test -f 'UgtkScheduleForm.c' || echo '$(srcdir)/'`UgtkScheduleForm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkScheduleForm.Tpo $(DEPDIR)/uget_gtk-UgtkScheduleForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkScheduleForm.c' object='uget_gtk-UgtkScheduleForm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkScheduleForm.o `test -f 'UgtkScheduleForm.c' || echo '$(srcdir)/'`UgtkScheduleForm.c uget_gtk-UgtkScheduleForm.obj: UgtkScheduleForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkScheduleForm.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkScheduleForm.Tpo -c -o uget_gtk-UgtkScheduleForm.obj `if test -f 'UgtkScheduleForm.c'; then $(CYGPATH_W) 'UgtkScheduleForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkScheduleForm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkScheduleForm.Tpo $(DEPDIR)/uget_gtk-UgtkScheduleForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkScheduleForm.c' object='uget_gtk-UgtkScheduleForm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkScheduleForm.obj `if test -f 'UgtkScheduleForm.c'; then $(CYGPATH_W) 'UgtkScheduleForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkScheduleForm.c'; fi` uget_gtk-UgtkSettingForm.o: UgtkSettingForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSettingForm.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSettingForm.Tpo -c -o uget_gtk-UgtkSettingForm.o `test -f 'UgtkSettingForm.c' || echo '$(srcdir)/'`UgtkSettingForm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSettingForm.Tpo $(DEPDIR)/uget_gtk-UgtkSettingForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSettingForm.c' object='uget_gtk-UgtkSettingForm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSettingForm.o `test -f 'UgtkSettingForm.c' || echo '$(srcdir)/'`UgtkSettingForm.c uget_gtk-UgtkSettingForm.obj: UgtkSettingForm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSettingForm.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSettingForm.Tpo -c -o uget_gtk-UgtkSettingForm.obj `if test -f 'UgtkSettingForm.c'; then $(CYGPATH_W) 'UgtkSettingForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSettingForm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSettingForm.Tpo $(DEPDIR)/uget_gtk-UgtkSettingForm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSettingForm.c' object='uget_gtk-UgtkSettingForm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSettingForm.obj `if test -f 'UgtkSettingForm.c'; then $(CYGPATH_W) 'UgtkSettingForm.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSettingForm.c'; fi` uget_gtk-UgtkSettingDialog.o: UgtkSettingDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSettingDialog.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSettingDialog.Tpo -c -o uget_gtk-UgtkSettingDialog.o `test -f 'UgtkSettingDialog.c' || echo '$(srcdir)/'`UgtkSettingDialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSettingDialog.Tpo $(DEPDIR)/uget_gtk-UgtkSettingDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSettingDialog.c' object='uget_gtk-UgtkSettingDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSettingDialog.o `test -f 'UgtkSettingDialog.c' || echo '$(srcdir)/'`UgtkSettingDialog.c uget_gtk-UgtkSettingDialog.obj: UgtkSettingDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkSettingDialog.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkSettingDialog.Tpo -c -o uget_gtk-UgtkSettingDialog.obj `if test -f 'UgtkSettingDialog.c'; then $(CYGPATH_W) 'UgtkSettingDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSettingDialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkSettingDialog.Tpo $(DEPDIR)/uget_gtk-UgtkSettingDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkSettingDialog.c' object='uget_gtk-UgtkSettingDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkSettingDialog.obj `if test -f 'UgtkSettingDialog.c'; then $(CYGPATH_W) 'UgtkSettingDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkSettingDialog.c'; fi` uget_gtk-UgtkConfirmDialog.o: UgtkConfirmDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkConfirmDialog.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Tpo -c -o uget_gtk-UgtkConfirmDialog.o `test -f 'UgtkConfirmDialog.c' || echo '$(srcdir)/'`UgtkConfirmDialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Tpo $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkConfirmDialog.c' object='uget_gtk-UgtkConfirmDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkConfirmDialog.o `test -f 'UgtkConfirmDialog.c' || echo '$(srcdir)/'`UgtkConfirmDialog.c uget_gtk-UgtkConfirmDialog.obj: UgtkConfirmDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkConfirmDialog.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Tpo -c -o uget_gtk-UgtkConfirmDialog.obj `if test -f 'UgtkConfirmDialog.c'; then $(CYGPATH_W) 'UgtkConfirmDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkConfirmDialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Tpo $(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkConfirmDialog.c' object='uget_gtk-UgtkConfirmDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkConfirmDialog.obj `if test -f 'UgtkConfirmDialog.c'; then $(CYGPATH_W) 'UgtkConfirmDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkConfirmDialog.c'; fi` uget_gtk-UgtkAboutDialog.o: UgtkAboutDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkAboutDialog.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkAboutDialog.Tpo -c -o uget_gtk-UgtkAboutDialog.o `test -f 'UgtkAboutDialog.c' || echo '$(srcdir)/'`UgtkAboutDialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkAboutDialog.Tpo $(DEPDIR)/uget_gtk-UgtkAboutDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkAboutDialog.c' object='uget_gtk-UgtkAboutDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkAboutDialog.o `test -f 'UgtkAboutDialog.c' || echo '$(srcdir)/'`UgtkAboutDialog.c uget_gtk-UgtkAboutDialog.obj: UgtkAboutDialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkAboutDialog.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkAboutDialog.Tpo -c -o uget_gtk-UgtkAboutDialog.obj `if test -f 'UgtkAboutDialog.c'; then $(CYGPATH_W) 'UgtkAboutDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkAboutDialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkAboutDialog.Tpo $(DEPDIR)/uget_gtk-UgtkAboutDialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkAboutDialog.c' object='uget_gtk-UgtkAboutDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkAboutDialog.obj `if test -f 'UgtkAboutDialog.c'; then $(CYGPATH_W) 'UgtkAboutDialog.c'; else $(CYGPATH_W) '$(srcdir)/UgtkAboutDialog.c'; fi` uget_gtk-UgtkMenubar.o: UgtkMenubar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkMenubar.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkMenubar.Tpo -c -o uget_gtk-UgtkMenubar.o `test -f 'UgtkMenubar.c' || echo '$(srcdir)/'`UgtkMenubar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkMenubar.Tpo $(DEPDIR)/uget_gtk-UgtkMenubar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkMenubar.c' object='uget_gtk-UgtkMenubar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkMenubar.o `test -f 'UgtkMenubar.c' || echo '$(srcdir)/'`UgtkMenubar.c uget_gtk-UgtkMenubar.obj: UgtkMenubar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkMenubar.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkMenubar.Tpo -c -o uget_gtk-UgtkMenubar.obj `if test -f 'UgtkMenubar.c'; then $(CYGPATH_W) 'UgtkMenubar.c'; else $(CYGPATH_W) '$(srcdir)/UgtkMenubar.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkMenubar.Tpo $(DEPDIR)/uget_gtk-UgtkMenubar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkMenubar.c' object='uget_gtk-UgtkMenubar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkMenubar.obj `if test -f 'UgtkMenubar.c'; then $(CYGPATH_W) 'UgtkMenubar.c'; else $(CYGPATH_W) '$(srcdir)/UgtkMenubar.c'; fi` uget_gtk-UgtkMenubar-ui.o: UgtkMenubar-ui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkMenubar-ui.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Tpo -c -o uget_gtk-UgtkMenubar-ui.o `test -f 'UgtkMenubar-ui.c' || echo '$(srcdir)/'`UgtkMenubar-ui.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Tpo $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkMenubar-ui.c' object='uget_gtk-UgtkMenubar-ui.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkMenubar-ui.o `test -f 'UgtkMenubar-ui.c' || echo '$(srcdir)/'`UgtkMenubar-ui.c uget_gtk-UgtkMenubar-ui.obj: UgtkMenubar-ui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkMenubar-ui.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Tpo -c -o uget_gtk-UgtkMenubar-ui.obj `if test -f 'UgtkMenubar-ui.c'; then $(CYGPATH_W) 'UgtkMenubar-ui.c'; else $(CYGPATH_W) '$(srcdir)/UgtkMenubar-ui.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Tpo $(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkMenubar-ui.c' object='uget_gtk-UgtkMenubar-ui.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkMenubar-ui.obj `if test -f 'UgtkMenubar-ui.c'; then $(CYGPATH_W) 'UgtkMenubar-ui.c'; else $(CYGPATH_W) '$(srcdir)/UgtkMenubar-ui.c'; fi` uget_gtk-UgtkApp.o: UgtkApp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp.Tpo -c -o uget_gtk-UgtkApp.o `test -f 'UgtkApp.c' || echo '$(srcdir)/'`UgtkApp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp.Tpo $(DEPDIR)/uget_gtk-UgtkApp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp.c' object='uget_gtk-UgtkApp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp.o `test -f 'UgtkApp.c' || echo '$(srcdir)/'`UgtkApp.c uget_gtk-UgtkApp.obj: UgtkApp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp.Tpo -c -o uget_gtk-UgtkApp.obj `if test -f 'UgtkApp.c'; then $(CYGPATH_W) 'UgtkApp.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp.Tpo $(DEPDIR)/uget_gtk-UgtkApp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp.c' object='uget_gtk-UgtkApp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp.obj `if test -f 'UgtkApp.c'; then $(CYGPATH_W) 'UgtkApp.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp.c'; fi` uget_gtk-UgtkApp-ui.o: UgtkApp-ui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-ui.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-ui.Tpo -c -o uget_gtk-UgtkApp-ui.o `test -f 'UgtkApp-ui.c' || echo '$(srcdir)/'`UgtkApp-ui.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-ui.Tpo $(DEPDIR)/uget_gtk-UgtkApp-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-ui.c' object='uget_gtk-UgtkApp-ui.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-ui.o `test -f 'UgtkApp-ui.c' || echo '$(srcdir)/'`UgtkApp-ui.c uget_gtk-UgtkApp-ui.obj: UgtkApp-ui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-ui.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-ui.Tpo -c -o uget_gtk-UgtkApp-ui.obj `if test -f 'UgtkApp-ui.c'; then $(CYGPATH_W) 'UgtkApp-ui.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-ui.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-ui.Tpo $(DEPDIR)/uget_gtk-UgtkApp-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-ui.c' object='uget_gtk-UgtkApp-ui.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-ui.obj `if test -f 'UgtkApp-ui.c'; then $(CYGPATH_W) 'UgtkApp-ui.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-ui.c'; fi` uget_gtk-UgtkApp-callback.o: UgtkApp-callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-callback.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-callback.Tpo -c -o uget_gtk-UgtkApp-callback.o `test -f 'UgtkApp-callback.c' || echo '$(srcdir)/'`UgtkApp-callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-callback.Tpo $(DEPDIR)/uget_gtk-UgtkApp-callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-callback.c' object='uget_gtk-UgtkApp-callback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-callback.o `test -f 'UgtkApp-callback.c' || echo '$(srcdir)/'`UgtkApp-callback.c uget_gtk-UgtkApp-callback.obj: UgtkApp-callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-callback.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-callback.Tpo -c -o uget_gtk-UgtkApp-callback.obj `if test -f 'UgtkApp-callback.c'; then $(CYGPATH_W) 'UgtkApp-callback.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-callback.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-callback.Tpo $(DEPDIR)/uget_gtk-UgtkApp-callback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-callback.c' object='uget_gtk-UgtkApp-callback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-callback.obj `if test -f 'UgtkApp-callback.c'; then $(CYGPATH_W) 'UgtkApp-callback.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-callback.c'; fi` uget_gtk-UgtkApp-timeout.o: UgtkApp-timeout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-timeout.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-timeout.Tpo -c -o uget_gtk-UgtkApp-timeout.o `test -f 'UgtkApp-timeout.c' || echo '$(srcdir)/'`UgtkApp-timeout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-timeout.Tpo $(DEPDIR)/uget_gtk-UgtkApp-timeout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-timeout.c' object='uget_gtk-UgtkApp-timeout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-timeout.o `test -f 'UgtkApp-timeout.c' || echo '$(srcdir)/'`UgtkApp-timeout.c uget_gtk-UgtkApp-timeout.obj: UgtkApp-timeout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-timeout.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-timeout.Tpo -c -o uget_gtk-UgtkApp-timeout.obj `if test -f 'UgtkApp-timeout.c'; then $(CYGPATH_W) 'UgtkApp-timeout.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-timeout.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-timeout.Tpo $(DEPDIR)/uget_gtk-UgtkApp-timeout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-timeout.c' object='uget_gtk-UgtkApp-timeout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-timeout.obj `if test -f 'UgtkApp-timeout.c'; then $(CYGPATH_W) 'UgtkApp-timeout.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-timeout.c'; fi` uget_gtk-UgtkApp-main.o: UgtkApp-main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-main.o -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-main.Tpo -c -o uget_gtk-UgtkApp-main.o `test -f 'UgtkApp-main.c' || echo '$(srcdir)/'`UgtkApp-main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-main.Tpo $(DEPDIR)/uget_gtk-UgtkApp-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-main.c' object='uget_gtk-UgtkApp-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-main.o `test -f 'UgtkApp-main.c' || echo '$(srcdir)/'`UgtkApp-main.c uget_gtk-UgtkApp-main.obj: UgtkApp-main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -MT uget_gtk-UgtkApp-main.obj -MD -MP -MF $(DEPDIR)/uget_gtk-UgtkApp-main.Tpo -c -o uget_gtk-UgtkApp-main.obj `if test -f 'UgtkApp-main.c'; then $(CYGPATH_W) 'UgtkApp-main.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/uget_gtk-UgtkApp-main.Tpo $(DEPDIR)/uget_gtk-UgtkApp-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='UgtkApp-main.c' object='uget_gtk-UgtkApp-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(uget_gtk_CPPFLAGS) $(CPPFLAGS) $(uget_gtk_CFLAGS) $(CFLAGS) -c -o uget_gtk-UgtkApp-main.obj `if test -f 'UgtkApp-main.c'; then $(CYGPATH_W) 'UgtkApp-main.c'; else $(CYGPATH_W) '$(srcdir)/UgtkApp-main.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/uget_gtk-UgtkAboutDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-callback.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-main.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-timeout.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-ui.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkBanner.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkBatchDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkCategoryForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkConfig.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkDownloadForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkMenubar.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeList.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeTree.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeView.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkProxyForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkScheduleForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSelector.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSequence.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSetting.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSettingDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSettingForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSummary.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkTraveler.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkTrayIcon.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkUtil.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/uget_gtk-UgtkAboutDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-callback.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-main.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-timeout.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp-ui.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkApp.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkBanner.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkBatchDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkCategoryForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkConfig.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkConfirmDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkDownloadForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkMenubar-ui.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkMenubar.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeList.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeTree.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkNodeView.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkProxyForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkScheduleForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSelector.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSequence.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSetting.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSettingDialog.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSettingForm.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkSummary.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkTraveler.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkTrayIcon.Po -rm -f ./$(DEPDIR)/uget_gtk-UgtkUtil.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/ui-gtk/UgtkNodeView.c0000664000175000017500000010655713470304403013337 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include // ------------------------------------ // column data & functions for Common #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 static const UgPair state_icon_pair[] = { {(void*)(intptr_t) UGET_GROUP_FINISHED, "go-last"}, {(void*)(intptr_t) UGET_GROUP_RECYCLED, "list-remove"}, {(void*)(intptr_t) UGET_GROUP_PAUSED, "media-playback-pause"}, {(void*)(intptr_t) UGET_GROUP_ERROR, "dialog-error"}, {(void*)(intptr_t) UGET_GROUP_UPLOADING, "go-up"}, {(void*)(intptr_t) UGET_GROUP_COMPLETED, "gtk-yes"}, {(void*)(intptr_t) UGET_GROUP_QUEUING, "text-x-generic"}, {(void*)(intptr_t) UGET_GROUP_ACTIVE, "media-playback-start"}, }; #else static const UgPair state_icon_pair[] = { {(void*)(intptr_t) UGET_GROUP_FINISHED, GTK_STOCK_GOTO_LAST}, {(void*)(intptr_t) UGET_GROUP_RECYCLED, GTK_STOCK_DELETE}, {(void*)(intptr_t) UGET_GROUP_PAUSED, GTK_STOCK_MEDIA_PAUSE}, {(void*)(intptr_t) UGET_GROUP_ERROR, GTK_STOCK_DIALOG_ERROR}, {(void*)(intptr_t) UGET_GROUP_UPLOADING, GTK_STOCK_GO_UP}, {(void*)(intptr_t) UGET_GROUP_COMPLETED, GTK_STOCK_YES}, {(void*)(intptr_t) UGET_GROUP_QUEUING, GTK_STOCK_FILE}, {(void*)(intptr_t) UGET_GROUP_ACTIVE, GTK_STOCK_MEDIA_PLAY}, }; #endif static const int state_icon_pair_len = sizeof (state_icon_pair) / sizeof (UgPair); static void col_set_icon (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetRelation* relation; const gchar* icon_name; int key, index; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 icon_name = "text-x-generic"; #else icon_name = GTK_STOCK_FILE; #endif // select icon_name for (index = 0; index < state_icon_pair_len; index++) { key = (intptr_t)state_icon_pair[index].key; relation = ug_info_realloc(node->info, UgetRelationInfo); if ((key & relation->group) == key) { icon_name = state_icon_pair[index].data; break; } } #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 g_object_set (cell, "icon-name", icon_name, NULL); #else g_object_set (cell, "stock-id", icon_name, NULL); #endif } // ------------------------------------ // column functions for Download static void col_set_name (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { // UgtkNodeTree* utree; UgetCommon* common; UgetNode* node; char* name; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; // if (UGTK_IS_NODE_TREE (model)) { // // prefix.root // utree = UGTK_NODE_TREE (model); // if (utree->prefix.root && utree->prefix.root->children == node) { // g_object_set (cell, "text", utree->prefix.name, NULL); // return; // } // } node = node->base; name = _("unnamed"); common = ug_info_get(node->info, UgetCommonInfo); if (common && common->name) name = common->name; else { common = ug_info_get (node->info, UgetCommonInfo); if (common) { if (common->file) name = common->file; else if (common->uri) name = common->uri; } } g_object_set (cell, "text", name, NULL); } static void col_set_complete (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress && progress->total) string = ug_str_from_int_unit (progress->complete, NULL); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_total (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress && progress->total) string = ug_str_from_int_unit (progress->total, NULL); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_percent (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress && progress->total) { string = ug_strdup_printf ("%d%c", progress->percent, '%'); g_object_set (cell, "visible", TRUE, NULL); g_object_set (cell, "value", progress->percent, NULL); g_object_set (cell, "text", string, NULL); ug_free (string); } else { g_object_set (cell, "visible", FALSE, NULL); g_object_set (cell, "value", 0, NULL); g_object_set (cell, "text", "", NULL); } } // consume time static void col_set_elapsed (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress) string = ug_str_from_seconds ((int) progress->elapsed, TRUE); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } // remain time static void col_set_left (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; UgetRelation* relation; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); relation = ug_info_get (node->info, UgetRelationInfo); if (progress && relation && relation->task) string = ug_str_from_seconds ((int) progress->left, TRUE); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_speed (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; UgetRelation* relation; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); relation = ug_info_get (node->info, UgetRelationInfo); if (progress && relation && relation->task) string = ug_str_from_int_unit (progress->download_speed, "/s"); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_upload_speed (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; UgetRelation* relation; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); relation = ug_info_get (node->info, UgetRelationInfo); if (progress && relation && relation->task && progress->upload_speed) string = ug_str_from_int_unit (progress->upload_speed, "/s"); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_uploaded (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress && progress->uploaded) string = ug_str_from_int_unit (progress->uploaded, NULL); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_ratio (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetProgress* progress; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; progress = ug_info_get (node->info, UgetProgressInfo); if (progress && progress->ratio) string = ug_strdup_printf ("%.2f", progress->ratio); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_retry (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetCommon* common; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; common = ug_info_get (node->info, UgetCommonInfo); if (common == NULL || common->retry_count == 0) string = NULL; else if (common->retry_count < 100) string = ug_strdup_printf ("%d", common->retry_count); else { g_object_set (cell, "text", "> 99", NULL); return; } g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_category (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetCommon* common; UgetNode* node; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; if (node->parent) { common = ug_info_get(node->parent->info, UgetCommonInfo); if (common) string = common->name; else string = NULL; } else string = NULL; g_object_set (cell, "text", string, NULL); } static void col_set_uri (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetCommon* common; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; common = ug_info_get (node->info, UgetCommonInfo); if (common) string = common->uri; else string = NULL; g_object_set (cell, "text", string, NULL); } static void col_set_added_on (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetLog* ulog; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; ulog = ug_info_get (node->info, UgetLogInfo); if (ulog && ulog->added_time) string = ug_str_from_time (ulog->added_time, FALSE); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } static void col_set_completed_on (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; UgetLog* ulog; char* string; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; node = node->base; ulog = ug_info_get (node->info, UgetLogInfo); if (ulog && ulog->completed_time) string = ug_str_from_time (ulog->completed_time, FALSE); else string = NULL; g_object_set (cell, "text", string, NULL); ug_free (string); } // ------------------------------------ // column functions for Category, Status static void col_set_quantity (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; gchar* quantity; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; quantity = ug_strdup_printf ("%u", node->n_children); g_object_set (cell, "text", quantity, NULL); ug_free (quantity); } // ------------------------------------ // column functions for Category static void col_set_name_c (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetCommon* common; UgetNode* node; char* name; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; // if (UGTK_IS_NODE_TREE (model)) { // UgtkNodeTree* utree; // // prefix.root // utree = UGTK_NODE_TREE (model); // if (utree->prefix.root && utree->prefix.root->children == node) { // g_object_set (cell, "text", _("All Category"), NULL); // return; // } // } node = node->base; common = ug_info_get(node->info, UgetCommonInfo); if (common && common->name) name = common->name; else name = _("unnamed"); g_object_set (cell, "text", name, NULL); } static void col_set_icon_c (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; node = iter->user_data; #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 if (uget_node_get_group(node) & UGET_GROUP_PAUSED) g_object_set (cell, "icon-name", "media-playback-pause", NULL); else g_object_set (cell, "icon-name", "gtk-dnd-multiple", NULL); #else if (uget_node_get_group(node) & UGET_GROUP_PAUSED) g_object_set (cell, "stock-id", GTK_STOCK_MEDIA_PAUSE, NULL); else g_object_set (cell, "stock-id", GTK_STOCK_DND_MULTIPLE, NULL); #endif } // ------------------------------------ // column functions for Status static const UgPair state_name_pair[] = { {(void*)(intptr_t) UGET_GROUP_ERROR, N_("Error")}, {(void*)(intptr_t) UGET_GROUP_PAUSED, N_("Paused")}, {(void*)(intptr_t) UGET_GROUP_UPLOADING, N_("Uploading")}, {(void*)(intptr_t) UGET_GROUP_COMPLETED, N_("Completed")}, {(void*)(intptr_t) UGET_GROUP_FINISHED, N_("Finished")}, {(void*)(intptr_t) UGET_GROUP_RECYCLED, N_("Recycled")}, {(void*)(intptr_t) UGET_GROUP_QUEUING, N_("Queuing")}, {(void*)(intptr_t) UGET_GROUP_ACTIVE, N_("Active")}, }; static const int state_name_pair_len = sizeof (state_name_pair) / sizeof (UgPair); static void col_set_name_s (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; char* name; int key; int index; int group; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; name = _("All Status"); if (node->real) { group = uget_node_get_group(node); for (index = 0; index < state_name_pair_len; index++) { key = (intptr_t)state_name_pair[index].key; if ((key & group) == key) { name = gettext (state_name_pair[index].data); break; } } } g_object_set (cell, "text", name, NULL); } static void col_set_icon_s (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgetNode* node; const gchar* icon_name; int key, index; int group; // gtk_tree_model_get (model, iter, 0, &node, -1); node = iter->user_data; // avoid crash in GTK3 if (node == NULL) return; // select icon_name #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 icon_name = "gtk-dnd-multiple"; #else icon_name = GTK_STOCK_DND_MULTIPLE; #endif if (node->real) { group = uget_node_get_group(node); for (index = 0; index < state_icon_pair_len; index++) { key = (intptr_t)state_icon_pair[index].key; if ((key & group) == key) { icon_name = state_icon_pair[index].data; break; } } } #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 g_object_set (cell, "icon-name", icon_name, NULL); #else g_object_set (cell, "stock-id", icon_name, NULL); #endif } // ---------------------------------------------------------------------------- // UgtkNodeView static GtkWidget* ugtk_node_view_new (GtkTreeCellDataFunc icon_func, GtkTreeCellDataFunc name_func, const gchar* name_title) { GtkTreeView* view; GtkCellRenderer* renderer; GtkTreeViewColumn* column; view = (GtkTreeView*)gtk_tree_view_new (); // UGTK_NODE_COLUMN_STATE // GtkCellRendererPixbuf "stock-size" = 1, 16x16 column = gtk_tree_view_column_new (); // gtk_tree_view_column_set_title (column, ""); renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func (column, renderer, icon_func, NULL, NULL); // gtk_tree_view_column_set_resizable (column, FALSE); gtk_tree_view_column_set_min_width (column, 18); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_NAME column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, name_title); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, name_func, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_expand (column, TRUE); gtk_tree_view_append_column (view, column); gtk_widget_show (GTK_WIDGET (view)); return (GtkWidget*) view; } GtkWidget* ugtk_node_view_new_for_download (void) { GtkTreeView* view; GtkTreeSelection* selection; GtkCellRenderer* renderer; GtkCellRenderer* renderer_progress; GtkTreeViewColumn* column; view = (GtkTreeView*) ugtk_node_view_new (col_set_icon, col_set_name, _("Name")); selection = gtk_tree_view_get_selection (view); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); // UGTK_NODE_COLUMN_STATE column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_STATE); gtk_tree_view_column_set_resizable (column, TRUE); // UGTK_NODE_COLUMN_NAME column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_NAME); gtk_tree_view_column_set_min_width (column, 180); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); // UGTK_NODE_COLUMN_COMPLETE column = gtk_tree_view_column_new (); renderer = gtk_cell_renderer_text_new (); g_object_set (renderer, "xalign", 1.0, NULL); gtk_tree_view_column_set_title (column, _("Complete")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_complete, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 70); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_TOTAL column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Size")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_total, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 70); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_PERCENT column = gtk_tree_view_column_new (); renderer_progress = gtk_cell_renderer_progress_new (); gtk_tree_view_column_set_title (column, _("%")); gtk_tree_view_column_pack_start (column, renderer_progress, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer_progress, col_set_percent, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 60); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_ELAPSED for consuming time column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Elapsed")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_elapsed, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 65); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_LEFT for remaining time column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Left")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_left, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 65); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_SPEED column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Speed")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_speed, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 80); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_UPLOAD_SPEED column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Up Speed")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_upload_speed, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 80); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_UPLOADED column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Uploaded")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_uploaded, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 70); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_RATIO column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Ratio")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_ratio, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 45); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_RETRY column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Retry")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_retry, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 45); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_alignment (column, 1.0); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_CATEGORY renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Category")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_category, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 100); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_URI // renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("URI")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_uri, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 300); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_ADDED_ON // renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Added On")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_added_on, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 140); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); // UGTK_NODE_COLUMN_COMPLETED_ON // renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Completed On")); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_completed_on, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_min_width (column, 140); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); gtk_tree_view_set_fixed_height_mode (view, TRUE); gtk_widget_show (GTK_WIDGET (view)); return (GtkWidget*) view; } static void add_column_quantity (GtkTreeView* view) { GtkCellRenderer* renderer; GtkTreeViewColumn* column; // UGTK_NODE_COLUMN_QUANTITY : number of tasks column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, _("Quantity")); // gtk_tree_view_column_set_title (column, _("N")); renderer = gtk_cell_renderer_text_new (); g_object_set (renderer, "xalign", 1.0, NULL); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_quantity, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_expand (column, TRUE); gtk_tree_view_column_set_alignment (column, 1.0); // gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column (view, column); } GtkWidget* ugtk_node_view_new_for_category (void) { GtkTreeView* view; // GtkCellRenderer* renderer; // GtkTreeViewColumn* column; view = (GtkTreeView*) ugtk_node_view_new (col_set_icon_c, col_set_name_c, _("Category")); gtk_tree_view_set_headers_visible (view, FALSE); // UGTK_NODE_COLUMN_NAME // column = gtk_tree_view_get_column (view, 0); // gtk_tree_view_column_set_min_width (column, -1); // gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); // column Quantity = number of tasks add_column_quantity (view); return (GtkWidget*) view; } GtkWidget* ugtk_node_view_new_for_state (void) { GtkTreeView* view; // GtkTreeViewColumn* column; view = (GtkTreeView*) ugtk_node_view_new (col_set_icon_s, col_set_name_s, _("Status")); gtk_tree_view_set_headers_visible (view, FALSE); // column = gtk_tree_view_get_column (view, 0); // gtk_tree_view_column_set_title (column, _("Status")); // column Quantity = number of tasks add_column_quantity (view); return (GtkWidget*) view; } void ugtk_node_view_use_large_icon (GtkTreeView* view, gboolean is_large, int fixed_width) { GtkTreeViewColumn* column; GtkIconSize icon_size; int icon_width; GList* list; if (is_large) { icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR; icon_width = 24 + 2; // icon size + 2 pixel } else { icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR; icon_width = 16 + 2; // icon size + 2 pixel } column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_STATE); gtk_tree_view_column_set_min_width (column, icon_width); gtk_tree_view_column_set_fixed_width (column, fixed_width); list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(column)); g_object_set (list->data, "stock-size", icon_size, NULL); g_list_free (list); } uget-2.2.2/ui-gtk/UgtkMenubar-ui.c0000664000175000017500000010616313470304403013614 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // UgtkFileMenu static void ugtk_menubar_file_init (UgtkMenubar* menubar, GtkAccelGroup* accel_group) { GtkWidget* image; GtkWidget* menu; GtkWidget* submenu; GtkWidget* menu_item; menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic (_("_File")); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*)menubar->self, menu_item); gtk_menu_set_accel_group ((GtkMenu*)menu, accel_group); // gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); // New Download menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _Download...")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_NEW); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-new", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.create_download = menu_item; // New Category menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _Category...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("gtk-dnd-multiple", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.create_category = menu_item; // separator // gtk_menu_shell_append ((GtkMenuShell*)submenu, gtk_separator_menu_item_new() ); // New Torrent menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Torrent...")); // image = gtk_image_new_from_stock (GTK_STOCK_FILE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.create_torrent = menu_item; // New Metalink menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Metalink...")); // image = gtk_image_new_from_stock (GTK_STOCK_FILE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.create_metalink = menu_item; // Batch Downloads --- start --- menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Batch Downloads")); submenu = gtk_menu_new (); gtk_menu_set_accel_group ((GtkMenu*)submenu, accel_group); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, submenu); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); // Batch downloads - Clipboard batch menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Clipboard batch...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("edit-paste", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->file.batch.clipboard = menu_item; // Batch downloads - URL Sequence batch menu_item = gtk_image_menu_item_new_with_mnemonic (_("_URL Sequence batch...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("view-sort-ascending", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->file.batch.sequence = menu_item; // Batch downloads - Text file import (.txt) menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Text file import (.txt)...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-next", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->file.batch.text_import = menu_item; // Batch downloads - HTML file import (.html) menu_item = gtk_image_menu_item_new_with_mnemonic (_("_HTML file import (.html)...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("gtk-convert", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_CONVERT, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->file.batch.html_import = menu_item; // Batch downloads - separator gtk_menu_shell_append ((GtkMenuShell*)submenu, gtk_separator_menu_item_new() ); // Batch downloads - Export to Text file (.txt) menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Export to Text file (.txt)...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-previous", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->file.batch.text_export = menu_item; // Batch downloads --- end --- gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Open Category menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Open category...")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_LOAD); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-open", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.open_category = menu_item; // Save Category menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Save category as...")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_SAVE); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.save_category = menu_item; // Save All menu_item = gtk_image_menu_item_new_with_mnemonic (_("Save _all settings")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_SAVE_ALL); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.save = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Offline mode menu_item = gtk_check_menu_item_new_with_mnemonic (_("Offline Mode")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.offline_mode = menu_item; menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, accel_group); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->file.quit = menu_item; } // UgtkEditMenu static void ugtk_menubar_edit_init (UgtkMenubar* menubar) { GtkWidget* image; GtkWidget* menu; GtkWidget* submenu; GtkWidget* menu_item; menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic (_("_Edit")); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*)menubar->self, menu_item); // menu.gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); menu_item = gtk_check_menu_item_new_with_mnemonic (_("Clipboard _Monitor")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.clipboard_monitor = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Clipboard works quietly")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.clipboard_quiet = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Command-line works quietly")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.commandline_quiet = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Skip existing URI")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.skip_existing = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Apply recent download settings")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.apply_recent = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new()); // --- Completion Auto-Actions --- start --- menu_item = gtk_image_menu_item_new_with_mnemonic (_("Completion _Auto-Actions")); submenu = gtk_menu_new (); // gtk_menu_set_accel_group ((GtkMenu*)submenu, accel_group); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, submenu); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); // Completion Auto-Actions - Disable menu_item = gtk_radio_menu_item_new_with_mnemonic (NULL, _("_Disable")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.disable = menu_item; // Completion Auto-Actions - Hibernate menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("Hibernate")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.hibernate = menu_item; // Completion Auto-Actions - Suspend menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("Suspend")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.suspend = menu_item; // Completion Auto-Actions - Shutdown menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("Shutdown")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.shutdown = menu_item; // Completion Auto-Actions - Reboot menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("Reboot")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.reboot = menu_item; // Completion Auto-Actions - Custom menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("Custom")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.custom = menu_item; // separator gtk_menu_shell_append ((GtkMenuShell*)submenu, gtk_separator_menu_item_new()); // Completion Auto-Actions - Remember menu_item = gtk_check_menu_item_new_with_mnemonic (_("Remember setting")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.remember = menu_item; // Completion Auto-Actions - Help menu_item = gtk_menu_item_new_with_mnemonic (_("_Help")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->edit.completion.help = menu_item; // --- Completion Auto-Actions --- end --- // menu_item = gtk_menu_item_new_with_mnemonic (_("_Settings...")); menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Settings...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->edit.settings = menu_item; } // UgtkViewMenu static void ugtk_menubar_view_init (UgtkMenubar* menubar) { GtkWidget* menu; GtkWidget* submenu; GtkWidget* menu_item; menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic (_("_View")); gtk_menu_item_set_submenu ((GtkMenuItem*) menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*) menubar->self, menu_item); menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Toolbar")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->view.toolbar = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Statusbar")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->view.statusbar = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Category")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->view.category = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Summary")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->view.summary = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Summary Items --- start --- menu_item = gtk_menu_item_new_with_mnemonic (_("Summary _Items")); submenu = gtk_menu_new (); gtk_menu_item_set_submenu ((GtkMenuItem*) menu_item, submenu); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); // Summary Items - Name menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Name")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); menubar->view.summary_items.name = menu_item; // Summary Items - Folder menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Folder")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); menubar->view.summary_items.folder = menu_item; // Summary Items - Category menu_item = gtk_check_menu_item_new_with_mnemonic (_("Category")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); menubar->view.summary_items.category = menu_item; // Summary Items - Elapsed // menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); // gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); // gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); // menubar->view.summary_items.elapsed = menu_item; // Summary Items - URL menu_item = gtk_check_menu_item_new_with_mnemonic (_("_URL")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); menubar->view.summary_items.uri = menu_item; // Summary Items - Message menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Message")); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); menubar->view.summary_items.message = menu_item; // Summary Items --- end --- // gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // menu_item = gtk_check_menu_item_new_with_mnemonic (_("Download _Rules Hint")); // gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); // gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); // menubar->view.rules_hint = menu_item; // Download Columns --- start --- submenu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic (_("Download _Columns")); gtk_menu_item_set_submenu ((GtkMenuItem*) menu_item, submenu); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->view.columns.self = submenu; // Download Columns - Complete menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Complete")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.complete = menu_item; // Download Columns - Total menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Size")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.total = menu_item; // Download Columns - Percent (%) menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Percent '%'")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.percent = menu_item; // Download Columns - Elapsed menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Elapsed")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.elapsed = menu_item; // Download Columns - Left menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Left")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.left = menu_item; // Download Columns - Speed menu_item = gtk_check_menu_item_new_with_mnemonic (_("Speed")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.speed = menu_item; // Download Columns - Up Speed menu_item = gtk_check_menu_item_new_with_mnemonic (_("Up Speed")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.upload_speed = menu_item; // Download Columns - Uploaded menu_item = gtk_check_menu_item_new_with_mnemonic (_("Uploaded")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.uploaded = menu_item; // Download Columns - Ratio menu_item = gtk_check_menu_item_new_with_mnemonic (_("Ratio")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.ratio = menu_item; // Download Columns - Retry menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Retry")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.retry = menu_item; // Download Columns - Category menu_item = gtk_check_menu_item_new_with_mnemonic (_("Category")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.category = menu_item; // Download Columns - URL menu_item = gtk_check_menu_item_new_with_mnemonic (_("_URL")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.uri = menu_item; // Download Columns - Added On menu_item = gtk_check_menu_item_new_with_mnemonic (_("Added On")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.added_on = menu_item; // Download Columns - Completed On menu_item = gtk_check_menu_item_new_with_mnemonic (_("Completed On")); gtk_menu_shell_append ((GtkMenuShell*) submenu, menu_item); gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menu_item, TRUE); menubar->view.columns.completed_on = menu_item; // Download Columns --- end --- } // UgtkCategoryMenu static void ugtk_menubar_category_init (UgtkMenubar* menubar) { GtkWidget* image; GtkWidget* menu; GtkWidget* menu_item; menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic (_("_Category")); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*)menubar->self, menu_item); menubar->category.self = menu; // New Category menu_item = gtk_image_menu_item_new_with_mnemonic(_("_New Category...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("gtk-dnd-multiple", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->category.create = menu_item; // Delete Category menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Delete Category")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->category.delete = menu_item; // Properties menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PROPERTIES, NULL); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->category.properties = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Move Up menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GO_UP, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Up")); // image = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->category.move_up = menu_item; // Move Down menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GO_DOWN, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Down")); // image = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->category.move_down = menu_item; } // UgtkDownloadMenu static void ugtk_menubar_download_init (UgtkMenubar* menubar, GtkAccelGroup* accel_group) { GtkWidget* image; GtkWidget* menu; GtkWidget* submenu; GtkWidget* menu_item; menu = gtk_menu_new (); gtk_menu_set_accel_group ((GtkMenu*)menu, accel_group); menu_item = gtk_menu_item_new_with_mnemonic (_("_Download")); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*)menubar->self, menu_item); menubar->download.self = menu; // gtk_menu_shell_append((GtkMenuShell*)menu, gtk_tearoff_menu_item_new() ); menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.create = menu_item; // menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, accel_group); menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Delete Entry")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_DELETE); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("edit-delete", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.delete = menu_item; menu_item = gtk_image_menu_item_new_with_mnemonic (_("Delete Entry and _File")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_DELETE_F); // image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.delete_file = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_OPEN, NULL); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_OPEN); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.open = menu_item; gtk_widget_hide (menu_item); menu_item = gtk_image_menu_item_new_with_mnemonic(_("Open _Containing folder")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_OPEN_F); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("folder", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.open_folder = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); menu_item = gtk_image_menu_item_new_with_mnemonic(_("Force Start")); // image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.force_start = menu_item; menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Runnable")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_SWITCH); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("media-playback-start", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.runnable = menu_item; menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_PAUSE, NULL); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_SWITCH); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("P_ause")); // image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PAUSE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.pause = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Move to --- start --- menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Move To")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("gtk-dnd-multiple", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.move_to.item = menu_item; // Move to - submenu submenu = gtk_menu_new (); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, submenu); menubar->download.move_to.self = submenu; menubar->download.move_to.array = g_ptr_array_sized_new (16*2); // Move to --- end --- gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GO_UP, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Up")); // image = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.move_up = menu_item; menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GO_DOWN, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Down")); // image = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.move_down = menu_item; menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GOTO_TOP, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Top")); // image = gtk_image_new_from_stock (GTK_STOCK_GOTO_TOP, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.move_top = menu_item; menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_GOTO_BOTTOM, NULL); // menu_item = gtk_image_menu_item_new_with_mnemonic(_("Move _Bottom")); // image = gtk_image_new_from_stock (GTK_STOCK_GOTO_BOTTOM, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.move_bottom = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Priority --- start --- menu_item = gtk_image_menu_item_new_with_mnemonic(_("Priority")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.prioriy.item = menu_item; // Priority - submenu submenu = gtk_menu_new (); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, submenu); menubar->download.prioriy.self = submenu; // Priority - High menu_item = gtk_radio_menu_item_new_with_mnemonic ( NULL, _("_High")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->download.prioriy.high = menu_item; // Priority - Normal menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("_Normal")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->download.prioriy.normal = menu_item; // Priority - Low menu_item = gtk_radio_menu_item_new_with_mnemonic_from_widget ( (GtkRadioMenuItem*) menu_item, _("_Low")); gtk_menu_shell_append ((GtkMenuShell*)submenu, menu_item); menubar->download.prioriy.low = menu_item; // Priority --- end --- menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PROPERTIES, NULL); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->download.properties = menu_item; } // UgtkHelpMenu static void ugtk_menubar_help_init (UgtkMenubar* menubar) { GtkWidget* image; GtkWidget* menu; GtkWidget* menu_item; menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_mnemonic(_("_Help")); gtk_menu_item_set_submenu ((GtkMenuItem*)menu_item, menu); gtk_menu_shell_append ((GtkMenuShell*)menubar->self, menu_item); // Get Help Online menu_item = gtk_image_menu_item_new_with_mnemonic(_("Get Help Online")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("help-browser", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_HELP, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.help_online = menu_item; // Documentation menu_item = gtk_image_menu_item_new_with_mnemonic(_("Documentation")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("text-x-generic", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_FILE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.documentation = menu_item; // Support Forum menu_item = gtk_image_menu_item_new_with_mnemonic(_("Support Forum")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("dialog-question", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.support_forum = menu_item; // Submit Feedback menu_item = gtk_image_menu_item_new_with_mnemonic(_("Submit Feedback")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.submit_feedback = menu_item; // Report a Bug menu_item = gtk_image_menu_item_new_with_mnemonic(_("Report a Bug")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("dialog-warning-symbolic", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_CAPS_LOCK_WARNING, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.report_bug = menu_item; // Keyboard Shortcuts menu_item = gtk_image_menu_item_new_with_mnemonic(_("Keyboard Shortcuts")); // image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.keyboard_shortcuts = menu_item; // Check for Updates menu_item = gtk_image_menu_item_new_with_mnemonic(_("Check for Updates")); // image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.check_updates = menu_item; // About Uget menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); menubar->help.about_uget = menu_item; } void ugtk_menubar_init_ui (UgtkMenubar* menubar, GtkAccelGroup* accel_group) { menubar->self = gtk_menu_bar_new (); ugtk_menubar_file_init (menubar, accel_group); ugtk_menubar_edit_init (menubar); ugtk_menubar_view_init (menubar); ugtk_menubar_category_init (menubar); ugtk_menubar_download_init (menubar, accel_group); ugtk_menubar_help_init (menubar); } uget-2.2.2/ui-gtk/UgtkSetting.c0000664000175000017500000006156013470304403013226 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #define UGTK_APP_CLIPBOARD_PATTERN "BIN|ZIP|GZ|7Z|XZ|Z|TAR|TGZ|BZ2|" \ "LZH|A[0-9]?|RAR|R[0-9][0-9]|ISO|" \ "RPM|DEB|EXE|MSI|APK|" \ "3GP|AAC|FLAC|M4A|M4P|MP3|OGG|WAV|WMA|" \ "MP4|MKV|WEBM|OGV|AVI|MOV|WMV|FLV|F4V|MPG|MPEG|RMVB" #define UGTK_ARIA2_PATH "aria2c" #define UGTK_ARIA2_ARGS "--enable-rpc=true -D " \ "--disable-ipv6 " \ "--check-certificate=false" #define UGTK_ARIA2_URI "http://localhost:6800/jsonrpc" // ---------------------------------------------------------------------------- // WindowSetting static const UgEntry UgtkWindowSettingEntry[] = { {"Toolbar", offsetof (struct UgtkWindowSetting, toolbar), UG_ENTRY_BOOL, NULL, NULL}, {"Statusbar", offsetof (struct UgtkWindowSetting, statusbar), UG_ENTRY_BOOL, NULL, NULL}, {"Category", offsetof (struct UgtkWindowSetting, category), UG_ENTRY_BOOL, NULL, NULL}, {"Summary", offsetof (struct UgtkWindowSetting, summary), UG_ENTRY_BOOL, NULL, NULL}, {"Banner", offsetof (struct UgtkWindowSetting, banner), UG_ENTRY_BOOL, NULL, NULL}, {"x", offsetof (struct UgtkWindowSetting, x), UG_ENTRY_INT, NULL, NULL}, {"y", offsetof (struct UgtkWindowSetting, y), UG_ENTRY_INT, NULL, NULL}, {"width", offsetof (struct UgtkWindowSetting, width), UG_ENTRY_INT, NULL, NULL}, {"height", offsetof (struct UgtkWindowSetting, height), UG_ENTRY_INT, NULL, NULL}, {"maximized", offsetof (struct UgtkWindowSetting, maximized), UG_ENTRY_BOOL, NULL, NULL}, {"NthCategory", offsetof (struct UgtkWindowSetting, nth_category), UG_ENTRY_INT, NULL, NULL}, {"NthStatus", offsetof (struct UgtkWindowSetting, nth_state), UG_ENTRY_INT, NULL, NULL}, {"PanedPositionH", offsetof (struct UgtkWindowSetting, paned_position_h), UG_ENTRY_INT, NULL, NULL}, {"PanedPositionV", offsetof (struct UgtkWindowSetting, paned_position_v), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // SummarySetting static const UgEntry UgtkSummarySettingEntry[] = { {"name", offsetof (struct UgtkSummarySetting, name), UG_ENTRY_BOOL, NULL, NULL}, {"folder", offsetof (struct UgtkSummarySetting, folder), UG_ENTRY_BOOL, NULL, NULL}, {"category", offsetof (struct UgtkSummarySetting, category), UG_ENTRY_BOOL, NULL, NULL}, {"uri", offsetof (struct UgtkSummarySetting, uri), UG_ENTRY_BOOL, NULL, NULL}, {"message", offsetof (struct UgtkSummarySetting, message), UG_ENTRY_BOOL, NULL, NULL}, {NULL} // null-terminated }; // ---------------------------------------------------------------------------- // DownloadColumnSetting static const UgEntry UgtkDownloadColumnWidthEntry[] = { {"state", offsetof (struct UgtkDownloadColumnWidth, state), UG_ENTRY_INT, NULL, NULL}, {"name", offsetof (struct UgtkDownloadColumnWidth, name), UG_ENTRY_INT, NULL, NULL}, {"complete", offsetof (struct UgtkDownloadColumnWidth, complete), UG_ENTRY_INT, NULL, NULL}, {"total", offsetof (struct UgtkDownloadColumnWidth, total), UG_ENTRY_INT, NULL, NULL}, {"percent", offsetof (struct UgtkDownloadColumnWidth, percent), UG_ENTRY_INT, NULL, NULL}, {"elapsed", offsetof (struct UgtkDownloadColumnWidth, elapsed), UG_ENTRY_INT, NULL, NULL}, {"left", offsetof (struct UgtkDownloadColumnWidth, left), UG_ENTRY_INT, NULL, NULL}, {"speed", offsetof (struct UgtkDownloadColumnWidth, speed), UG_ENTRY_INT, NULL, NULL}, {"UploadSpeed", offsetof (struct UgtkDownloadColumnWidth, upload_speed), UG_ENTRY_INT, NULL, NULL}, {"uploaded", offsetof (struct UgtkDownloadColumnWidth, uploaded), UG_ENTRY_INT, NULL, NULL}, {"ratio", offsetof (struct UgtkDownloadColumnWidth, ratio), UG_ENTRY_INT, NULL, NULL}, {"retry", offsetof (struct UgtkDownloadColumnWidth, retry), UG_ENTRY_INT, NULL, NULL}, {"category", offsetof (struct UgtkDownloadColumnWidth, category), UG_ENTRY_INT, NULL, NULL}, {"uri", offsetof (struct UgtkDownloadColumnWidth, uri), UG_ENTRY_INT, NULL, NULL}, {"AddedOn", offsetof (struct UgtkDownloadColumnWidth, added_on), UG_ENTRY_INT, NULL, NULL}, {"CompletedOn", offsetof (struct UgtkDownloadColumnWidth, completed_on), UG_ENTRY_INT, NULL, NULL}, {NULL} // null-terminated }; static const UgEntry UgtkDownloadColumnSettingEntry[] = { {"complete", offsetof (struct UgtkDownloadColumnSetting, complete), UG_ENTRY_BOOL, NULL, NULL}, {"total", offsetof (struct UgtkDownloadColumnSetting, total), UG_ENTRY_BOOL, NULL, NULL}, {"percent", offsetof (struct UgtkDownloadColumnSetting, percent), UG_ENTRY_BOOL, NULL, NULL}, {"elapsed", offsetof (struct UgtkDownloadColumnSetting, elapsed), UG_ENTRY_BOOL, NULL, NULL}, {"left", offsetof (struct UgtkDownloadColumnSetting, left), UG_ENTRY_BOOL, NULL, NULL}, {"speed", offsetof (struct UgtkDownloadColumnSetting, speed), UG_ENTRY_BOOL, NULL, NULL}, {"UploadSpeed", offsetof (struct UgtkDownloadColumnSetting, upload_speed), UG_ENTRY_BOOL, NULL, NULL}, {"uploaded", offsetof (struct UgtkDownloadColumnSetting, uploaded), UG_ENTRY_BOOL, NULL, NULL}, {"ratio", offsetof (struct UgtkDownloadColumnSetting, ratio), UG_ENTRY_BOOL, NULL, NULL}, {"retry", offsetof (struct UgtkDownloadColumnSetting, retry), UG_ENTRY_BOOL, NULL, NULL}, {"category", offsetof (struct UgtkDownloadColumnSetting, category), UG_ENTRY_BOOL, NULL, NULL}, {"uri", offsetof (struct UgtkDownloadColumnSetting, uri), UG_ENTRY_BOOL, NULL, NULL}, {"AddedOn", offsetof (struct UgtkDownloadColumnSetting, added_on), UG_ENTRY_BOOL, NULL, NULL}, {"CompletedOn", offsetof (struct UgtkDownloadColumnSetting, completed_on), UG_ENTRY_BOOL, NULL, NULL}, {"SortType", offsetof (struct UgtkDownloadColumnSetting, sort.type), UG_ENTRY_INT, NULL, NULL}, {"SortNth", offsetof (struct UgtkDownloadColumnSetting, sort.nth), UG_ENTRY_INT, NULL, NULL}, {"Width", offsetof (struct UgtkDownloadColumnSetting, width), UG_ENTRY_OBJECT, (void*) UgtkDownloadColumnWidthEntry, NULL}, // deprecated {"completed", offsetof (struct UgtkDownloadColumnSetting, complete), UG_ENTRY_BOOL, NULL, NULL}, {NULL} // null-terminated }; // ---------------------------------------------------------------------------- // UserInterfaceSetting static const UgEntry UgtkUserInterfaceSettingEntry[] = { {"ExitConfirmation", offsetof (struct UgtkUserInterfaceSetting, exit_confirmation), UG_ENTRY_BOOL, NULL, NULL}, {"DeleteConfirmation", offsetof (struct UgtkUserInterfaceSetting, delete_confirmation), UG_ENTRY_BOOL, NULL, NULL}, {"ShowTrayIcon", offsetof (struct UgtkUserInterfaceSetting, show_trayicon), UG_ENTRY_BOOL, NULL, NULL}, {"StartInTray", offsetof (struct UgtkUserInterfaceSetting, start_in_tray), UG_ENTRY_BOOL, NULL, NULL}, {"CloseToTray", offsetof (struct UgtkUserInterfaceSetting, close_to_tray), UG_ENTRY_BOOL, NULL, NULL}, {"StartInOfflineMode", offsetof (struct UgtkUserInterfaceSetting, start_in_offline_mode), UG_ENTRY_BOOL, NULL, NULL}, {"StartNotification", offsetof (struct UgtkUserInterfaceSetting, start_notification), UG_ENTRY_BOOL, NULL, NULL}, {"SoundNotification", offsetof (struct UgtkUserInterfaceSetting, sound_notification), UG_ENTRY_BOOL, NULL, NULL}, {"ApplyRecently", offsetof (struct UgtkUserInterfaceSetting, apply_recent), UG_ENTRY_BOOL, NULL, NULL}, {"ApplyRecent", offsetof (struct UgtkUserInterfaceSetting, apply_recent), UG_ENTRY_BOOL, NULL, NULL}, {"SkipExisting", offsetof (struct UgtkUserInterfaceSetting, skip_existing), UG_ENTRY_BOOL, NULL, NULL}, {"LargeIcon", offsetof (struct UgtkUserInterfaceSetting, large_icon), UG_ENTRY_BOOL, NULL, NULL}, #ifdef HAVE_APP_INDICATOR {"AppIndicator", offsetof (struct UgtkUserInterfaceSetting, app_indicator), UG_ENTRY_BOOL, NULL, NULL}, #endif {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // ClipboardSetting static const UgEntry UgtkClipboardSettingEntry[] = { {"pattern", offsetof (struct UgtkClipboardSetting, pattern), UG_ENTRY_STRING, NULL, NULL}, {"monitor", offsetof (struct UgtkClipboardSetting, monitor), UG_ENTRY_BOOL, NULL, NULL}, {"quiet", offsetof (struct UgtkClipboardSetting, quiet), UG_ENTRY_BOOL, NULL, NULL}, {"NthCategory", offsetof (struct UgtkClipboardSetting, nth_category), UG_ENTRY_INT, NULL, NULL}, {"Website", offsetof (struct UgtkClipboardSetting, website), UG_ENTRY_BOOL, NULL, NULL}, // remove this in future verison {"MediaWebsite", offsetof (struct UgtkClipboardSetting, website), UG_ENTRY_BOOL, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // BandwidthSetting static const UgEntry UgtkBandwidthSettingEntry[] = { {"NormalUpload", offsetof (struct UgtkBandwidthSetting, normal.upload), UG_ENTRY_INT, NULL, NULL}, {"NormalDownload", offsetof (struct UgtkBandwidthSetting, normal.download), UG_ENTRY_INT, NULL, NULL}, {"SchedulerUpload", offsetof (struct UgtkBandwidthSetting, scheduler.upload), UG_ENTRY_INT, NULL, NULL}, {"SchedulerDownload", offsetof (struct UgtkBandwidthSetting, scheduler.download), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // SchedulerSetting static const UgEntry UgtkSchedulerSettingEntry[] = { {"enable", offsetof (struct UgtkSchedulerSetting, enable), UG_ENTRY_BOOL, NULL, NULL}, {"state", offsetof (struct UgtkSchedulerSetting, state), UG_ENTRY_ARRAY, ug_json_parse_array_int, ug_json_write_array_int}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // CommandlineSetting static const UgEntry UgtkCommandlineSettingEntry[] = { {"quiet", offsetof (struct UgtkCommandlineSetting, quiet), UG_ENTRY_BOOL, NULL, NULL}, {"NthCategory", offsetof (struct UgtkCommandlineSetting, nth_category), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // PluginAria2Setting static const UgEntry UgtkPluginAria2SettingEntry[] = { {"launch", offsetof (struct UgtkPluginAria2Setting, launch), UG_ENTRY_BOOL, NULL, NULL}, {"shutdown", offsetof (struct UgtkPluginAria2Setting, shutdown), UG_ENTRY_BOOL, NULL, NULL}, {"token", offsetof (struct UgtkPluginAria2Setting, token), UG_ENTRY_STRING, NULL, NULL}, {"path", offsetof (struct UgtkPluginAria2Setting, path), UG_ENTRY_STRING, NULL, NULL}, {"arguments", offsetof (struct UgtkPluginAria2Setting, args), UG_ENTRY_STRING, NULL, NULL}, {"uri", offsetof (struct UgtkPluginAria2Setting, uri), UG_ENTRY_STRING, NULL, NULL}, {"MaxUploadSpeed", offsetof (struct UgtkPluginAria2Setting, limit.upload), UG_ENTRY_INT, NULL, NULL}, {"MaxDownloadSpeed", offsetof (struct UgtkPluginAria2Setting, limit.download), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // PluginMediaSetting static const UgEntry UgtkPluginMediaSettingEntry[] = { {"match_mode", offsetof (struct UgtkPluginMediaSetting, match_mode), UG_ENTRY_INT, NULL, NULL}, {"quality", offsetof (struct UgtkPluginMediaSetting, quality), UG_ENTRY_INT, NULL, NULL}, {"type", offsetof (struct UgtkPluginMediaSetting, type), UG_ENTRY_INT, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // UgtkCompletionSetting static const UgEntry UgtkCompletionSettingEntry[] = { {"remember", offsetof (struct UgtkCompletionSetting, remember), UG_ENTRY_BOOL, NULL, NULL}, {"action", offsetof (struct UgtkCompletionSetting, action), UG_ENTRY_INT, NULL, NULL}, {"command", offsetof (struct UgtkCompletionSetting, command), UG_ENTRY_STRING, NULL, NULL}, {"OnError", offsetof (struct UgtkCompletionSetting, on_error), UG_ENTRY_STRING, NULL, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // UgtkSetting static const UgEntry UgtkSettingEntry[] = { {"Window", offsetof (UgtkSetting, window), UG_ENTRY_OBJECT, (void*) UgtkWindowSettingEntry, NULL}, {"Summary", offsetof (UgtkSetting, summary), UG_ENTRY_OBJECT, (void*) UgtkSummarySettingEntry, NULL}, {"DownloadColumn", offsetof (UgtkSetting, download_column), UG_ENTRY_OBJECT, (void*) UgtkDownloadColumnSettingEntry, NULL}, {"UserInterface", offsetof (UgtkSetting, ui), UG_ENTRY_OBJECT, (void*) UgtkUserInterfaceSettingEntry, NULL}, {"Clipboard", offsetof (UgtkSetting, clipboard), UG_ENTRY_OBJECT, (void*) UgtkClipboardSettingEntry, NULL}, {"Bandwidth", offsetof (UgtkSetting, bandwidth), UG_ENTRY_OBJECT, (void*) UgtkBandwidthSettingEntry, NULL}, {"Commandline", offsetof (UgtkSetting, commandline), UG_ENTRY_OBJECT, (void*) UgtkCommandlineSettingEntry, NULL}, {"PluginOrder", offsetof (UgtkSetting, plugin_order), UG_ENTRY_INT, NULL, NULL}, {"PluginAria2", offsetof (UgtkSetting, aria2), UG_ENTRY_OBJECT, (void*) UgtkPluginAria2SettingEntry, NULL}, {"PluginMedia", offsetof (UgtkSetting, media), UG_ENTRY_OBJECT, (void*) UgtkPluginMediaSettingEntry, NULL}, {"Completion", offsetof (UgtkSetting, completion), UG_ENTRY_OBJECT, (void*) UgtkCompletionSettingEntry, NULL}, {"FolderHistory", offsetof (UgtkSetting, folder_history), UG_ENTRY_ARRAY, ug_json_parse_list_string, ug_json_write_list_string}, {"AutoSave", offsetof (UgtkSetting, auto_save.enable), UG_ENTRY_INT, NULL, NULL}, {"AutoSaveInterval",offsetof (UgtkSetting, auto_save.interval), UG_ENTRY_INT, NULL, NULL}, // {"OfflineMode", offsetof (UgtkSetting, offline_mode), // UG_ENTRY_BOOL, NULL, NULL}, {"Scheduler", offsetof (UgtkSetting, scheduler), UG_ENTRY_OBJECT, (void*) UgtkSchedulerSettingEntry, NULL}, {NULL}, // null-terminated }; // ---------------------------------------------------------------------------- // "UgSetting" functions // void ugtk_setting_init (UgtkSetting* setting) { // "SchedulerSetting" ug_array_init (&setting->scheduler.state, sizeof (int), 7*24); memset (setting->scheduler.state.at, UGTK_SCHEDULE_NORMAL, 7*24); // default settings for media (or storage) website setting->clipboard.website = TRUE; setting->media.match_mode = UGET_MEDIA_MATCH_NEAR; setting->media.quality = UGET_MEDIA_QUALITY_360P; setting->media.type = UGET_MEDIA_TYPE_MP4; } void ugtk_setting_reset (UgtkSetting* setting) { unsigned int weekdays, dayhours; // "WindowSetting" setting->window.toolbar = TRUE; setting->window.statusbar = TRUE; setting->window.category = TRUE; setting->window.summary = TRUE; setting->window.banner = TRUE; setting->window.x = 0; setting->window.y = 0; setting->window.width = 0; setting->window.height = 0; setting->window.maximized = FALSE; setting->window.paned_position_h = -1; setting->window.paned_position_v = -1; // "SummarySetting" setting->summary.name = TRUE; setting->summary.folder = TRUE; setting->summary.category = FALSE; setting->summary.uri = FALSE; setting->summary.message = TRUE; // "DownloadColumnSetting" setting->download_column.complete = TRUE; setting->download_column.total = TRUE; setting->download_column.percent = TRUE; setting->download_column.elapsed = TRUE; setting->download_column.left = TRUE; setting->download_column.speed = TRUE; setting->download_column.upload_speed = TRUE; setting->download_column.uploaded = FALSE; setting->download_column.ratio = TRUE; setting->download_column.retry = TRUE; setting->download_column.category = FALSE; setting->download_column.uri = FALSE; setting->download_column.added_on = TRUE; setting->download_column.completed_on = FALSE; // default sorted column setting->download_column.sort.type = GTK_SORT_DESCENDING; setting->download_column.sort.nth = UGTK_NODE_COLUMN_STATE; // "DownloadColumnWidth" memset (&setting->download_column.width, 0, sizeof (setting->download_column.width)); // "UserInterfaceSetting" setting->ui.exit_confirmation = TRUE; setting->ui.delete_confirmation = TRUE; setting->ui.show_trayicon = TRUE; setting->ui.start_in_tray = FALSE; setting->ui.close_to_tray = TRUE; setting->ui.start_in_offline_mode = FALSE; setting->ui.start_notification = TRUE; setting->ui.sound_notification = TRUE; setting->ui.apply_recent = TRUE; setting->ui.skip_existing = FALSE; setting->ui.large_icon = FALSE; #ifdef HAVE_APP_INDICATOR setting->ui.app_indicator = TRUE; #endif // "ClipboardSetting" ug_free (setting->clipboard.pattern); setting->clipboard.pattern = ug_strdup (UGTK_APP_CLIPBOARD_PATTERN); setting->clipboard.monitor = TRUE; setting->clipboard.quiet = FALSE; setting->clipboard.nth_category = 0; setting->clipboard.website = TRUE; // "BandwidthSetting" setting->bandwidth.normal.upload = 0; setting->bandwidth.normal.download = 0; setting->bandwidth.scheduler.upload = 0; setting->bandwidth.scheduler.download = 0; // "SchedulerSetting" setting->scheduler.enable = FALSE; ug_array_init (&setting->scheduler.state, sizeof (int), 7*24); setting->scheduler.state.length = 7 * 24; for (weekdays = 0; weekdays < 7; weekdays++) { for (dayhours = 0; dayhours < 24; dayhours++) { setting->scheduler.state.at[weekdays*24 + dayhours] = UGTK_SCHEDULE_NORMAL; } } // "CommandlineSetting" setting->commandline.quiet = FALSE; setting->commandline.nth_category = 0; // "PluginSetting" setting->plugin_order = UGTK_PLUGIN_ORDER_CURL; // aria2 plug-in settings setting->aria2.limit.download = 0; setting->aria2.limit.upload = 0; setting->aria2.launch = TRUE; setting->aria2.shutdown = TRUE; setting->aria2.path = ug_strdup (UGTK_ARIA2_PATH); setting->aria2.args = ug_strdup (UGTK_ARIA2_ARGS); setting->aria2.uri = ug_strdup (UGTK_ARIA2_URI); // media plug-in settings setting->media.match_mode = UGET_MEDIA_MATCH_NEAR; setting->media.quality = UGET_MEDIA_QUALITY_360P; setting->media.type = UGET_MEDIA_TYPE_MP4; // Others setting->completion.remember = TRUE; setting->completion.action = 0; setting->completion.command = NULL; setting->completion.on_error = NULL; setting->auto_save.enable = TRUE; setting->auto_save.interval = 3; setting->offline_mode = FALSE; } // ---------------------------------------------------------------------------- // save/load settings int ugtk_setting_save (UgtkSetting* setting, const char* file) { int action; char* path; UgJsonFile* jfile; path = g_strconcat (file, ".temp", NULL); jfile = ug_json_file_new (4096); if (ug_json_file_begin_write (jfile, path, UG_JSON_FORMAT_ALL) == FALSE) { ug_json_file_free (jfile); g_free (path); return FALSE; } // save completion.action action = setting->completion.action; if (setting->completion.remember == FALSE) setting->completion.action = 0; ug_json_write_object_head (&jfile->json); ug_json_write_entry (&jfile->json, setting, UgtkSettingEntry); ug_json_write_object_tail (&jfile->json); // restore completion.action if (setting->completion.remember == FALSE) setting->completion.action = action; ug_json_file_end_write (jfile); ug_json_file_free (jfile); ug_remove (file); ug_rename (path, file); g_free (path); return TRUE; } int ugtk_setting_load (UgtkSetting* setting, const char* path) { int file_ok; char* path_temp; UgJsonFile* jfile; path_temp = g_strconcat (path, ".temp", NULL); jfile = ug_json_file_new (4096); file_ok = ug_json_file_begin_parse (jfile, path); if (file_ok) ug_remove (path_temp); else if (ug_rename (path_temp, path) != -1) file_ok = ug_json_file_begin_parse (jfile, path); g_free (path_temp); if (file_ok == FALSE) { ug_json_file_free (jfile); return FALSE; } ug_json_push (&jfile->json, ug_json_parse_entry, setting, (void*) UgtkSettingEntry); ug_json_push (&jfile->json, ug_json_parse_object, NULL, NULL); ug_json_file_end_parse (jfile); ug_json_file_free (jfile); // check & fix settings ugtk_setting_fix_data (setting); return TRUE; } void ugtk_setting_add_folder (UgtkSetting* setting, const char* folder) { UgList* list; UgLink* link; if (folder == NULL || folder[0] == 0) return; list = &setting->folder_history; for (link = list->head; link; link = link->next) { if (strcmp (folder, link->data) == 0) { ug_list_remove (list, link); ug_list_prepend (list, link); return; } } if (list->size >= 8) { link = list->tail; ug_list_remove (list, link); ug_free (link->data); ug_link_free (link); } link = ug_link_new (); link->data = ug_strdup (folder); ug_list_prepend (list, link); } void ugtk_setting_fix_data (UgtkSetting* setting) { unsigned int index; // "DownloadColumnSetting" // default sorted column if (setting->download_column.sort.type != GTK_SORT_ASCENDING && setting->download_column.sort.type != GTK_SORT_DESCENDING) { setting->download_column.sort.type = GTK_SORT_DESCENDING; } if (setting->download_column.sort.nth < 0 || setting->download_column.sort.nth >= UGTK_NODE_N_COLUMNS) { setting->download_column.sort.nth = UGTK_NODE_COLUMN_ADDED_ON; } // "ClipboardSetting" if (setting->clipboard.pattern == NULL || setting->clipboard.pattern[0] == 0) { ug_free (setting->clipboard.pattern); setting->clipboard.pattern = ug_strdup (UGTK_APP_CLIPBOARD_PATTERN); } // "SchedulerSetting" for (index = 0; index < 7*24; index++) { if (setting->scheduler.state.at[index] < 0 || setting->scheduler.state.at[index] >= UGTK_SCHEDULE_N_STATE) { setting->scheduler.state.at[index] = UGTK_SCHEDULE_NORMAL; } } // "PluginSetting" if (setting->plugin_order < 0 || setting->plugin_order >= UGTK_PLUGIN_N_ORDER) { setting->plugin_order = UGTK_PLUGIN_ORDER_CURL; } // aria2 plug-in settings if (setting->aria2.path == NULL || setting->aria2.path[0] == 0) { ug_free (setting->aria2.path); setting->aria2.path = ug_strdup (UGTK_ARIA2_PATH); } if (setting->aria2.args == NULL || setting->aria2.args[0] == 0) { ug_free (setting->aria2.args); setting->aria2.args = ug_strdup (UGTK_ARIA2_ARGS); } if (setting->aria2.uri == NULL || setting->aria2.uri[0] == 0) { ug_free (setting->aria2.uri); setting->aria2.uri = ug_strdup (UGTK_ARIA2_URI); } // media plug-in settings if (setting->media.match_mode < 0 || setting->media.match_mode > UGET_MEDIA_N_MATCH_MODE) setting->media.match_mode = UGET_MEDIA_MATCH_NEAR; if (setting->media.quality < 0 || setting->media.quality > UGET_MEDIA_N_QUALITY) setting->media.quality = UGET_MEDIA_QUALITY_360P; if (setting->media.type < 0 || setting->media.type > UGET_MEDIA_N_TYPE) setting->media.type = UGET_MEDIA_TYPE_MP4; } uget-2.2.2/ui-gtk/UgtkTraveler.c0000664000175000017500000006156413470304403013401 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include // signal handler static void on_state_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler); static void on_category_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler); static void on_download_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler); static void on_category_row_deleted (GtkTreeModel* model, GtkTreePath* path, UgtkTraveler* traveler); static void on_download_row_deleted (GtkTreeModel* model, GtkTreePath* path, UgtkTraveler* traveler); // static data const static void* sort_callbacks[UGTK_NODE_N_COLUMNS]; const static UgCompareFunc compare_funcs[UGTK_NODE_N_COLUMNS]; void ugtk_traveler_init (UgtkTraveler* traveler, UgtkApp* app) { GtkScrolledWindow* scroll; GtkTreePath* path; GtkTreeViewColumn* column; gint nth; traveler->app = app; // status traveler->state.self = ugtk_node_view_new_for_state (); traveler->state.view = GTK_TREE_VIEW (traveler->state.self); traveler->state.model = ugtk_node_list_new (NULL, 4, TRUE); gtk_tree_view_set_model (traveler->state.view, GTK_TREE_MODEL (traveler->state.model)); // category traveler->category.self = gtk_scrolled_window_new (NULL, NULL); traveler->category.view = (GtkTreeView*) ugtk_node_view_new_for_category (); traveler->category.model = ugtk_node_tree_new (&app->sorted, TRUE); ugtk_node_tree_set_prefix (traveler->category.model, &app->mix, 1); gtk_tree_view_set_model (traveler->category.view, GTK_TREE_MODEL (traveler->category.model)); gtk_widget_set_size_request (traveler->category.self, 165, 100); scroll = GTK_SCROLLED_WINDOW (traveler->category.self); gtk_scrolled_window_set_shadow_type (scroll, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (traveler->category.view)); // download traveler->download.self = gtk_scrolled_window_new (NULL, NULL); traveler->download.view = (GtkTreeView*) ugtk_node_view_new_for_download (); traveler->download.model = ugtk_node_tree_new (NULL, TRUE); gtk_tree_view_set_model (traveler->download.view, GTK_TREE_MODEL (traveler->download.model)); scroll = GTK_SCROLLED_WINDOW (traveler->download.self); gtk_scrolled_window_set_shadow_type (scroll, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (traveler->download.view)); path = gtk_tree_path_new_first (); gtk_tree_view_set_cursor (traveler->state.view, path, NULL, FALSE); gtk_tree_view_set_cursor (traveler->category.view, path, NULL, FALSE); gtk_tree_path_free (path); // cursor position traveler->state.cursor.pos = -1; traveler->category.cursor.pos = -1; traveler->download.cursor.pos = -1; // signal g_signal_connect (traveler->state.view, "cursor-changed", G_CALLBACK (on_state_cursor_changed), traveler); g_signal_connect (traveler->category.view, "cursor-changed", G_CALLBACK (on_category_cursor_changed), traveler); g_signal_connect (traveler->download.view, "cursor-changed", G_CALLBACK (on_download_cursor_changed), traveler); g_signal_connect (traveler->category.model, "row-deleted", G_CALLBACK (on_category_row_deleted), traveler); g_signal_connect (traveler->download.model, "row-deleted", G_CALLBACK (on_download_row_deleted), traveler); for (nth = UGTK_NODE_COLUMN_STATE; nth < UGTK_NODE_N_COLUMNS; nth++) { column = gtk_tree_view_get_column (traveler->download.view, nth); g_signal_connect (column, "clicked", G_CALLBACK (sort_callbacks[nth]), traveler); } } void ugtk_traveler_select_category (UgtkTraveler* traveler, int nth_category, int nth_state) { GtkTreePath* path; if (nth_category != -1) { path = gtk_tree_path_new (); gtk_tree_path_append_index (path, nth_category); gtk_tree_view_set_cursor (traveler->category.view, path, NULL, FALSE); gtk_tree_path_free (path); } if (nth_state != -1) { path = gtk_tree_path_new (); gtk_tree_path_append_index (path, nth_state); gtk_tree_view_set_cursor (traveler->state.view, path, NULL, FALSE); gtk_tree_path_free (path); } } void ugtk_traveler_set_cursor (UgtkTraveler* traveler, UgetNode* node) { GtkTreePath* path; GtkTreeIter iter; if (node && ugtk_traveler_get_iter (traveler, &iter, node)) { path = gtk_tree_model_get_path ( GTK_TREE_MODEL (traveler->download.model), &iter); if (path) { // traveler->download.cursor.node = iter.user_data; // traveler->download.cursor.pos = *gtk_tree_path_get_indices (path); gtk_tree_view_set_cursor (traveler->download.view, path, NULL, FALSE); gtk_tree_path_free (path); } } } UgetNode* ugtk_traveler_get_cursor (UgtkTraveler* traveler) { GtkTreePath* path; int nth; gtk_tree_view_get_cursor (traveler->download.view, &path, NULL); if (path == NULL) return NULL; nth = *gtk_tree_path_get_indices (path); gtk_tree_path_free (path); return uget_node_nth_child (traveler->download.model->root, nth); } gboolean ugtk_traveler_get_iter (UgtkTraveler* traveler, GtkTreeIter* iter, UgetNode* node) { if (node->parent == (UgetNode*) traveler->download.model->root) { iter->stamp = traveler->download.model->stamp; iter->user_data = node; return TRUE; } for (node = node->fake; node; node = node->peer) { if (ugtk_traveler_get_iter (traveler, iter, node)) return TRUE; } return FALSE; } GList* ugtk_traveler_get_selected (UgtkTraveler* traveler) { GtkTreeSelection* selection; GtkTreeModel* model; GtkTreeIter iter; GList* list; GList* nodes; GList* cur; selection = gtk_tree_view_get_selection (traveler->download.view); list = gtk_tree_selection_get_selected_rows (selection, &model); nodes = NULL; for (cur = list; cur; cur = cur->next) { gtk_tree_model_get_iter (model, &iter, cur->data); nodes = g_list_prepend (nodes, iter.user_data); } g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free); return nodes; } void ugtk_traveler_set_selected (UgtkTraveler* traveler, GList* nodes) { GtkTreeSelection* selection; GtkTreeIter iter; selection = gtk_tree_view_get_selection (traveler->download.view); gtk_tree_selection_unselect_all (selection); for (; nodes; nodes = nodes->next) { if (nodes->data == NULL) continue; if (ugtk_traveler_get_iter (traveler, &iter, nodes->data)) gtk_tree_selection_select_iter (selection, &iter); } } GList* ugtk_traveler_reserve_selection (UgtkTraveler* traveler) { GList* list; GList* link; list = ugtk_traveler_get_selected (traveler); for (link = list; link; link = link->next) link->data = ((UgetNode*)link->data)->base; traveler->reserved.list = list; traveler->reserved.node = traveler->download.cursor.node; if (traveler->reserved.node) traveler->reserved.node = traveler->reserved.node->base; return list; } void ugtk_traveler_restore_selection (UgtkTraveler* traveler) { GList* list; UgetNode* node; list = traveler->reserved.list; node = traveler->reserved.node; ugtk_traveler_set_cursor (traveler, node); ugtk_traveler_set_selected (traveler, list); traveler->reserved.list = NULL; traveler->reserved.node = NULL; } gint ugtk_traveler_move_selected_up (UgtkTraveler* traveler) { GtkTreePath* path; UgetNode* node; UgetNode* prev; UgetNode* top; GList* list; GList* link; int counts = 0; list = ugtk_traveler_get_selected (traveler); list = g_list_reverse (list); for (top = NULL, link = list; link; link = link->next) { node = link->data; prev = node->prev; if (top == prev) { top = node; continue; } top = node; for (;;) { if (node->real == NULL || prev->real == NULL) break; if (node->real->parent != prev->real->parent) break; node = node->real; prev = prev->real; } uget_node_move (node->parent, prev, node); counts++; } if (counts > 0) { // scroll to first selected download and move cursor node = list->data; path = gtk_tree_path_new_from_indices ( uget_node_child_position (node->parent, node), -1); gtk_tree_view_scroll_to_cell (traveler->download.view, path, NULL, FALSE, 0, 0); gtk_tree_view_set_cursor (traveler->download.view, path, NULL, FALSE); gtk_tree_path_free (path); // redraw gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); // change selected indices ugtk_traveler_set_selected (traveler, list); } g_list_free (list); return counts; } gint ugtk_traveler_move_selected_down (UgtkTraveler* traveler) { GtkTreePath* path; UgetNode* node; UgetNode* next; UgetNode* bottom; GList* list; GList* link; int counts = 0; list = ugtk_traveler_get_selected (traveler); for (bottom = NULL, link = list; link; link = link->next) { node = link->data; next = node->next; if (bottom == next) { bottom = node; continue; } bottom = node; for (;;) { if (node->real == NULL || next->real == NULL) break; if (node->real->parent != next->real->parent) break; node = node->real; next = next->real; } uget_node_move (node->parent, next->next, node); counts++; } if (counts > 0) { // scroll to last selected download and move cursor node = list->data; path = gtk_tree_path_new_from_indices ( uget_node_child_position (node->parent, node), -1); gtk_tree_view_scroll_to_cell (traveler->download.view, path, NULL, FALSE, 0, 0); gtk_tree_view_set_cursor (traveler->download.view, path, NULL, FALSE); gtk_tree_path_free (path); // redraw gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); // change selected indices ugtk_traveler_set_selected (traveler, list); } g_list_free (list); return counts; } gint ugtk_traveler_move_selected_top (UgtkTraveler* traveler) { GtkTreePath* path; UgetNode* node; UgetNode* sibling; UgetNode* top; GList* list; GList* link; int counts = 0; list = ugtk_traveler_get_selected (traveler); list = g_list_reverse (list); node = list->data; top = node->parent->children; for (link = list; link; link = link->next) { node = link->data; if (top == node) { top = top->next; continue; } sibling = top; for (;;) { if (node->real == NULL || sibling->real == NULL) break; if (node->real->parent != sibling->real->parent) break; node = node->real; sibling = sibling->real; } uget_node_move (node->parent, sibling, node); counts++; } if (counts > 0) { // scroll to top and move cursor gtk_tree_view_scroll_to_point (traveler->download.view, -1, 0); path = gtk_tree_path_new_first (); gtk_tree_view_set_cursor (traveler->download.view, path, NULL, FALSE); gtk_tree_path_free (path); // redraw gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); // change selected indices ugtk_traveler_set_selected (traveler, list); } g_list_free (list); return counts; } gint ugtk_traveler_move_selected_bottom (UgtkTraveler* traveler) { GtkTreePath* path; UgetNode* node; UgetNode* sibling; UgetNode* bottom; GList* list; GList* link; int counts = 0; list = ugtk_traveler_get_selected (traveler); node = list->data; bottom = node->parent->last; for (link = list; link; link = link->next) { node = link->data; if (bottom == node) { bottom = bottom->prev; continue; } sibling = bottom; for (;;) { if (node->real == NULL || sibling->real == NULL) break; if (node->real->parent != sibling->real->parent) break; node = node->real; sibling = sibling->real; } // check this for move to bottom only if (sibling->next == node) continue; // node will be inserted after sibling uget_node_move (node->parent, sibling->next, node); counts++; } if (counts > 0) { // scroll to bottom and move cursor node = list->data; path = gtk_tree_path_new_from_indices ( node->parent->n_children -1, -1); gtk_tree_view_scroll_to_cell (traveler->download.view, path, NULL, FALSE, 0, 0); gtk_tree_view_set_cursor (traveler->download.view, path, NULL, FALSE); gtk_tree_path_free (path); // redraw gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); // change selected indices ugtk_traveler_set_selected (traveler, list); } g_list_free (list); return counts; } void ugtk_traveler_set_sorting (UgtkTraveler* traveler, gboolean sortable, UgtkNodeColumn nth_col, GtkSortType type) { GtkTreeViewColumn* column; UgtkNodeColumn pos; GList* selected; for (pos = 0; pos < UGTK_NODE_N_COLUMNS; pos++) { column = gtk_tree_view_get_column (traveler->download.view, pos); gtk_tree_view_column_set_clickable (column, sortable); // clear column sort status gtk_tree_view_column_set_sort_order (column, GTK_SORT_ASCENDING); gtk_tree_view_column_set_sort_indicator (column, FALSE); } if (nth_col >= UGTK_NODE_N_COLUMNS) return; selected = ugtk_traveler_get_selected (traveler); if (nth_col <= 0) uget_app_set_sorting ((UgetApp*) traveler->app, NULL, FALSE); else { column = gtk_tree_view_get_column (traveler->download.view, nth_col); gtk_tree_view_column_set_sort_order (column, type); gtk_tree_view_column_set_sort_indicator (column, TRUE); uget_app_set_sorting ((UgetApp*) traveler->app, compare_funcs[nth_col], (type == GTK_SORT_DESCENDING) ? TRUE : FALSE); } ugtk_traveler_set_selected (traveler, selected); g_list_free (selected); // redraw gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); } // ---------------------------------------------------------------------------- // signal handler static void on_state_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; // clear download cursor traveler->download.cursor.node = NULL; traveler->state.cursor.pos_last = traveler->state.cursor.pos; gtk_tree_view_get_cursor (view, &path, NULL); if (path == NULL) { traveler->state.cursor.pos = -1; traveler->state.cursor.node = NULL; return; } if (traveler->state.cursor.pos == gtk_tree_path_get_indices (path)[0]) return; traveler->state.cursor.pos = gtk_tree_path_get_indices (path)[0]; model = gtk_tree_view_get_model (view); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); traveler->state.cursor.node = iter.user_data; // change download.model and refresh it's view gtk_tree_view_set_model (traveler->download.view, NULL); if (iter.user_data) { traveler->download.model->root = iter.user_data; gtk_tree_view_set_model (traveler->download.view, GTK_TREE_MODEL (traveler->download.model)); } } static void on_category_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; // clear download cursor traveler->download.cursor.node = NULL; traveler->category.cursor.pos_last = traveler->category.cursor.pos; gtk_tree_view_get_cursor (view, &path, NULL); if (path == NULL) { traveler->category.cursor.pos = -1; traveler->category.cursor.node = NULL; return; } if (traveler->category.cursor.pos == gtk_tree_path_get_indices (path)[0]) return; traveler->category.cursor.pos = gtk_tree_path_get_indices (path)[0]; model = gtk_tree_view_get_model (view); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); traveler->category.cursor.node = iter.user_data; // change state.model and refresh it's view model = GTK_TREE_MODEL (traveler->state.model); path = gtk_tree_path_new_from_indices (traveler->state.cursor.pos, -1); gtk_tree_view_set_model (traveler->state.view, NULL); traveler->state.model->root = iter.user_data; gtk_tree_view_set_model (traveler->state.view, model); gtk_tree_view_set_cursor (traveler->state.view, path, NULL, FALSE); gtk_tree_path_free (path); // traveler->state.view will emit signal "cursor_changed" and // call on_state_cursor_changed() } static void on_download_cursor_changed (GtkTreeView* view, UgtkTraveler* traveler) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; traveler->download.cursor.pos_last = traveler->download.cursor.pos; gtk_tree_view_get_cursor (view, &path, NULL); if (path == NULL) { traveler->download.cursor.pos = -1; traveler->download.cursor.node = NULL; return; } traveler->download.cursor.pos = gtk_tree_path_get_indices (path)[0]; model = gtk_tree_view_get_model (view); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); traveler->download.cursor.node = iter.user_data; } static void on_category_row_deleted (GtkTreeModel* model, GtkTreePath* p, UgtkTraveler* traveler) { GtkTreePath* path; GtkTreeIter iter; // update cursor position when row deleted gtk_tree_view_get_cursor (traveler->category.view, &path, NULL); if (path == NULL) { traveler->category.cursor.pos = 0; traveler->category.cursor.node = NULL; return; } gtk_tree_model_get_iter (model, &iter, path); traveler->category.cursor.node = iter.user_data; traveler->category.cursor.pos = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); } static void on_download_row_deleted (GtkTreeModel* model, GtkTreePath* p, UgtkTraveler* traveler) { GtkTreePath* path; GtkTreeIter iter; // update cursor position when row deleted gtk_tree_view_get_cursor (traveler->download.view, &path, NULL); if (path == NULL) { traveler->download.cursor.node = NULL; traveler->download.cursor.pos = 0; return; } gtk_tree_model_get_iter (model, &iter, path); traveler->download.cursor.node = iter.user_data; traveler->download.cursor.pos = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); } // ---------------------------------------------------------------------------- // signal handler for GtkTreeViewColumn static void ugtk_tree_view_column_clicked (GtkTreeViewColumn* column, UgtkNodeColumn nth_column, UgtkTraveler* traveler) { GtkSortType sorttype; UgtkApp* app; gint pos; // get column sort status column = gtk_tree_view_get_column (traveler->download.view, nth_column); sorttype = gtk_tree_view_column_get_sort_order (column); if (gtk_tree_view_column_get_sort_indicator (column)) { if (sorttype == GTK_SORT_ASCENDING) sorttype = GTK_SORT_DESCENDING; else sorttype = GTK_SORT_ASCENDING; } // clear column sort status for (pos = UGTK_NODE_COLUMN_NAME; pos < UGTK_NODE_N_COLUMNS; pos++) { GtkTreeViewColumn* tmp_column; tmp_column = gtk_tree_view_get_column (traveler->download.view, pos); gtk_tree_view_column_set_sort_order (tmp_column, GTK_SORT_ASCENDING); gtk_tree_view_column_set_sort_indicator (tmp_column, FALSE); } app = traveler->app; app->setting.download_column.sort.nth = nth_column; app->setting.download_column.sort.type = sorttype; if (nth_column > UGTK_NODE_COLUMN_STATE) { gtk_tree_view_column_set_sort_order (column, sorttype); gtk_tree_view_column_set_sort_indicator (column, TRUE); } uget_app_set_sorting ((UgetApp*) app, compare_funcs[nth_column], (sorttype == GTK_SORT_DESCENDING) ? TRUE : FALSE); // Any Category/Status can't move download position if they were sorted. ugtk_app_decide_download_sensitive (app); gtk_widget_queue_draw ((GtkWidget*) traveler->download.view); } static void on_state_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_STATE, traveler); } static void on_name_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_NAME, traveler); } static void on_complete_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_COMPLETE, traveler); } static void on_size_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_TOTAL, traveler); } static void on_percent_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_PERCENT, traveler); } static void on_elapsed_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_ELAPSED, traveler); } static void on_left_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_LEFT, traveler); } static void on_speed_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_SPEED, traveler); } static void on_upload_speed_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_UPLOAD_SPEED, traveler); } static void on_uploaded_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_UPLOADED, traveler); } static void on_ratio_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_RATIO, traveler); } static void on_retry_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_RETRY, traveler); } static void on_category_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_CATEGORY, traveler); } static void on_url_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_URI, traveler); } static void on_added_on_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_ADDED_ON, traveler); } static void on_completed_on_column_clicked (GtkTreeViewColumn *column, UgtkTraveler* traveler) { ugtk_tree_view_column_clicked (column, UGTK_NODE_COLUMN_COMPLETED_ON, traveler); } // ---------------------------------------------------------------------------- // static data const static void* sort_callbacks[UGTK_NODE_N_COLUMNS] = { on_state_column_clicked, on_name_column_clicked, on_complete_column_clicked, on_size_column_clicked, on_percent_column_clicked, on_elapsed_column_clicked, on_left_column_clicked, on_speed_column_clicked, on_upload_speed_column_clicked, on_uploaded_column_clicked, on_ratio_column_clicked, on_retry_column_clicked, on_category_column_clicked, on_url_column_clicked, on_added_on_column_clicked, on_completed_on_column_clicked, }; const static UgCompareFunc compare_funcs[UGTK_NODE_N_COLUMNS] = { (UgCompareFunc) NULL, (UgCompareFunc) uget_node_compare_name, (UgCompareFunc) uget_node_compare_complete, (UgCompareFunc) uget_node_compare_size, (UgCompareFunc) uget_node_compare_percent, (UgCompareFunc) uget_node_compare_elapsed, (UgCompareFunc) uget_node_compare_left, (UgCompareFunc) uget_node_compare_speed, (UgCompareFunc) uget_node_compare_upload_speed, (UgCompareFunc) uget_node_compare_uploaded, (UgCompareFunc) uget_node_compare_ratio, (UgCompareFunc) uget_node_compare_retry, (UgCompareFunc) uget_node_compare_parent_name, (UgCompareFunc) uget_node_compare_uri, (UgCompareFunc) uget_node_compare_added_time, (UgCompareFunc) uget_node_compare_completed_time, }; uget-2.2.2/ui-gtk/UgtkAboutDialog.h0000664000175000017500000000434313470304403014004 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_ABOUT_DIALOG_H #define UGTK_ABOUT_DIALOG_H #include #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif typedef struct UgtkAboutDialog UgtkAboutDialog; struct UgtkAboutDialog { GtkDialog* self; // UgtkApp* app; GdkPixbuf* pixbuf; GtkWidget* scrolled; GtkTextView* textview; GtkTextBuffer* textbuf; }; UgtkAboutDialog* ugtk_about_dialog_new (GtkWindow* parent); void ugtk_about_dialog_free (UgtkAboutDialog* adialog); void ugtk_about_dialog_set_info (UgtkAboutDialog* adialog, const gchar* text); void ugtk_about_dialog_run (UgtkAboutDialog* adialog); #endif // UGTK_ABOUT_DIALOG_H uget-2.2.2/ui-gtk/UgtkProxyForm.h0000664000175000017500000000600113470304403013550 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_PROXY_FORM_H #define UGTK_PROXY_FORM_H #include #include #ifdef HAVE_CONFIG_H #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct UgtkProxyForm UgtkProxyForm; struct UgtkProxyForm { GtkWidget* self; // top level widget GtkWidget* type; // GtkComboBox // classic // struct UgtkProxyFormStd { GtkWidget* std; // proxy server GtkWidget* host; // GtkEntry GtkWidget* port; // GtkEntry // authentication GtkWidget* user; // GtkEntry GtkWidget* password; // GtkEntry // } std; // User changed entry struct UgtkProxyFormChanged { gboolean enable:1; // UgProxyFormStd gboolean type:1; gboolean host:1; gboolean port:1; gboolean user:1; gboolean password:1; } changed; //#ifdef HAVE_LIBPWMD struct UgtkProxyFormPwmd { GtkWidget* self; GtkWidget* socket; GtkWidget* socket_args; GtkWidget* file; GtkWidget* element; // User changed entry struct UgtkProxyFormPwmdChanged { gboolean socket:1; gboolean socket_args:1; gboolean file:1; gboolean element:1; } changed; } pwmd; //#endif // HAVE_LIBPWMD }; void ugtk_proxy_form_init (UgtkProxyForm* pform); void ugtk_proxy_form_get (UgtkProxyForm* pform, UgInfo* info); void ugtk_proxy_form_set (UgtkProxyForm* pform, UgInfo* info, gboolean keep_changed); #ifdef __cplusplus } #endif #endif // End of UGTK_PROXY_FORM_H uget-2.2.2/ui-gtk/UgtkTrayIcon.h0000664000175000017500000000635013470304403013342 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_TRAY_ICON_H #define UGTK_TRAY_ICON_H #include #include #ifdef HAVE_APP_INDICATOR #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct UgtkTrayIcon UgtkTrayIcon; typedef struct UgtkApp UgtkApp; // -------------------------------- // Tray Icon enum UgtkTrayIconState { UGTK_TRAY_ICON_STATE_NORMAL, UGTK_TRAY_ICON_STATE_RUNNING, UGTK_TRAY_ICON_STATE_ERROR, }; struct UgtkTrayIcon { #ifdef HAVE_APP_INDICATOR AppIndicator* indicator; AppIndicator* indicator_temp; #endif GtkStatusIcon* self; gboolean visible; gboolean error_occurred; guint state; // UgtkTrayIconState struct UgtkTrayIconMenu { GtkWidget* self; // (GtkMenu) pop-up menu GtkWidget* create_download; GtkWidget* create_clipboard; GtkWidget* create_torrent; GtkWidget* create_metalink; gboolean emission; GtkWidget* clipboard_monitor; GtkWidget* clipboard_quiet; GtkWidget* commandline_quiet; GtkWidget* skip_existing; GtkWidget* apply_recent; GtkWidget* settings; GtkWidget* about; GtkWidget* show_window; GtkWidget* offline_mode; GtkWidget* quit; } menu; }; void ugtk_tray_icon_init (UgtkTrayIcon* trayicon); void ugtk_tray_icon_set_info (UgtkTrayIcon* trayicon, guint n_active, gint64 down_speed, gint64 up_speed); void ugtk_tray_icon_set_visible (UgtkTrayIcon* trayicon, gboolean visible); #ifdef HAVE_APP_INDICATOR void ugtk_tray_icon_use_indicator (UgtkTrayIcon* trayicon, gboolean enable); #endif void ugtk_trayicon_init_callback (UgtkTrayIcon* trayicon, UgtkApp* app); #ifdef __cplusplus } #endif #endif // UGTK_TRAY_H uget-2.2.2/ui-gtk/UgtkNodeList.c0000664000175000017500000004373213470304403013333 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ /* * This file base on GTK+ 2.0 Tree View Tutorial - custom-list.c */ #include #define NODE_LIST_N_COLUMNS 1 /* boring declarations of local functions */ static void init (UgtkNodeList* ugtree); static void class_init (UgtkNodeListClass *klass); static void tree_model_init (GtkTreeModelIface *iface); static void finalize (GObject* object); static GtkTreeModelFlags get_flags (GtkTreeModel* tree_model); static gint get_n_columns (GtkTreeModel* tree_model); static GType get_column_type (GtkTreeModel* tree_model, gint index); static gboolean get_iter (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreePath* path); static GtkTreePath* get_path (GtkTreeModel* tree_model, GtkTreeIter* iter); static void get_value (GtkTreeModel* tree_model, GtkTreeIter* iter, gint column, GValue* value); static gboolean iter_next (GtkTreeModel* tree_model, GtkTreeIter* iter); static gboolean iter_children (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent); static gboolean iter_has_child (GtkTreeModel* tree_model, GtkTreeIter* iter); static gint iter_n_children (GtkTreeModel* tree_model, GtkTreeIter* iter); static gboolean iter_nth_child (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent, gint n); static gboolean iter_parent (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* child); static GObjectClass* parent_class = NULL; /* GObject stuff - nothing to worry about */ /***************************************************************************** * * class_init: more boilerplate GObject/GType stuff. * Init callback for the type system, * called once when our new class is created. * *****************************************************************************/ static void class_init (UgtkNodeListClass* klass) { GObjectClass *object_class; parent_class = (GObjectClass*) g_type_class_peek_parent (klass); object_class = (GObjectClass*) klass; object_class->finalize = finalize; } /***************************************************************************** * * tree_model_init: init callback for the interface registration * in ugtk_node_list_get_type. Here we override * the GtkTreeModel interface functions that * we implement. * *****************************************************************************/ static void tree_model_init (GtkTreeModelIface* iface) { iface->get_flags = get_flags; iface->get_n_columns = get_n_columns; iface->get_column_type = get_column_type; iface->get_iter = get_iter; iface->get_path = get_path; iface->get_value = get_value; iface->iter_next = iter_next; iface->iter_children = iter_children; iface->iter_has_child = iter_has_child; iface->iter_n_children = iter_n_children; iface->iter_nth_child = iter_nth_child; iface->iter_parent = iter_parent; } /***************************************************************************** * * init: this is called everytime a new object object * instance is created (we do that in g_object_new). * Initialise the list structure's fields here. * *****************************************************************************/ static void init (UgtkNodeList* ulist) { ulist->stamp = g_random_int(); /* Random int to check whether an iter belongs to our model */ } /***************************************************************************** * * finalize: this is called just before a object is * destroyed. Free dynamically allocated memory here. * *****************************************************************************/ static void finalize (GObject* object) { // UgtkNodeList *ulist = UGTK_NODE_LIST(object); // must chain up - finalize parent (*parent_class->finalize) (object); } /***************************************************************************** * * get_flags: tells the rest of the world whether our tree model * has any special characteristics. In our case, * we have a list model (instead of a tree), and each * tree iter is valid as long as the row in question * exists, as it only contains a pointer to our struct. * *****************************************************************************/ static GtkTreeModelFlags get_flags (GtkTreeModel* tree_model) { g_return_val_if_fail (UGTK_IS_NODE_LIST(tree_model), (GtkTreeModelFlags)0); return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST); } /***************************************************************************** * * get_n_columns: tells the rest of the world how many data * columns we export via the tree model interface * *****************************************************************************/ static gint get_n_columns (GtkTreeModel* tree_model) { g_return_val_if_fail (UGTK_IS_NODE_LIST(tree_model), 0); return NODE_LIST_N_COLUMNS; } /***************************************************************************** * * get_column_type: tells the rest of the world which type of * data an exported model column contains * *****************************************************************************/ static GType get_column_type (GtkTreeModel* tree_model, gint index) { g_return_val_if_fail (UGTK_IS_NODE_LIST(tree_model), G_TYPE_INVALID); g_return_val_if_fail (index < NODE_LIST_N_COLUMNS && index >= 0, G_TYPE_INVALID); return G_TYPE_POINTER; } /***************************************************************************** * * get_iter: converts a tree path (physical position) into a * tree iter structure (the content of the iter * fields will only be used internally by our model). * We simply store a pointer to our CustomRecord * structure that represents that row in the tree iter. * *****************************************************************************/ static gboolean get_iter (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreePath* path) { UgtkNodeList* ulist; UgetNode* node; gint* indices; gint depth; g_assert (UGTK_IS_NODE_LIST(tree_model)); g_assert (path != NULL); ulist = UGTK_NODE_LIST(tree_model); if (ulist->root == NULL) return FALSE; indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); g_assert (depth == 1); if (ulist->root_visible) { if (indices[0] == 0) node = ulist->root; else if (indices[0] <= ulist->n_fake) node = uget_node_nth_fake (ulist->root, indices[0] - 1); else return FALSE; } else { if (indices[0] < ulist->n_fake) node = uget_node_nth_fake (ulist->root, indices[0]); else return FALSE; } if (node == NULL) return FALSE; else { // We store a pointer to UgNode in the iter iter->stamp = ulist->stamp; iter->user_data = node; iter->user_data2 = NULL; /* unused */ iter->user_data3 = NULL; /* unused */ return TRUE; } } /***************************************************************************** * * get_path: converts a tree iter into a tree path (ie. the * physical position of that row in the list). * *****************************************************************************/ static GtkTreePath* get_path (GtkTreeModel* tree_model, GtkTreeIter* iter) { GtkTreePath* path; UgtkNodeList* ulist; UgetNode* node; gint n; g_return_val_if_fail (UGTK_IS_NODE_LIST(tree_model), NULL); g_return_val_if_fail (iter != NULL, NULL); g_return_val_if_fail (iter->user_data != NULL, NULL); node = iter->user_data; path = gtk_tree_path_new(); ulist = UGTK_NODE_LIST (tree_model); if (ulist->root_visible == FALSE) n = uget_node_fake_position (node->real, node); else { if (ulist->root == node) n = 0; else n = uget_node_fake_position (node->real, node) + 1; } gtk_tree_path_prepend_index (path, n); return path; } /***************************************************************************** * * get_value: Returns a row's exported data columns * (_get_value is what gtk_tree_model_get uses) * *****************************************************************************/ static void get_value (GtkTreeModel* tree_model, GtkTreeIter* iter, gint column, GValue* value) { // UgtkNodeList* ulist; g_return_if_fail (UGTK_IS_NODE_LIST (tree_model)); g_return_if_fail (iter != NULL); g_return_if_fail (column < NODE_LIST_N_COLUMNS); g_value_init (value, G_TYPE_POINTER); // ulist = UGTK_NODE_LIST (tree_model); g_value_set_pointer (value, iter->user_data); } /***************************************************************************** * * iter_next: Takes an iter structure and sets it to point * to the next row. * *****************************************************************************/ static gboolean iter_next (GtkTreeModel* tree_model, GtkTreeIter* iter) { UgtkNodeList* ulist; UgetNode* node; g_return_val_if_fail (UGTK_IS_NODE_LIST (tree_model), FALSE); ulist = UGTK_NODE_LIST(tree_model); if (ulist->root == NULL) return FALSE; node = iter->user_data; if (ulist->root_visible && ulist->root == node) node = node->fake; else node = node->peer; if (node == NULL || uget_node_fake_position (node->real, node) >= ulist->n_fake) return FALSE; else { iter->stamp = ulist->stamp; iter->user_data = node; return TRUE; } } /***************************************************************************** * * iter_children: Returns TRUE or FALSE depending on whether * the row specified by 'parent' has any children. * If it has children, then 'iter' is set to * point to the first child. Special case: if * 'parent' is NULL, then the first top-level * row should be returned if it exists. * *****************************************************************************/ static gboolean iter_children (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent) { UgtkNodeList* ulist; UgetNode* node; g_return_val_if_fail (UGTK_IS_NODE_LIST (tree_model), FALSE); g_return_val_if_fail (parent == NULL, FALSE); ulist = UGTK_NODE_LIST (tree_model); if (ulist->root == NULL) return FALSE; if (ulist->root_visible) node = ulist->root; else node = ulist->root->fake; // Set iter to first child item. if (node == NULL) return FALSE; else { iter->stamp = ulist->stamp; iter->user_data = node; return TRUE; } } /***************************************************************************** * * iter_has_child: Returns TRUE or FALSE depending on whether * the row specified by 'iter' has any children. * We only have a list and thus no children. * *****************************************************************************/ static gboolean iter_has_child (GtkTreeModel* tree_model, GtkTreeIter* iter) { return FALSE; } /***************************************************************************** * * iter_n_children: Returns the number of children the row * specified by 'iter' has. This is usually 0, * as we only have a list and thus do not have * any children to any rows. A special case is * when 'iter' is NULL, in which case we need * to return the number of top-level nodes, * ie. the number of rows in our list. * *****************************************************************************/ static gint iter_n_children (GtkTreeModel* tree_model, GtkTreeIter* iter) { UgtkNodeList* ulist; UgetNode* node; gint n = 0; g_return_val_if_fail (UGTK_IS_NODE_LIST (tree_model), -1); g_return_val_if_fail (iter == NULL, -1); ulist = UGTK_NODE_LIST (tree_model); if (ulist->root == NULL) return 0; node = iter->user_data; for (n = 0, node = node->fake; node; node = node->peer) n++; if (n > ulist->n_fake) n = ulist->n_fake; if (ulist->root_visible) n++; return n; } /***************************************************************************** * * iter_nth_child: If the row specified by 'parent' has any * children, set 'iter' to the n-th child and * return TRUE if it exists, otherwise FALSE. * A special case is when 'parent' is NULL, in * which case we need to set 'iter' to the n-th * row if it exists. * *****************************************************************************/ static gboolean iter_nth_child (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent, gint n) { UgtkNodeList* ulist; UgetNode* node; g_return_val_if_fail (UGTK_IS_NODE_LIST (tree_model), FALSE); g_return_val_if_fail (parent == NULL, FALSE); ulist = UGTK_NODE_LIST (tree_model); if (ulist->root == NULL) return FALSE; if (ulist->root_visible) { if (n == 0) node = ulist->root; else if (n <= ulist->n_fake) node = uget_node_nth_fake (ulist->root, n - 1); else return FALSE; } else { if (n < ulist->n_fake) node = uget_node_nth_fake (ulist->root, n); else return FALSE; } if (node == NULL) return FALSE; else { iter->stamp = ulist->stamp; iter->user_data = node; return TRUE; } } /***************************************************************************** * * iter_parent: Point 'iter' to the parent node of 'child'. As * we have a list and thus no children and no * parents of children, we can just return FALSE. * *****************************************************************************/ static gboolean iter_parent (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* child) { return FALSE; } /***************************************************************************** * * ugtk_node_list_get_type: here we register our new type and its interfaces * with the type system. If you want to implement * additional interfaces like GtkTreeSortable, you * will need to do it here. * *****************************************************************************/ GType ugtk_node_list_get_type (void) { static GType ugtk_node_list_type = 0; /* Some boilerplate type registration stuff */ if (ugtk_node_list_type == 0) { static const GTypeInfo ugtk_node_list_info = { sizeof (UgtkNodeListClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) class_init, NULL, /* class finalize */ NULL, /* class_data */ sizeof (UgtkNodeList), 0, /* n_preallocs */ (GInstanceInitFunc) init }; static const GInterfaceInfo tree_model_info = { (GInterfaceInitFunc) tree_model_init, NULL, NULL }; /* First register the new derived type with the GObject type system */ ugtk_node_list_type = g_type_register_static (G_TYPE_OBJECT, "UgtkNodeList", &ugtk_node_list_info, (GTypeFlags)0); /* Now register our GtkTreeModel interface with the type system */ g_type_add_interface_static (ugtk_node_list_type, GTK_TYPE_TREE_MODEL, &tree_model_info); } return ugtk_node_list_type; } /***************************************************************************** * * ugtk_node_list_new: This is what you use in your own code to create a * new tree model for you to use. * *****************************************************************************/ UgtkNodeList* ugtk_node_list_new (UgetNode* root, gint n_fake, gboolean root_visible) { UgtkNodeList* ulist; ulist = (UgtkNodeList*) g_object_new (UGTK_TYPE_NODE_LIST, NULL); ulist->root = root; ulist->n_fake = n_fake; ulist->root_visible = root_visible; g_assert( ulist != NULL ); return ulist; } uget-2.2.2/ui-gtk/UgtkTrayIcon.c0000664000175000017500000004174613470304403013345 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #define UGTK_TRAY_ICON_NAME "uget-tray-default" #define UGTK_TRAY_ICON_ERROR_NAME "uget-tray-error" #define UGTK_TRAY_ICON_ACTIVE_NAME "uget-tray-downloading" void ugtk_tray_icon_init (UgtkTrayIcon* trayicon) { GtkWidget* image; GtkWidget* menu; GtkWidget* menu_item; gchar* icon_name; gchar* file_name; // UgTrayIcon.menu menu = gtk_menu_new (); // New Download menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _Download...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-new", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.create_download = menu_item; // New Clipboard batch menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Clipboard _batch...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("edit-paste", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.create_clipboard = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // New Torrent menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Torrent...")); // image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.create_torrent = menu_item; // New Metalink menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Metalink...")); // image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.create_metalink = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Settings shortcut menu_item = gtk_check_menu_item_new_with_mnemonic (_("Clipboard _Monitor")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.clipboard_monitor = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Clipboard works quietly")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.clipboard_quiet = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Command-line works quietly")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.commandline_quiet = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Skip existing URI")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.skip_existing = menu_item; menu_item = gtk_check_menu_item_new_with_mnemonic (_("Apply recent download settings")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.apply_recent = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // Settings menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Settings...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.settings = menu_item; // About menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.about = menu_item; gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); #ifdef HAVE_APP_INDICATOR // Show window menu_item = gtk_menu_item_new_with_mnemonic (_("Show window")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.show_window = menu_item; #endif // Offline mode menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Offline Mode")); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.offline_mode = menu_item; // Quit menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); trayicon->menu.quit = menu_item; gtk_widget_show_all (menu); trayicon->menu.self = menu; // decide tray icon file_name = g_build_filename (UG_DATADIR, "icons", "hicolor", "16x16", "apps", "uget-icon.png", NULL); if (g_file_test (file_name, G_FILE_TEST_IS_REGULAR)) icon_name = UGTK_TRAY_ICON_NAME; else icon_name = GTK_STOCK_GO_DOWN; g_free (file_name); #ifdef HAVE_APP_INDICATOR trayicon->indicator = app_indicator_new ("uget-gtk", icon_name, APP_INDICATOR_CATEGORY_APPLICATION_STATUS); trayicon->indicator_temp = trayicon->indicator; if (trayicon->indicator) { app_indicator_set_menu (trayicon->indicator, GTK_MENU (trayicon->menu.self)); // app_indicator_set_attention_icon_full (trayicon->indicator, // UGTK_TRAY_ICON_ACTIVE_NAME, NULL); app_indicator_set_attention_icon (trayicon->indicator, UGTK_TRAY_ICON_ACTIVE_NAME); app_indicator_set_status (trayicon->indicator, APP_INDICATOR_STATUS_PASSIVE); } #endif // HAVE_APP_INDICATOR trayicon->self = gtk_status_icon_new_from_icon_name (icon_name); gtk_status_icon_set_visible (trayicon->self, FALSE); } void ugtk_tray_icon_set_info (UgtkTrayIcon* trayicon, guint n_active, gint64 down_speed, gint64 up_speed) { gchar* string; char* string_down_speed; char* string_up_speed; guint current_state; // change tray icon if (trayicon->error_occurred) { string = UGTK_TRAY_ICON_ERROR_NAME; current_state = UGTK_TRAY_ICON_STATE_ERROR; } else if (n_active > 0) { string = UGTK_TRAY_ICON_ACTIVE_NAME; current_state = UGTK_TRAY_ICON_STATE_RUNNING; } else { string = UGTK_TRAY_ICON_NAME; current_state = UGTK_TRAY_ICON_STATE_NORMAL; } if (trayicon->state != current_state) { trayicon->state = current_state; #ifdef HAVE_APP_INDICATOR if (trayicon->indicator) { trayicon->error_occurred = FALSE; if (app_indicator_get_status (trayicon->indicator) != APP_INDICATOR_STATUS_PASSIVE) { if (current_state == UGTK_TRAY_ICON_STATE_NORMAL) { app_indicator_set_status (trayicon->indicator, APP_INDICATOR_STATUS_ACTIVE); } else { app_indicator_set_attention_icon (trayicon->indicator, string); // app_indicator_set_attention_icon_full (trayicon->indicator, // string, "attention"); app_indicator_set_status (trayicon->indicator, APP_INDICATOR_STATUS_ATTENTION); } } } else #endif // HAVE_APP_INDICATOR gtk_status_icon_set_from_icon_name (trayicon->self, string); } // change tooltip string_down_speed = ug_str_from_int_unit (down_speed, "/s"); string_up_speed = ug_str_from_int_unit (up_speed, "/s"); string = g_strdup_printf ( UGTK_APP_NAME " " PACKAGE_VERSION "\n" "%u %s" "\n" "\xE2\x86\x93 %s" // "↓" " , " "\xE2\x86\x91 %s", // "↑" n_active, _("tasks"), string_down_speed, string_up_speed); #ifdef HAVE_APP_INDICATOR if (trayicon->indicator) { // g_object_set (trayicon->indicator, "icon-desc", string, NULL); // g_object_set (trayicon->indicator, "attention-icon-desc", string, NULL); } else #endif // HAVE_APP_INDICATOR gtk_status_icon_set_tooltip_text (trayicon->self, string); ug_free (string_down_speed); ug_free (string_up_speed); g_free (string); } void ugtk_tray_icon_set_visible (UgtkTrayIcon* trayicon, gboolean visible) { #ifdef HAVE_APP_INDICATOR if (trayicon->indicator) { if (visible) app_indicator_set_status (trayicon->indicator, APP_INDICATOR_STATUS_ACTIVE); else app_indicator_set_status (trayicon->indicator, APP_INDICATOR_STATUS_PASSIVE); } else #endif // HAVE_APP_INDICATOR gtk_status_icon_set_visible (trayicon->self, visible); trayicon->visible = visible; } #ifdef HAVE_APP_INDICATOR void ugtk_tray_icon_use_indicator (UgtkTrayIcon* trayicon, gboolean enable) { ugtk_tray_icon_set_visible (trayicon, FALSE); if (enable) trayicon->indicator = trayicon->indicator_temp; else trayicon->indicator = NULL; ugtk_tray_icon_set_visible (trayicon, trayicon->visible); } #endif // HAVE_APP_INDICATOR // ---------------------------------------------------------------------------- // Callback static void on_trayicon_activate (GtkStatusIcon* status_icon, UgtkApp* app) { gint x, y; if (gtk_widget_get_visible ((GtkWidget*) app->window.self) == TRUE) { // get position and size gtk_window_get_position (app->window.self, &x, &y); gtk_window_get_size (app->window.self, &app->setting.window.width, &app->setting.window.height); // gtk_window_get_position() may return: x == -32000, y == -32000 if (x + app->setting.window.width > 0) app->setting.window.x = x; if (y + app->setting.window.height > 0) app->setting.window.y = y; // hide window #if defined _WIN32 || defined _WIN64 // gtk_window_iconify (app->window.self); #endif gtk_widget_hide ((GtkWidget*) app->window.self); } else { #if defined _WIN32 || defined _WIN64 // gtk_window_deiconify (app->window.self); #endif gtk_widget_show ((GtkWidget*) app->window.self); gtk_window_present (app->window.self); ugtk_app_decide_trayicon_visible (app); // set position and size gtk_window_move (app->window.self, app->setting.window.x, app->setting.window.y); gtk_window_resize (app->window.self, app->setting.window.width, app->setting.window.height); } // clear error status if (app->trayicon.error_occurred) { app->trayicon.error_occurred = FALSE; app->trayicon.state = UGTK_TRAY_ICON_STATE_NORMAL; gtk_status_icon_set_from_icon_name (status_icon, UGTK_TRAY_ICON_NAME); } } static void on_trayicon_popup_menu (GtkStatusIcon* status_icon, guint button, guint activate_time, UgtkTrayIcon* trayicon) { gtk_menu_set_screen ((GtkMenu*) trayicon->menu.self, gtk_status_icon_get_screen (status_icon)); #if defined _WIN32 || defined _WIN64 gtk_menu_popup ((GtkMenu*) trayicon->menu.self, NULL, NULL, NULL, NULL, button, activate_time); #else gtk_menu_popup ((GtkMenu*) trayicon->menu.self, NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time); #endif } #if defined _WIN32 || defined _WIN64 static gboolean tray_menu_timeout (GtkMenu* menu) { gtk_menu_popdown (menu); // return FALSE if the source should be removed. return FALSE; } static gboolean tray_menu_leave_enter (GtkWidget* menu, GdkEventCrossing* event, gpointer data) { static guint tray_menu_timer = 0; if (event->type == GDK_LEAVE_NOTIFY && (event->detail == GDK_NOTIFY_ANCESTOR || event->detail == GDK_NOTIFY_UNKNOWN)) { if (tray_menu_timer == 0) { tray_menu_timer = g_timeout_add (500, (GSourceFunc) tray_menu_timeout, menu); } } else if (event->type == GDK_ENTER_NOTIFY && event->detail == GDK_NOTIFY_ANCESTOR) { if (tray_menu_timer != 0) { g_source_remove (tray_menu_timer); tray_menu_timer = 0; } } return FALSE; } #endif // _WIN32 || _WIN64 static void on_create_download (GtkWidget* widget, UgtkApp* app) { ugtk_app_create_download (app, NULL, NULL); } static void on_clipboard_monitor (GtkWidget* widget, UgtkApp* app) { if (app->trayicon.menu.emission) g_signal_emit_by_name (app->menubar.edit.clipboard_monitor, "activate"); } static void on_clipboard_quiet (GtkWidget* widget, UgtkApp* app) { if (app->trayicon.menu.emission) g_signal_emit_by_name (app->menubar.edit.clipboard_quiet, "activate"); } static void on_commandline_quiet (GtkWidget* widget, UgtkApp* app) { if (app->trayicon.menu.emission) g_signal_emit_by_name (app->menubar.edit.commandline_quiet, "activate"); } static void on_skip_existing (GtkWidget* widget, UgtkApp* app) { if (app->trayicon.menu.emission) g_signal_emit_by_name (app->menubar.edit.skip_existing, "activate"); } static void on_apply_recent (GtkWidget* widget, UgtkApp* app) { if (app->trayicon.menu.emission) g_signal_emit_by_name (app->menubar.edit.apply_recent, "activate"); } static void on_config_settings (GtkWidget* widget, UgtkApp* app) { g_signal_emit_by_name (app->menubar.edit.settings, "activate"); } static void on_offline_mode (GtkWidget* widget, UgtkApp* app) { gboolean offline; offline = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.offline_mode = offline; // file menu offline = gtk_check_menu_item_get_active ( (GtkCheckMenuItem*) app->menubar.file.offline_mode); if (offline != app->setting.offline_mode) { gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.file.offline_mode, app->setting.offline_mode); } } static void on_about (GtkWidget* widget, UgtkApp* app) { g_signal_emit_by_name (app->menubar.help.about_uget, "activate"); } #ifdef HAVE_APP_INDICATOR static void on_trayicon_show_window (GtkWidget* widget, UgtkApp* app) { if (gtk_widget_get_visible ((GtkWidget*) app->window.self)) gtk_window_present (app->window.self); else { gtk_widget_show ((GtkWidget*) app->window.self); // gtk_window_deiconify (app->window.self); gtk_window_present (app->window.self); ugtk_app_decide_trayicon_visible (app); } } #endif // HAVE_APP_INDICATOR void ugtk_trayicon_init_callback (struct UgtkTrayIcon* trayicon, UgtkApp* app) { g_signal_connect (trayicon->self, "activate", G_CALLBACK (on_trayicon_activate), app); g_signal_connect (trayicon->self, "popup-menu", G_CALLBACK (on_trayicon_popup_menu), trayicon); #if defined _WIN32 || defined _WIN64 g_signal_connect (trayicon->menu.self, "leave-notify-event", G_CALLBACK (tray_menu_leave_enter), NULL); g_signal_connect (trayicon->menu.self, "enter-notify-event", G_CALLBACK (tray_menu_leave_enter), NULL); #endif g_signal_connect (trayicon->menu.create_download, "activate", G_CALLBACK (on_create_download), app); g_signal_connect_swapped (trayicon->menu.create_clipboard, "activate", G_CALLBACK (ugtk_app_clipboard_batch), app); g_signal_connect_swapped (trayicon->menu.create_torrent, "activate", G_CALLBACK (ugtk_app_create_torrent), app); g_signal_connect_swapped (trayicon->menu.create_metalink, "activate", G_CALLBACK (ugtk_app_create_metalink), app); trayicon->menu.emission = TRUE; g_signal_connect (trayicon->menu.clipboard_monitor, "activate", G_CALLBACK (on_clipboard_monitor), app); g_signal_connect (trayicon->menu.clipboard_quiet, "activate", G_CALLBACK (on_clipboard_quiet), app); g_signal_connect (trayicon->menu.commandline_quiet, "activate", G_CALLBACK (on_commandline_quiet), app); g_signal_connect (trayicon->menu.skip_existing, "activate", G_CALLBACK (on_skip_existing), app); g_signal_connect (trayicon->menu.apply_recent, "activate", G_CALLBACK (on_apply_recent), app); g_signal_connect (trayicon->menu.settings, "activate", G_CALLBACK (on_config_settings), app); g_signal_connect (trayicon->menu.offline_mode, "toggled", G_CALLBACK (on_offline_mode), app); g_signal_connect (trayicon->menu.about, "activate", G_CALLBACK (on_about), app); g_signal_connect_swapped (trayicon->menu.quit, "activate", G_CALLBACK (ugtk_app_decide_to_quit), app); #ifdef HAVE_APP_INDICATOR g_signal_connect (trayicon->menu.show_window, "activate", G_CALLBACK (on_trayicon_show_window), app); #endif // HAVE_APP_INDICATOR } uget-2.2.2/ui-gtk/UgtkProxyForm.c0000664000175000017500000004054113470304403013552 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include static void ugtk_proxy_form_std_init (UgtkProxyForm* pform); // signal handler static void on_type_changed (GtkComboBox* widget, UgtkProxyForm* pform); static void on_entry_std_changed (GtkEditable* editable, UgtkProxyForm* pform); #ifdef HAVE_LIBPWMD static void ugtk_proxy_form_pwmd_init (struct UgtkProxyFormPwmd* pfp, UgtkProxyForm* pform); static void on_entry_pwmd_changed (GtkEditable* editable, UgtkProxyForm* pform); #endif void ugtk_proxy_form_init (UgtkProxyForm* pform) { GtkWidget* vbox; GtkWidget* hbox; GtkWidget* widget; pform->changed.enable = TRUE; pform->changed.type = FALSE; // proxy type label & combo box widget = gtk_label_new (_("Proxy:")); pform->type = gtk_combo_box_text_new (); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_NONE, _("Don't use")); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_DEFAULT, _("Default")); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_HTTP, "HTTP"); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_SOCKS4, "SOCKS v4"); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_SOCKS5, "SOCKS v5"); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 1); gtk_box_pack_start (GTK_BOX (hbox), pform->type, FALSE, FALSE, 2); // gtk_box_pack_start (GTK_BOX (hbox), // gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 2); g_signal_connect (pform->type, "changed", G_CALLBACK (on_type_changed), pform); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); ugtk_proxy_form_std_init (pform); gtk_box_pack_end (GTK_BOX (vbox), pform->std, TRUE, TRUE, 0); #ifdef HAVE_LIBPWMD gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (pform->type), UGET_PROXY_PWMD, "PWMD"); ugtk_proxy_form_pwmd_init (&pform->pwmd, pform); gtk_box_pack_end (GTK_BOX (vbox), pform->pwmd.self, TRUE, TRUE, 0); #endif // HAVE_LIBPWMD // gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 3); widget = gtk_frame_new (NULL); gtk_frame_set_label_widget (GTK_FRAME (widget), hbox); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); pform->self = widget; gtk_widget_show_all (pform->self); } static void ugtk_proxy_form_std_init (UgtkProxyForm* pform) { GtkGrid* grid; GtkWidget* widget; GtkWidget* hbox; pform->changed.host = FALSE; pform->changed.port = FALSE; pform->changed.user = FALSE; pform->changed.password = FALSE; pform->std = gtk_grid_new (); grid = (GtkGrid*) pform->std; // host label & entry widget = gtk_label_new_with_mnemonic (_("Host:")); pform->host = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pform->host), 8); gtk_entry_set_activates_default (GTK_ENTRY (pform->host), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pform->host); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pform->host, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 0, 0, 1, 1); gtk_grid_attach (grid, pform->host, 1, 0, 1, 1); // port label & entry widget = gtk_label_new_with_mnemonic (_("Port:")); pform->port = gtk_spin_button_new_with_range (0.0, 65535.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (pform->port), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY (pform->port), 5); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pform->port); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX (hbox), pform->port, FALSE, FALSE, 0); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (hbox, "margin", 1, NULL); gtk_grid_attach (grid, widget, 0, 1, 1, 1); gtk_grid_attach (grid, hbox, 1, 1, 1, 1); // center separator widget = gtk_separator_new (GTK_ORIENTATION_VERTICAL); g_object_set (widget, "margin", 1, NULL); gtk_grid_attach (grid, widget, 2, 0, 1, 2); // user label & entry widget = gtk_label_new_with_mnemonic (_("User:")); pform->user = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pform->user), 7); gtk_entry_set_activates_default (GTK_ENTRY (pform->user), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pform->user); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pform->user, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 3, 0, 1, 1); gtk_grid_attach (grid, pform->user, 4, 0, 1, 1); // password label & entry widget = gtk_label_new_with_mnemonic (_("Password:")); pform->password = gtk_entry_new (); gtk_entry_set_visibility (GTK_ENTRY (pform->password), FALSE); gtk_entry_set_width_chars (GTK_ENTRY (pform->password), 7); gtk_entry_set_activates_default (GTK_ENTRY (pform->password), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pform->password); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pform->password, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 3, 1, 1, 1); gtk_grid_attach (grid, pform->password, 4, 1, 1, 1); g_signal_connect (GTK_EDITABLE (pform->user), "changed", G_CALLBACK (on_entry_std_changed), pform); g_signal_connect (GTK_EDITABLE (pform->password), "changed", G_CALLBACK (on_entry_std_changed), pform); g_signal_connect (GTK_EDITABLE (pform->host), "changed", G_CALLBACK (on_entry_std_changed), pform); g_signal_connect (GTK_EDITABLE (pform->port), "changed", G_CALLBACK (on_entry_std_changed), pform); gtk_widget_show_all (pform->std); } void ugtk_proxy_form_get (UgtkProxyForm* pform, UgInfo* node_info) { UgetProxy* proxy; gint index; const gchar* text; index = gtk_combo_box_get_active ((GtkComboBox*) pform->type); proxy = ug_info_realloc (node_info, UgetProxyInfo); proxy->type = index; // user text = gtk_entry_get_text ((GtkEntry*)pform->user); ug_free (proxy->user); proxy->user = (*text) ? ug_strdup (text) : NULL; // password text = gtk_entry_get_text ((GtkEntry*)pform->password); ug_free (proxy->password); proxy->password = (*text) ? ug_strdup (text) : NULL; // host text = gtk_entry_get_text ((GtkEntry*)pform->host); ug_free (proxy->host); proxy->host = (*text) ? ug_strdup (text) : NULL; proxy->port = gtk_spin_button_get_value_as_int ((GtkSpinButton*) pform->port); #ifdef HAVE_LIBPWMD ug_free (proxy->pwmd.socket); text = gtk_entry_get_text ((GtkEntry*)pform->pwmd.socket); proxy->pwmd.socket = (*text) ? ug_strdup (text) : NULL; ug_free (proxy->pwmd.socket_args); text = gtk_entry_get_text ((GtkEntry*)pform->pwmd.socket_args); proxy->pwmd.socket_args = (*text) ? ug_strdup (text) : NULL; ug_free (proxy->pwmd.file); text = gtk_entry_get_text ((GtkEntry*)pform->pwmd.file); proxy->pwmd.file = (*text) ? ug_strdup (text) : NULL; ug_free (proxy->pwmd.element); text = gtk_entry_get_text ((GtkEntry*)pform->pwmd.element); proxy->pwmd.element = (*text) ? ug_strdup (text) : NULL; #endif // HAVE_LIBPWMD } void ugtk_proxy_form_set (UgtkProxyForm* pform, UgInfo* node_info, gboolean keep_changed) { UgetProxy* proxy; proxy = ug_info_get (node_info, UgetProxyInfo); // if no proxy data if (proxy == NULL) { pform->changed.enable = FALSE; // disable changed flags if (keep_changed == FALSE || pform->changed.type == FALSE) gtk_spin_button_set_value ((GtkSpinButton*) pform->port, 80); if (keep_changed == FALSE || pform->changed.port == FALSE) gtk_combo_box_set_active ((GtkComboBox*) pform->type, UGET_PROXY_NONE); pform->changed.enable = TRUE; // enable changed flags return; } // disable changed flags pform->changed.enable = FALSE; // set changed flags if (keep_changed == FALSE) { pform->changed.type = proxy->keeping.type; pform->changed.host = proxy->keeping.host; pform->changed.port = proxy->keeping.port; pform->changed.user = proxy->keeping.user; pform->changed.password = proxy->keeping.password; } // Type if (keep_changed == FALSE || pform->changed.type == FALSE) gtk_combo_box_set_active ((GtkComboBox*) pform->type, proxy->type); // User if (keep_changed == FALSE || pform->changed.user == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->user, (proxy->user) ? proxy->user : ""); } // Password if (keep_changed == FALSE || pform->changed.password == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->password, (proxy->password) ? proxy->password : ""); } // Host if (keep_changed == FALSE || pform->changed.host == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->host, (proxy->host) ? proxy->host : ""); } // Port if (keep_changed == FALSE || pform->changed.port == FALSE) gtk_spin_button_set_value ((GtkSpinButton*) pform->port, proxy->port); #ifdef HAVE_LIBPWMD if (keep_changed == FALSE) { pform->pwmd.changed.socket = proxy->pwmd.keeping.socket; pform->pwmd.changed.socket_args = proxy->pwmd.keeping.socket_args; pform->pwmd.changed.file = proxy->pwmd.keeping.file; pform->pwmd.changed.element = proxy->pwmd.keeping.element; } if (keep_changed == FALSE || pform->pwmd.changed.socket == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->pwmd.socket, (proxy->pwmd.socket) ? proxy->pwmd.socket: ""); } if (keep_changed == FALSE || pform->pwmd.changed.socket_args == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->pwmd.socket_args, (proxy->pwmd.socket_args) ? proxy->pwmd.socket_args: ""); } if (keep_changed == FALSE || pform->pwmd.changed.file == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->pwmd.file, (proxy->pwmd.file) ? proxy->pwmd.file: ""); } if (keep_changed == FALSE || pform->pwmd.changed.element == FALSE) { gtk_entry_set_text ((GtkEntry*) pform->pwmd.element, (proxy->pwmd.element) ? proxy->pwmd.element: ""); } #endif // HAVE_LIBPWMD // enable changed flags pform->changed.enable = TRUE; } //------------------------------------------------------------------- // signal static void on_type_changed (GtkComboBox* widget, UgtkProxyForm* pform) { gint index; gboolean sensitive; if (pform->changed.enable) pform->changed.type = TRUE; index = gtk_combo_box_get_active (widget); if (index == UGET_PROXY_NONE) sensitive = FALSE; else sensitive = TRUE; gtk_widget_set_sensitive (pform->std, sensitive); #ifdef HAVE_LIBPWMD gtk_widget_set_sensitive (pform->pwmd.self, sensitive); if (index == UGET_PROXY_PWMD) { gtk_widget_set_visible (pform->std, FALSE); gtk_widget_set_visible (pform->pwmd.self, TRUE); } else { gtk_widget_set_visible (pform->pwmd.self, FALSE); gtk_widget_set_visible (pform->std, TRUE); } #endif // HAVE_LIBPWMD } static void on_entry_std_changed (GtkEditable* editable, UgtkProxyForm* pform) { if (pform->changed.enable) { if (editable == GTK_EDITABLE (pform->host)) pform->changed.host = TRUE; else if (editable == GTK_EDITABLE (pform->port)) pform->changed.port = TRUE; else if (editable == GTK_EDITABLE (pform->user)) pform->changed.user = TRUE; else if (editable == GTK_EDITABLE (pform->password)) pform->changed.password = TRUE; } } // ---------------------------------------------------------------------------- // PWMD // #ifdef HAVE_LIBPWMD static void ugtk_proxy_form_pwmd_init (struct UgtkProxyFormPwmd* pfp, UgtkProxyForm* pform) { GtkGrid* grid; GtkWidget* widget; pfp->self = gtk_grid_new (); grid = (GtkGrid*) pfp->self; widget = gtk_label_new_with_mnemonic (_("Socket:")); pfp->socket = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pfp->socket), 16); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pfp->socket); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pfp->socket, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 0, 0, 1, 1); gtk_grid_attach (grid, pfp->socket, 1, 0, 4, 1); widget = gtk_label_new_with_mnemonic (_("Socket args:")); pfp->socket_args = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pfp->socket_args), 16); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pfp->socket_args); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pfp->socket_args, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 0, 1, 1, 1); gtk_grid_attach (grid, pfp->socket_args, 1, 1, 4, 1); widget = gtk_label_new_with_mnemonic (_("Element:")); pfp->element = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pfp->element), 16); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pfp->element); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pfp->element, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 3, 2, 1, 1); gtk_grid_attach (grid, pfp->element, 4, 2, 1, 1); widget = gtk_separator_new (GTK_ORIENTATION_VERTICAL); g_object_set (widget, "margin", 1, NULL); gtk_grid_attach (grid, widget, 2, 2, 1, 2); widget = gtk_label_new_with_mnemonic (_("File:")); pfp->file = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (pfp->file), 16); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), pfp->file); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 1, "margin-bottom", 1, NULL); g_object_set (pfp->file, "margin", 1, "hexpand", TRUE, NULL); gtk_grid_attach (grid, widget, 0, 2, 1, 1); gtk_grid_attach (grid, pfp->file, 1, 2, 1, 1); g_signal_connect (GTK_EDITABLE (pform->pwmd.socket), "changed", G_CALLBACK (on_entry_pwmd_changed), pform); g_signal_connect (GTK_EDITABLE (pform->pwmd.socket_args), "changed", G_CALLBACK (on_entry_pwmd_changed), pform); g_signal_connect (GTK_EDITABLE (pform->pwmd.file), "changed", G_CALLBACK (on_entry_pwmd_changed), pform); g_signal_connect (GTK_EDITABLE (pform->pwmd.element), "changed", G_CALLBACK (on_entry_pwmd_changed), pform); gtk_widget_show_all ((GtkWidget*) grid); gtk_widget_hide ((GtkWidget*) grid); } static void on_entry_pwmd_changed (GtkEditable* editable, UgtkProxyForm* pform) { if (pform->changed.enable) { if (editable == GTK_EDITABLE (pform->pwmd.socket)) pform->pwmd.changed.socket = TRUE; else if (editable == GTK_EDITABLE (pform->pwmd.socket_args)) pform->pwmd.changed.socket_args = TRUE; else if (editable == GTK_EDITABLE (pform->pwmd.file)) pform->pwmd.changed.file = TRUE; else if (editable == GTK_EDITABLE (pform->pwmd.element)) pform->pwmd.changed.element = TRUE; } } #endif // HAVE_LIBPWMD uget-2.2.2/ui-gtk/UgtkMenubar.c0000664000175000017500000007721113470304403013202 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #if defined _WIN32 || defined _WIN64 #include #include // ShellExecuteW() #endif #include #include #include #include #include #include #include #include // ---------------------------------------------------------------------------- // UgtkFileMenu static void on_create_download (GtkWidget* widget, UgtkApp* app) { ugtk_app_create_download (app, NULL, NULL); } static void on_offline_mode (GtkWidget* widget, UgtkApp* app) { UgetNode* cnode; gboolean offline; offline = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.offline_mode = offline; // trayicon menu offline = gtk_check_menu_item_get_active ( (GtkCheckMenuItem*) app->trayicon.menu.offline_mode); if (offline != app->setting.offline_mode) { gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.offline_mode, app->setting.offline_mode); } if (app->setting.offline_mode) { for (cnode = app->real.children; cnode; cnode = cnode->next) uget_app_stop_category ((UgetApp*)app, cnode); app->user_action = TRUE; } } // ---------------------------------------------------------------------------- // UgtkEditMenu static void on_clipboard_monitor (GtkWidget* widget, UgtkApp* app) { gboolean active; active = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.clipboard.monitor = active; app->trayicon.menu.emission = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.clipboard_monitor, active); app->trayicon.menu.emission = TRUE; } static void on_clipboard_quiet (GtkWidget* widget, UgtkApp* app) { gboolean active; active = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.clipboard.quiet = active; app->trayicon.menu.emission = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.clipboard_quiet, active); app->trayicon.menu.emission = TRUE; } static void on_commandline_quiet (GtkWidget* widget, UgtkApp* app) { gboolean active; active = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.commandline.quiet = active; app->trayicon.menu.emission = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.commandline_quiet, active); app->trayicon.menu.emission = TRUE; } static void on_skip_existing (GtkWidget* widget, UgtkApp* app) { gboolean active; active = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.ui.skip_existing = active; app->trayicon.menu.emission = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.skip_existing, active); app->trayicon.menu.emission = TRUE; } static void on_apply_recent (GtkWidget* widget, UgtkApp* app) { gboolean active; active = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.ui.apply_recent = active; app->trayicon.menu.emission = FALSE; gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->trayicon.menu.apply_recent, active); app->trayicon.menu.emission = TRUE; } static void on_config_completion (GtkWidget* widget, UgtkApp* app) { if (widget == app->menubar.edit.completion.disable) app->setting.completion.action = 0; else if (widget == app->menubar.edit.completion.hibernate) app->setting.completion.action = 1; else if (widget == app->menubar.edit.completion.suspend) app->setting.completion.action = 2; else if (widget == app->menubar.edit.completion.shutdown) app->setting.completion.action = 3; else if (widget == app->menubar.edit.completion.reboot) app->setting.completion.action = 4; else if (widget == app->menubar.edit.completion.custom) app->setting.completion.action = 5; } static void on_config_completion_remember (GtkWidget* widget, UgtkApp* app) { gboolean remember; remember = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); app->setting.completion.remember = remember; } static void on_config_completion_help (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/documentation/on-complete"); } static void on_config_settings (GtkWidget* widget, UgtkApp* app) { UgtkSettingDialog* sdialog; gchar* title; if (app->dialogs.setting) { gtk_window_present ((GtkWindow*) app->dialogs.setting); return; } title = g_strconcat (UGTK_APP_NAME " - ", _("Settings"), NULL); sdialog = ugtk_setting_dialog_new (title, app->window.self); g_free (title); ugtk_setting_dialog_set (sdialog, &app->setting); app->dialogs.setting = (GtkWidget*) sdialog->self; // set page // ugtk_setting_dialog_set_page (sdialog, UGTK_SETTING_PAGE_UI); // show settings dialog ugtk_setting_dialog_run (sdialog, app); } // ---------------------------------------------------------------------------- // UgtkViewMenu // static void on_change_visible_widget (GtkWidget* widget, UgtkApp* app) { struct UgtkWindowSetting* setting; GtkWidget* temp; gboolean visible; setting = &app->setting.window; visible = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); // Toolbar if (widget == app->menubar.view.toolbar) { setting->toolbar = visible; gtk_widget_set_visible (app->toolbar.self, visible); return; } // Statusbar if (widget == app->menubar.view.statusbar) { setting->statusbar = visible; gtk_widget_set_visible ((GtkWidget*) app->statusbar.self, visible); return; } // Category if (widget == app->menubar.view.category) { setting->category = visible; temp = gtk_paned_get_child1 (app->window.hpaned); gtk_widget_set_visible (temp, visible); return; } // Summary if (widget == app->menubar.view.summary) { setting->summary = visible; gtk_widget_set_visible (app->summary.self, visible); return; } } static void on_change_visible_summary (GtkWidget* widget, UgtkApp* app) { struct UgtkSummarySetting* setting; gboolean visible; setting = &app->setting.summary; visible = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); // which widget if (widget == app->menubar.view.summary_items.name) { setting->name = visible; app->summary.visible.name = visible; } else if (widget == app->menubar.view.summary_items.folder) { setting->folder = visible; app->summary.visible.folder = visible; } else if (widget == app->menubar.view.summary_items.category) { setting->category = visible; app->summary.visible.category = visible; } else if (widget == app->menubar.view.summary_items.uri) { setting->uri = visible; app->summary.visible.uri = visible; } else if (widget == app->menubar.view.summary_items.message) { setting->message = visible; app->summary.visible.message = visible; } ugtk_summary_show (&app->summary, app->traveler.download.cursor.node); } static void on_change_visible_column (GtkWidget* widget, UgtkApp* app) { struct UgtkDownloadColumnSetting* setting; UgtkTraveler* traveler; GtkTreeViewColumn* column; gboolean visible; gint column_index; setting = &app->setting.download_column; traveler = &app->traveler; visible = gtk_check_menu_item_get_active ((GtkCheckMenuItem*) widget); // which widget if (widget == app->menubar.view.columns.complete) { column_index = UGTK_NODE_COLUMN_COMPLETE; setting->complete = visible; } else if (widget == app->menubar.view.columns.total) { column_index = UGTK_NODE_COLUMN_TOTAL; setting->total = visible; } else if (widget == app->menubar.view.columns.percent) { column_index = UGTK_NODE_COLUMN_PERCENT; setting->percent = visible; } else if (widget == app->menubar.view.columns.elapsed) { column_index = UGTK_NODE_COLUMN_ELAPSED; setting->elapsed = visible; } else if (widget == app->menubar.view.columns.left) { column_index = UGTK_NODE_COLUMN_LEFT; setting->left = visible; } else if (widget == app->menubar.view.columns.speed) { column_index = UGTK_NODE_COLUMN_SPEED; setting->speed = visible; } else if (widget == app->menubar.view.columns.upload_speed) { column_index = UGTK_NODE_COLUMN_UPLOAD_SPEED; setting->upload_speed = visible; } else if (widget == app->menubar.view.columns.uploaded) { column_index = UGTK_NODE_COLUMN_UPLOADED; setting->uploaded = visible; } else if (widget == app->menubar.view.columns.ratio) { column_index = UGTK_NODE_COLUMN_RATIO; setting->ratio = visible; } else if (widget == app->menubar.view.columns.retry) { column_index = UGTK_NODE_COLUMN_RETRY; setting->retry = visible; } else if (widget == app->menubar.view.columns.category) { column_index = UGTK_NODE_COLUMN_CATEGORY; setting->category = visible; } else if (widget == app->menubar.view.columns.uri) { column_index = UGTK_NODE_COLUMN_URI; setting->uri = visible; } else if (widget == app->menubar.view.columns.added_on) { column_index = UGTK_NODE_COLUMN_ADDED_ON; setting->added_on = visible; } else if (widget == app->menubar.view.columns.completed_on) { column_index = UGTK_NODE_COLUMN_COMPLETED_ON; setting->completed_on = visible; } else return; column = gtk_tree_view_get_column (traveler->download.view, column_index); gtk_tree_view_column_set_visible (column, visible); } // ---------------------------------------------------------------------------- // UgtkCategoryMenu static void on_move_category_up (GtkWidget* widget, UgtkApp* app) { UgetNode* cnode; GtkTreeIter iter1, iter2; GtkTreePath *path1, *path2; cnode = app->traveler.category.cursor.node->base; if (cnode == NULL || cnode->prev == NULL) return; iter1.stamp = app->traveler.category.model->stamp; iter2.stamp = app->traveler.category.model->stamp; iter1.user_data = cnode; iter2.user_data = cnode->prev; uget_app_move_category ((UgetApp*) app, cnode, cnode->prev); ugtk_traveler_select_category (&app->traveler, app->traveler.category.cursor.pos -1, -1); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); // emit signal "row-changed" path1 = gtk_tree_model_get_path (GTK_TREE_MODEL (app->traveler.category.model), &iter1); path2 = gtk_tree_model_get_path (GTK_TREE_MODEL (app->traveler.category.model), &iter2); gtk_tree_model_row_changed (GTK_TREE_MODEL (app->traveler.category.model), path1, &iter1); gtk_tree_model_row_changed (GTK_TREE_MODEL (app->traveler.category.model), path2, &iter2); gtk_tree_path_free (path1); gtk_tree_path_free (path2); } static void on_move_category_down (GtkWidget* widget, UgtkApp* app) { UgetNode* cnode; GtkTreeIter iter1, iter2; GtkTreePath *path1, *path2; cnode = app->traveler.category.cursor.node->base; if (cnode == NULL || cnode->next == NULL) return; iter1.stamp = app->traveler.category.model->stamp; iter2.stamp = app->traveler.category.model->stamp; iter1.user_data = cnode; iter2.user_data = cnode->next; uget_app_move_category ((UgetApp*) app, cnode, cnode->next->next); ugtk_traveler_select_category (&app->traveler, app->traveler.category.cursor.pos +1, -1); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); // emit signal "row-changed" path1 = gtk_tree_model_get_path (GTK_TREE_MODEL (app->traveler.category.model), &iter1); path2 = gtk_tree_model_get_path (GTK_TREE_MODEL (app->traveler.category.model), &iter2); gtk_tree_model_row_changed (GTK_TREE_MODEL (app->traveler.category.model), path1, &iter1); gtk_tree_model_row_changed (GTK_TREE_MODEL (app->traveler.category.model), path2, &iter2); gtk_tree_path_free (path1); gtk_tree_path_free (path2); } static void on_delete_category (GtkWidget* widget, UgtkApp* app) { UgtkConfirmDialog* cdialog; // confirm to delete category cdialog = ugtk_confirm_dialog_new (UGTK_CONFIRM_DIALOG_DELETE_CATEGORY, app); ugtk_confirm_dialog_run (cdialog); } // ---------------------------------------------------------------------------- // UgtkDownloadMenu static void on_delete_download (GtkWidget* widget, UgtkApp* app) { ugtk_app_delete_download (app, FALSE); } static void on_delete_download_file (GtkWidget* widget, UgtkApp* app) { UgtkConfirmDialog* cdialog; if (app->setting.ui.delete_confirmation == FALSE) ugtk_app_delete_download (app, TRUE); else { // confirm to delete cdialog = ugtk_confirm_dialog_new(UGTK_CONFIRM_DIALOG_DELETE, app); ugtk_confirm_dialog_run (cdialog); } } static void on_open_download_file (GtkWidget* widget, UgtkApp* app) { UgetCommon* common; UgetNode* node; GtkWidget* dialog; gchar* string; node = app->traveler.download.cursor.node; if (node == NULL) return; common = ug_info_get (node->info, UgetCommonInfo); if (common == NULL || common->folder == NULL || common->file == NULL) return; if (ugtk_launch_default_app (common->folder, common->file) == FALSE) { string = g_strdup_printf (_("Can't launch default application for file '%s'."), common->file); dialog = gtk_message_dialog_new (app->window.self, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", string); g_free (string); string = g_strconcat (UGTK_APP_NAME " - ", _("Error"), NULL); gtk_window_set_title ((GtkWindow*) dialog, string); g_free (string); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show ((GtkWidget*) dialog); } } static void on_open_download_folder (GtkWidget* widget, UgtkApp* app) { UgetCommon* common; UgetNode* node; GtkWidget* dialog; gchar* string; node = app->traveler.download.cursor.node; if (node == NULL) return; common = ug_info_get (node->info, UgetCommonInfo); if (common == NULL || common->folder == NULL) return; string = g_filename_from_utf8 (common->folder, -1, NULL, NULL, NULL); if (g_file_test (string, G_FILE_TEST_EXISTS) == FALSE) { g_free (string); string = g_strdup_printf (_("'%s' - This folder does not exist."), common->folder); dialog = gtk_message_dialog_new (app->window.self, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", string); g_free (string); string = g_strconcat (UGTK_APP_NAME " - ", _("Error"), NULL); gtk_window_set_title ((GtkWindow*) dialog, string); g_free (string); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show ((GtkWidget*) dialog); return; } g_free (string); #if defined _WIN32 || defined _WIN64 { UgUri uuri; gchar* path; gchar* argument; gunichar2* argument_os; if (common->file == NULL && common->uri) { ug_uri_init (&uuri, common->uri); if (uuri.file == -1) argument = NULL; else { argument = g_strndup (uuri.uri + uuri.file, ug_uri_file (&uuri, NULL)); } path = g_build_filename (common->folder, argument, NULL); g_free (argument); } else path = g_build_filename (common->folder, common->file, NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) argument = g_strconcat ("/e,/select,\"", path, "\"", NULL); else argument = g_strconcat ("/e,\"", common->folder, "\"", NULL); g_free (path); argument_os = g_utf8_to_utf16 (argument, -1, NULL, NULL, NULL); g_free (argument); ShellExecuteW (NULL, NULL, L"explorer", argument_os, NULL, SW_SHOW); g_free (argument_os); } #else { GError* error = NULL; GFile* gfile; gchar* uri; gfile = g_file_new_for_path (common->folder); uri = g_file_get_uri (gfile); g_object_unref (gfile); g_app_info_launch_default_for_uri (uri, NULL, &error); g_free (uri); if (error) g_error_free (error); } #endif } static void on_set_download_force_start (GtkWidget* widget, UgtkApp* app) { UgetNode* node; UgetNode* cursor; GList* list; GList* link; list = ugtk_traveler_get_selected (&app->traveler); cursor = app->traveler.download.cursor.node->base; for (link = list; link; link = link->next) { node = link->data; node = node->base; link->data = node; uget_app_activate_download ((UgetApp*) app, node->base); } if (app->traveler.state.cursor.pos == 0) { ugtk_traveler_set_cursor (&app->traveler, cursor); ugtk_traveler_set_selected (&app->traveler, list); } g_list_free (list); // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); // ugtk_summary_show (&app->summary, app->traveler.download.cursor.node); } static void on_set_download_runnable (GtkWidget* widget, UgtkApp* app) { ugtk_app_queue_download (app, TRUE); } // UgtkMenubar.download.move_to static void on_move_download (GtkWidget* widget, UgtkApp* app) { GPtrArray* array; UgetNode* cnode; UgetNode* dnode; GList* list; GList* link; guint index; array = app->menubar.download.move_to.array; cnode = NULL; for (index = 0; index < array->len; index += 2) { if (widget == g_ptr_array_index (array, index)) { cnode = g_ptr_array_index (array, index + 1); break; } } if (cnode == NULL || cnode == app->traveler.category.cursor.node->base) return; // if current category is "All" if (app->traveler.category.cursor.pos == 0) ugtk_traveler_reserve_selection (&app->traveler); list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { dnode = link->data; dnode = dnode->base; uget_app_move_download_to ((UgetApp*) app, dnode, cnode->base); } g_list_free (list); // refresh gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); // if current category is "All" if (app->traveler.category.cursor.pos == 0) ugtk_traveler_restore_selection (&app->traveler); } // UgtkMenubar.download.prioriy static void on_set_download_prioriy (GtkWidget* widget, UgtkApp* app) { UgetPriority priority; UgetRelation* relation; UgetNode* node; GList* list; GList* link; if (widget == app->menubar.download.prioriy.high) priority = UGET_PRIORITY_HIGH; else if (widget == app->menubar.download.prioriy.normal) priority = UGET_PRIORITY_NORMAL; else priority = UGET_PRIORITY_LOW; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; relation = ug_info_realloc (node->info, UgetRelationInfo); relation->priority = priority; } g_list_free (list); } // ---------------------------------------------------------------------------- // UgtkHelpMenu // static void on_help_online (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/help"); } static void on_documentation (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/documentation"); } static void on_support_forum (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/forum/"); } static void on_submit_feedback (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/feedback"); } static void on_report_bug (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/reportbug"); } static void on_keyboard_shortcuts (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/keyboard-shortcuts"); } static void on_check_updates (GtkWidget* widget, UgtkApp* app) { ugtk_launch_uri ("http://ugetdm.com/versioncheck?v=" PACKAGE_VERSION); } static void on_about (GtkWidget* widget, UgtkApp* app) { UgtkAboutDialog* adialog; adialog = ugtk_about_dialog_new (app->window.self); // if (app->update_info.ready) // ugtk_about_dialog_set_info (adialog, app->update_info.text->str); ugtk_about_dialog_run (adialog); } // ---------------------------------------------------------------------------- // UgtkMenubar void ugtk_menubar_init_callback (UgtkMenubar* menubar, UgtkApp* app) { // ---------------------------------------------------- // UgtkFileMenu g_signal_connect (menubar->file.create_download, "activate", G_CALLBACK (on_create_download), app); g_signal_connect_swapped (menubar->file.create_category, "activate", G_CALLBACK (ugtk_app_create_category), app); g_signal_connect_swapped (menubar->file.create_torrent, "activate", G_CALLBACK (ugtk_app_create_torrent), app); g_signal_connect_swapped (menubar->file.create_metalink, "activate", G_CALLBACK (ugtk_app_create_metalink), app); g_signal_connect_swapped (menubar->file.batch.clipboard, "activate", G_CALLBACK (ugtk_app_clipboard_batch), app); g_signal_connect_swapped (menubar->file.batch.sequence, "activate", G_CALLBACK (ugtk_app_sequence_batch), app); g_signal_connect_swapped (menubar->file.batch.text_import, "activate", G_CALLBACK (ugtk_app_import_text_file), app); g_signal_connect_swapped (menubar->file.batch.html_import, "activate", G_CALLBACK (ugtk_app_import_html_file), app); g_signal_connect_swapped (menubar->file.batch.text_export, "activate", G_CALLBACK (ugtk_app_export_text_file), app); g_signal_connect_swapped (menubar->file.open_category, "activate", G_CALLBACK (ugtk_app_load_category), app); g_signal_connect_swapped (menubar->file.save_category, "activate", G_CALLBACK (ugtk_app_save_category), app); g_signal_connect_swapped (menubar->file.save, "activate", G_CALLBACK (ugtk_app_save), app); g_signal_connect (menubar->file.offline_mode, "toggled", G_CALLBACK (on_offline_mode), app); g_signal_connect_swapped (menubar->file.quit, "activate", G_CALLBACK (ugtk_app_decide_to_quit), app); // ---------------------------------------------------- // UgtkEditMenu g_signal_connect (menubar->edit.clipboard_monitor, "activate", G_CALLBACK (on_clipboard_monitor), app); g_signal_connect (menubar->edit.clipboard_quiet, "activate", G_CALLBACK (on_clipboard_quiet), app); g_signal_connect (menubar->edit.commandline_quiet, "activate", G_CALLBACK (on_commandline_quiet), app); g_signal_connect (menubar->edit.skip_existing, "activate", G_CALLBACK (on_skip_existing), app); g_signal_connect (menubar->edit.apply_recent, "activate", G_CALLBACK (on_apply_recent), app); g_signal_connect (menubar->edit.completion.disable, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.hibernate, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.suspend, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.shutdown, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.reboot, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.custom, "activate", G_CALLBACK (on_config_completion), app); g_signal_connect (menubar->edit.completion.remember, "activate", G_CALLBACK (on_config_completion_remember), app); g_signal_connect (menubar->edit.completion.help, "activate", G_CALLBACK (on_config_completion_help), app); g_signal_connect (menubar->edit.settings, "activate", G_CALLBACK (on_config_settings), app); // ---------------------------------------------------- // UgtkViewMenu g_signal_connect (menubar->view.toolbar, "toggled", G_CALLBACK (on_change_visible_widget), app); g_signal_connect (menubar->view.statusbar, "toggled", G_CALLBACK (on_change_visible_widget), app); g_signal_connect (menubar->view.category, "toggled", G_CALLBACK (on_change_visible_widget), app); g_signal_connect (menubar->view.summary, "toggled", G_CALLBACK (on_change_visible_widget), app); // summary items g_signal_connect (menubar->view.summary_items.name, "toggled", G_CALLBACK (on_change_visible_summary), app); g_signal_connect (menubar->view.summary_items.folder, "toggled", G_CALLBACK (on_change_visible_summary), app); g_signal_connect (menubar->view.summary_items.category, "toggled", G_CALLBACK (on_change_visible_summary), app); g_signal_connect (menubar->view.summary_items.uri, "toggled", G_CALLBACK (on_change_visible_summary), app); g_signal_connect (menubar->view.summary_items.message, "toggled", G_CALLBACK (on_change_visible_summary), app); // download columns g_signal_connect (menubar->view.columns.complete, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.total, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.percent, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.elapsed, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.left, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.speed, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.upload_speed, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.uploaded, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.ratio, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.retry, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.category, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.uri, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.added_on, "toggled", G_CALLBACK (on_change_visible_column), app); g_signal_connect (menubar->view.columns.completed_on, "toggled", G_CALLBACK (on_change_visible_column), app); // ---------------------------------------------------- // UgtkCategoryMenu g_signal_connect_swapped (menubar->category.create, "activate", G_CALLBACK (ugtk_app_create_category), app); g_signal_connect (menubar->category.delete, "activate", G_CALLBACK (on_delete_category), app); g_signal_connect_swapped (menubar->category.properties, "activate", G_CALLBACK (ugtk_app_edit_category), app); g_signal_connect (menubar->category.move_up, "activate", G_CALLBACK (on_move_category_up), app); g_signal_connect (menubar->category.move_down, "activate", G_CALLBACK (on_move_category_down), app); // ---------------------------------------------------- // UgtkDownloadMenu g_signal_connect (menubar->download.create, "activate", G_CALLBACK (on_create_download), app); g_signal_connect (menubar->download.delete, "activate", G_CALLBACK (on_delete_download), app); // file & folder g_signal_connect (menubar->download.delete_file, "activate", G_CALLBACK (on_delete_download_file), app); g_signal_connect (menubar->download.open, "activate", G_CALLBACK (on_open_download_file), app); g_signal_connect (menubar->download.open_folder, "activate", G_CALLBACK (on_open_download_folder), app); // change status g_signal_connect (menubar->download.force_start, "activate", G_CALLBACK (on_set_download_force_start), app); g_signal_connect (menubar->download.runnable, "activate", G_CALLBACK (on_set_download_runnable), app); g_signal_connect_swapped (menubar->download.pause, "activate", G_CALLBACK (ugtk_app_pause_download), app); // move g_signal_connect_swapped (menubar->download.move_up, "activate", G_CALLBACK (ugtk_app_move_download_up), app); g_signal_connect_swapped (menubar->download.move_down, "activate", G_CALLBACK (ugtk_app_move_download_down), app); g_signal_connect_swapped (menubar->download.move_top, "activate", G_CALLBACK (ugtk_app_move_download_top), app); g_signal_connect_swapped (menubar->download.move_bottom, "activate", G_CALLBACK (ugtk_app_move_download_bottom), app); // prioriy g_signal_connect (menubar->download.prioriy.high, "activate", G_CALLBACK (on_set_download_prioriy), app); g_signal_connect (menubar->download.prioriy.normal, "activate", G_CALLBACK (on_set_download_prioriy), app); g_signal_connect (menubar->download.prioriy.low, "activate", G_CALLBACK (on_set_download_prioriy), app); // properties g_signal_connect_swapped (menubar->download.properties, "activate", G_CALLBACK (ugtk_app_edit_download), app); // ---------------------------------------------------- // UgtkHelpMenu g_signal_connect (menubar->help.help_online, "activate", G_CALLBACK (on_help_online), app); g_signal_connect (menubar->help.documentation, "activate", G_CALLBACK (on_documentation), app); g_signal_connect (menubar->help.support_forum, "activate", G_CALLBACK (on_support_forum), app); g_signal_connect (menubar->help.submit_feedback, "activate", G_CALLBACK (on_submit_feedback), app); g_signal_connect (menubar->help.report_bug, "activate", G_CALLBACK (on_report_bug), app); g_signal_connect (menubar->help.keyboard_shortcuts, "activate", G_CALLBACK (on_keyboard_shortcuts), app); g_signal_connect (menubar->help.check_updates, "activate", G_CALLBACK (on_check_updates), app); g_signal_connect (menubar->help.about_uget, "activate", G_CALLBACK (on_about), app); } void ugtk_menubar_sync_category (UgtkMenubar* menubar, UgtkApp* app, gboolean reset) { UgetNode* cnode; UgetCommon* common; GtkWidget* menu_item; GtkWidget* image; GPtrArray* array; guint index; array = menubar->download.move_to.array; if (reset) { // remove all item for (index = 0; index < array->len; index += 2) { menu_item = g_ptr_array_index (array, index); gtk_container_remove ( (GtkContainer*) menubar->download.move_to.self, menu_item); } g_ptr_array_set_size (array, 0); // add new item for (cnode = app->real.children; cnode; cnode = cnode->next) { // create menu item common = ug_info_get(cnode->info, UgetCommonInfo); if (common && common->name) menu_item = gtk_image_menu_item_new_with_label (common->name); else menu_item = gtk_image_menu_item_new_with_label (""); image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image ((GtkImageMenuItem*) menu_item, image); gtk_menu_shell_append ( GTK_MENU_SHELL (app->menubar.download.move_to.self), menu_item); g_signal_connect (menu_item, "activate", G_CALLBACK (on_move_download), app); gtk_widget_show (menu_item); g_ptr_array_add (array, menu_item); g_ptr_array_add (array, cnode); } } // set sensitive for (index = 0; index < array->len; index += 2) { menu_item = g_ptr_array_index (array, index); cnode = g_ptr_array_index (array, index +1); if (cnode == app->traveler.category.cursor.node->base) gtk_widget_set_sensitive (menu_item, FALSE); else gtk_widget_set_sensitive (menu_item, TRUE); } } uget-2.2.2/ui-gtk/UgtkScheduleForm.c0000664000175000017500000003603513470304403014170 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #define COLOR_DISABLE_R 0.5 #define COLOR_DISABLE_G 0.5 #define COLOR_DISABLE_B 0.5 static const gdouble colors[UGTK_SCHEDULE_N_STATE][3] = { {1.0, 1.0, 1.0}, // UGTK_SCHEDULE_TURN_OFF {1.0, 0.752, 0.752}, // UGTK_SCHEDULE_UPLOAD_ONLY - reserve {0.552, 0.807, 0.552}, // UGTK_SCHEDULE_LIMITED_SPEED // {0.0, 0.658, 0.0}, // UGTK_SCHEDULE_NORMAL {0.0, 0.758, 0.0}, // UGTK_SCHEDULE_NORMAL }; static const gchar* week_days[7] = { N_("Mon"), N_("Tue"), N_("Wed"), N_("Thu"), N_("Fri"), N_("Sat"), N_("Sun"), }; // UgtkGrid static struct { int width; int height; int width_and_line; int height_and_line; int width_all; int height_all; } UgtkGrid; static void ugtk_grid_global_init (int width, int height); static GtkWidget* ugtk_grid_new (const gdouble* rgb_array); static gboolean ugtk_grid_draw (GtkWidget* widget, cairo_t* cr, const gdouble* rgb_array); // signal handler static void on_enable_toggled (GtkToggleButton* togglebutton, struct UgtkScheduleForm* sform); static gboolean on_draw_callback (GtkWidget* widget, cairo_t* cr, struct UgtkScheduleForm* sform); static gboolean on_button_press_event (GtkWidget* widget, GdkEventMotion* event, struct UgtkScheduleForm* sform); static gboolean on_motion_notify_event (GtkWidget* widget, GdkEventMotion* event, struct UgtkScheduleForm* sform); static gboolean on_leave_notify_event (GtkWidget* menu, GdkEventCrossing* event, struct UgtkScheduleForm* sform); void ugtk_schedule_form_init (struct UgtkScheduleForm* sform) { PangoContext* context; PangoLayout* layout; GtkWidget* widget; GtkGrid* caption; GtkBox* hbox; GtkBox* vbox; int text_width, text_height; sform->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox = (GtkBox*) sform->self; // Enable Scheduler hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*)hbox, FALSE, FALSE, 2); widget = gtk_check_button_new_with_mnemonic (_("_Enable Scheduler")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); gtk_box_pack_start (hbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 2); g_signal_connect (widget, "toggled", G_CALLBACK (on_enable_toggled), sform); sform->enable = widget; // initialize UgtkGrid context = gtk_widget_get_pango_context (widget); layout = pango_layout_new (context); pango_layout_set_text (layout, gettext (week_days[0]), -1); pango_layout_get_pixel_size (layout, &text_width, &text_height); g_object_unref (layout); ugtk_grid_global_init (text_height, text_height + 2); // drawing area widget = gtk_drawing_area_new (); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 2); // gtk_widget_set_has_window (widget, FALSE); gtk_widget_set_size_request (widget, UgtkGrid.width_all + text_width + 32, UgtkGrid.height_all); gtk_widget_add_events (widget, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect (widget, "draw", G_CALLBACK (on_draw_callback), sform); g_signal_connect (widget, "button-press-event", G_CALLBACK (on_button_press_event), sform); g_signal_connect (widget, "motion-notify-event", G_CALLBACK (on_motion_notify_event), sform); g_signal_connect (widget, "leave-notify-event", G_CALLBACK (on_leave_notify_event), sform); sform->drawing = widget; // grid for tips, SpinButton sform->caption = gtk_grid_new (); gtk_box_pack_start (vbox, sform->caption, FALSE, FALSE, 2); // gtk_container_set_border_width (GTK_CONTAINER (sform->caption), 10); caption = (GtkGrid*) sform->caption; // time tips widget = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (widget), (gfloat)0.4, (gfloat)0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 0, 0, 5, 1); sform->time_tips = GTK_LABEL (widget); // Turn off widget = ugtk_grid_new (colors[UGTK_SCHEDULE_TURN_OFF]); g_object_set (widget, "margin", 3, NULL); gtk_grid_attach (caption, widget, 0, 1, 1, 1); // Turn off - label widget = gtk_label_new (_("Turn off")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 1, 1, 1, 1); // Turn off - help label widget = gtk_label_new (_("- stop all task")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 2, 1, 2, 1); // Normal widget = ugtk_grid_new (colors[UGTK_SCHEDULE_NORMAL]); g_object_set (widget, "margin", 3, NULL); gtk_grid_attach (caption, widget, 0, 2, 1, 1); // Normal - label widget = gtk_label_new (_("Normal")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 1, 2, 1, 1); // Normal - help label widget = gtk_label_new (_("- run task normally")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 2, 2, 2, 1); /* // Speed limit widget = ugtk_grid_new (colors[UGTK_SCHEDULE_LIMITED_SPEED]); g_object_set (widget, "margin", 3, NULL); gtk_grid_attach (caption, widget, 0, 3, 1, 1); // Speed limit - label widget = gtk_label_new (_("Limited speed")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 1, 3, 1, 1); // Speed limit - SpinButton widget = gtk_spin_button_new_with_range (5, 99999999, 1); g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 2, 3, 1, 1); sform->spin_speed = (GtkSpinButton*) widget; // Speed limit - KiB/s label widget = gtk_label_new (_("KiB/s")); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); // left, center g_object_set (widget, "margin", 2, NULL); gtk_grid_attach (caption, widget, 3, 3, 1, 1); */ // change sensitive state gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sform->enable), FALSE); gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (sform->enable)); gtk_widget_show_all (sform->self); } void ugtk_schedule_form_get (struct UgtkScheduleForm* sform, UgtkSetting* setting) { // gint value; memcpy (setting->scheduler.state.at, sform->state, sizeof (sform->state)); setting->scheduler.enable = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (sform->enable)); // value = gtk_spin_button_get_value_as_int (sform->spin_speed); // setting->scheduler.speed_limit = value * 1024; } void ugtk_schedule_form_set (struct UgtkScheduleForm* sform, UgtkSetting* setting) { // gint value; memcpy (sform->state, setting->scheduler.state.at, sizeof (sform->state)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sform->enable), setting->scheduler.enable); gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (sform->enable)); // value = setting->scheduler.speed_limit / 1024; // gtk_spin_button_set_value (sform->spin_speed, value); } // ---------------------------------------------------------------------------- // signal handler // static void on_enable_toggled (GtkToggleButton* togglebutton, struct UgtkScheduleForm* sform) { gboolean active; active = gtk_toggle_button_get_active (togglebutton); gtk_widget_set_sensitive (sform->drawing, active); gtk_widget_set_sensitive (sform->caption, active); } static gboolean on_draw_callback (GtkWidget* widget, cairo_t* cr, struct UgtkScheduleForm* sform) { gboolean sensitive; gint y, x; gdouble cy, cx, ox; PangoContext* context; PangoLayout* layout; PangoFontDescription* desc; cairo_set_line_width (cr, 1); sensitive = gtk_widget_get_sensitive (widget); // setup Pango context = gtk_widget_get_pango_context (widget); desc = pango_context_get_font_description (context); layout = pango_cairo_create_layout (cr); pango_layout_set_font_description (layout, desc); // week days // ox = x offset for (ox = 0, cy = 0.5, y = 0; y < 7; y++, cy+=UgtkGrid.height_and_line) { cairo_move_to (cr, 1, cy); pango_layout_set_text (layout, gettext (week_days[y]), -1); pango_cairo_update_layout (cr, layout); pango_cairo_show_layout (cr, layout); // pango_layout_get_size (layout, &x, NULL); // x /= PANGO_SCALE; pango_layout_get_pixel_size (layout, &x, NULL); if (x + 4 > ox) ox = x + 4; } g_object_unref (layout); if (sform->drawing_offset == 0) sform->drawing_offset = ox; // draw grid columns for (cx = 0.5; cx <= UgtkGrid.width_all; cx += UgtkGrid.width_and_line) { cairo_move_to (cr, ox + cx, 0 + 0.5); cairo_line_to (cr, ox + cx, UgtkGrid.height_all - 1.0 + 0.5); } // draw grid rows for (cy = 0.5; cy <= UgtkGrid.height_all; cy += UgtkGrid.height_and_line) { cairo_move_to (cr, ox + 0.5, cy); cairo_line_to (cr, ox + UgtkGrid.width_all - 1.0 + 0.5, cy); } cairo_stroke (cr); // fill grid if (sensitive == FALSE) { cairo_set_source_rgb (cr, COLOR_DISABLE_R, COLOR_DISABLE_G, COLOR_DISABLE_B); } for (cy = 1.5, y = 0; y < 7; y++, cy+=UgtkGrid.height_and_line) { for (cx = 1.5+ox, x = 0; x < 24; x++, cx+=UgtkGrid.width_and_line) { if (sensitive) { cairo_set_source_rgb (cr, colors [sform->state[y][x]][0], colors [sform->state[y][x]][1], colors [sform->state[y][x]][2]); } cairo_rectangle (cr, cx, cy, UgtkGrid.width - 0.5, UgtkGrid.height - 0.5); cairo_fill (cr); } } return FALSE; } static gboolean on_button_press_event (GtkWidget *widget, GdkEventMotion *event, struct UgtkScheduleForm* sform) { gint x, y; cairo_t* cr; UgtkScheduleState state; x = (event->x - sform->drawing_offset) / UgtkGrid.width_and_line; y = event->y / UgtkGrid.height_and_line; if (x < 0 || y < 0 || x >= 24 || y >= 7) return FALSE; state = (sform->state[y][x] == UGTK_SCHEDULE_TURN_OFF) ? UGTK_SCHEDULE_NORMAL : UGTK_SCHEDULE_TURN_OFF; // state = sform->state[y][x] + 1; // if (state == UGTK_SCHEDULE_UPLOAD_ONLY) // state++; // if (state > UGTK_SCHEDULE_NORMAL) // state = UGTK_SCHEDULE_TURN_OFF; sform->state[y][x] = state; sform->last_state = state; // cairo cr = gdk_cairo_create (gtk_widget_get_window (widget)); cairo_set_source_rgb (cr, colors [state][0], colors [state][1], colors [state][2]); cairo_rectangle (cr, (gdouble)x * UgtkGrid.width_and_line + 1.0 + 0.5 + sform->drawing_offset, (gdouble)y * UgtkGrid.height_and_line + 1.0 + 0.5, UgtkGrid.width - 0.5, UgtkGrid.height - 0.5); cairo_fill (cr); cairo_destroy (cr); return TRUE; } static gboolean on_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, struct UgtkScheduleForm* sform) { gint x, y; gchar* string; cairo_t* cr; GdkWindow* gdkwin; GdkModifierType mod; UgtkScheduleState state; gdkwin = gtk_widget_get_window (widget); gdk_window_get_device_position (gdkwin, event->device, &x, &y, &mod); x -= sform->drawing_offset; x /= UgtkGrid.width_and_line; y /= UgtkGrid.height_and_line; if (x < 0 || y < 0 || x >= 24 || y >= 7) { // clear time_tips gtk_label_set_text (sform->time_tips, ""); return FALSE; } // update time_tips string = g_strdup_printf ("%s, %.2d:00 - %.2d:59", gettext (week_days[y]), x, x); gtk_label_set_text (sform->time_tips, string); g_free (string); // if no button press if ((mod & GDK_BUTTON1_MASK) == 0) return FALSE; state = sform->last_state; sform->state[y][x] = state; // cairo cr = gdk_cairo_create (gdkwin); cairo_rectangle (cr, sform->drawing_offset, 0, UgtkGrid.width_all, UgtkGrid.height_all); cairo_clip (cr); cairo_set_source_rgb (cr, colors [state][0], colors [state][1], colors [state][2]); cairo_rectangle (cr, (gdouble)x * UgtkGrid.width_and_line + 1.0 + 0.5 + sform->drawing_offset, (gdouble)y * UgtkGrid.height_and_line + 1.0 + 0.5, UgtkGrid.width - 0.5, UgtkGrid.height - 0.5); cairo_fill (cr); cairo_destroy (cr); return TRUE; } static gboolean on_leave_notify_event (GtkWidget* menu, GdkEventCrossing* event, struct UgtkScheduleForm* sform) { gtk_label_set_text (sform->time_tips, ""); return TRUE; } // ---------------------------------------------------------------------------- // UgtkGrid // static void ugtk_grid_global_init (int width, int height) { UgtkGrid.width = width; UgtkGrid.height = height; UgtkGrid.width_and_line = UgtkGrid.width + 1; UgtkGrid.height_and_line = UgtkGrid.height + 1; UgtkGrid.width_all = UgtkGrid.width_and_line * 24 + 1; UgtkGrid.height_all = UgtkGrid.height_and_line * 7 + 1; } static GtkWidget* ugtk_grid_new (const gdouble* rgb_array) { GtkWidget* widget; widget = gtk_drawing_area_new (); gtk_widget_set_size_request (widget, UgtkGrid.width + 2, UgtkGrid.height + 2); gtk_widget_add_events (widget, GDK_POINTER_MOTION_MASK); g_signal_connect (widget, "draw", G_CALLBACK (ugtk_grid_draw), (gpointer) rgb_array); return widget; } static gboolean ugtk_grid_draw (GtkWidget* widget, cairo_t* cr, const gdouble* rgb_array) { GtkAllocation allocation; gdouble x, y, width, height; gtk_widget_get_allocation (widget, &allocation); x = 0.5; y = 0.5; width = (gdouble) (allocation.width - 1); height = (gdouble) (allocation.height - 1); cairo_set_line_width (cr, 1); cairo_rectangle (cr, x, y, width, height); cairo_stroke (cr); if (gtk_widget_get_sensitive (widget)) { cairo_set_source_rgb (cr, rgb_array [0], rgb_array [1], rgb_array [2]); } else { cairo_set_source_rgb (cr, COLOR_DISABLE_R, COLOR_DISABLE_G, COLOR_DISABLE_B); } cairo_rectangle (cr, x + 1.0, y + 1.0, width - 2.0, height - 2.0); cairo_fill (cr); return FALSE; } uget-2.2.2/ui-gtk/UgtkDownloadForm.h0000664000175000017500000001105013470304403014176 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_DOWNLOAD_FORM_H #define UGTK_DOWNLOAD_FORM_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkDownloadForm UgtkDownloadForm; typedef struct UgtkSetting UgtkSetting; struct UgtkDownloadForm { GtkWindow* parent; // parent window of UgtkDownloadForm.self // ---------------------------------------------------- // Page 1 // GtkWidget* page1; GtkWidget* uri_label; GtkWidget* uri_entry; // GtkWidget* url_button; GtkWidget* mirrors_label; GtkWidget* mirrors_entry; // GtkWidget* mirror_button; GtkWidget* file_label; GtkWidget* file_entry; // GtkWidget* file_button; GtkWidget* folder_combo; GtkWidget* folder_entry; // GtkWidget* folder_button; // GtkWidget* referrer_label; GtkWidget* referrer_entry; // widgets for login fields // GtkWidget* username_label; GtkWidget* username_entry; // GtkWidget* password_label; GtkWidget* password_entry; // widgets for Status GtkWidget* radio_runnable; GtkWidget* radio_pause; // Connections per server GtkWidget* title_connections; GtkWidget* label_connections; GtkWidget* spin_connections; // connections // ---------------------------------------------------- // Page 2 // GtkWidget* page2; GtkWidget* cookie_label; GtkWidget* cookie_entry; GtkWidget* post_label; GtkWidget* post_entry; GtkWidget* agent_label; // user agent GtkWidget* agent_entry; GtkSpinButton* spin_download_speed; GtkSpinButton* spin_upload_speed; // GtkWidget* spin_parts; // GtkWidget* spin_redirect; GtkWidget* spin_retry; // counts GtkWidget* spin_delay; // seconds GtkToggleButton* timestamp; // ---------------------------------------------------- // User changed entry // struct UgtkDownloadFormChanged { gboolean enable:1; gboolean uri:1; gboolean mirrors:1; gboolean file:1; gboolean folder:1; gboolean user:1; gboolean password:1; gboolean referrer:1; gboolean cookie:1; gboolean post:1; gboolean agent:1; gboolean retry:1; // spin_retry gboolean delay:1; // spin_delay gboolean connections:1; // spin_connections gboolean max_upload_speed:1; // spin_upload_speed gboolean max_download_speed:1; // spin_download_speed gboolean timestamp:1; } changed; gboolean completed:1; }; void ugtk_download_form_init (UgtkDownloadForm* dform, UgtkProxyForm* proxy, GtkWindow* parent); void ugtk_download_form_get (UgtkDownloadForm* dform, UgInfo* info); void ugtk_download_form_set (UgtkDownloadForm* dform, UgInfo* info, gboolean keep_changed); void ugtk_download_form_set_multiple (UgtkDownloadForm* dform, gboolean multiple_mode); void ugtk_download_form_set_folders (UgtkDownloadForm* dform, UgtkSetting* setting); void ugtk_download_form_get_folders (UgtkDownloadForm* dform, UgtkSetting* setting); void ugtk_download_form_complete_entry (UgtkDownloadForm* dform); #ifdef __cplusplus } #endif #endif // End of UGTK_DOWNLOAD_FORM_H uget-2.2.2/ui-gtk/UgtkApp.c0000664000175000017500000017631513470304403012336 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ugtk_app_init (UgtkApp* app, UgetRpc* rpc) { char* dir; app->rpc = rpc; uget_app_init ((UgetApp*) app); // set application config directory for each user dir = g_build_filename (ugtk_get_config_dir (), UGTK_APP_DIR, NULL); uget_app_set_config_dir ((UgetApp*) app, dir); g_free (dir); app->rss_builtin = uget_rss_new (); ugtk_app_load (app); ugtk_app_init_ui (app); ugtk_app_init_callback (app); if (app->real.n_children == 0) ugtk_app_add_default_category (app); // clipboard ugtk_clipboard_init (&app->clipboard, app->setting.clipboard.pattern); // plug-in initialize uget_plugin_global_set(UgetPluginCurlInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); uget_plugin_global_set(UgetPluginMegaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) TRUE); // apply UgtkSetting ugtk_app_set_plugin_setting (app, &app->setting); ugtk_app_set_window_setting (app, &app->setting); ugtk_app_set_column_setting (app, &app->setting); ugtk_app_set_other_setting (app, &app->setting); ugtk_app_set_ui_setting (app, &app->setting); ugtk_tray_icon_set_info (&app->trayicon, 0, 0, 0); ugtk_statusbar_set_speed (&app->statusbar, 0, 0); ugtk_menubar_sync_category (&app->menubar, app, TRUE); app->recent.category_index = 0; app->recent.info = ug_info_new(8, 0); // RSS uget_rss_add_builtin (app->rss_builtin, UGET_RSS_STABLE); uget_rss_add_builtin (app->rss_builtin, UGET_RSS_NEWS); uget_rss_add_builtin (app->rss_builtin, UGET_RSS_TUTORIALS); uget_rss_update (app->rss_builtin, FALSE); gtk_widget_hide (app->banner.self); uget_app_use_uri_hash ((UgetApp*) app); ugtk_app_init_timeout (app); if (app->setting.ui.start_in_tray) ugtk_tray_icon_set_visible (&app->trayicon, TRUE); else gtk_widget_show ((GtkWidget*) app->window.self); // offline if (app->setting.ui.start_in_offline_mode) g_signal_emit_by_name (app->menubar.file.offline_mode, "activate"); } void ugtk_app_final (UgtkApp* app) { int shutdown_now; uget_app_set_notification ((UgetApp*) app, NULL, NULL, NULL, NULL); if (app->setting.plugin_order >= UGTK_PLUGIN_ORDER_ARIA2) shutdown_now = app->setting.aria2.shutdown; else shutdown_now = FALSE; ug_info_unref(app->recent.info); uget_rss_unref (app->rss_builtin); uget_app_final ((UgetApp*) app); // plug-in finalize uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN_NOW, (void*)(intptr_t) shutdown_now); uget_plugin_global_set(UgetPluginCurlInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); uget_plugin_global_set(UgetPluginMegaInfo, UGET_PLUGIN_GLOBAL_INIT, (void*) FALSE); } void ugtk_app_save (UgtkApp* app) { gchar* file; if (app->config_dir == NULL) return; ug_create_dir_all (app->config_dir, -1); file = g_build_filename (app->config_dir, "Setting.json", NULL); ugtk_setting_save (&app->setting, file); g_free (file); // RSS file = g_build_filename (app->config_dir, "RSS-built-in.json", NULL); uget_rss_save_feeds (app->rss_builtin, file); g_free (file); // uget_app_save_categories ((UgetApp*) app, ugtk_get_config_dir ()); uget_app_save_categories ((UgetApp*) app, NULL); } void ugtk_app_load (UgtkApp* app) { int counts; gchar* file; // load setting ugtk_setting_init (&app->setting); file = g_build_filename (app->config_dir, "Setting.json", NULL); counts = ugtk_setting_load (&app->setting, file); g_free (file); if (counts == FALSE) ugtk_setting_reset (&app->setting); else if (app->setting.scheduler.state.length < 7*24) { ug_array_alloc (&app->setting.scheduler.state, 7*24 - app->setting.scheduler.state.length); } // RSS file = g_build_filename (app->config_dir, "RSS-built-in.json", NULL); uget_rss_load_feeds (app->rss_builtin, file); g_free (file); // uget_app_load_categories ((UgetApp*) app, ugtk_get_config_dir ()); counts = uget_app_load_categories ((UgetApp*) app, NULL); if (counts == 0) ugtk_app_add_default_category (app); } void ugtk_app_quit (UgtkApp* app) { // stop all tasks uget_task_remove_all (&app->task); // sync setting and save data ugtk_app_get_window_setting (app, &app->setting); ugtk_app_get_column_setting (app, &app->setting); ugtk_app_save (app); // clear plug-in uget_app_clear_plugins ((UgetApp*) app); // hide icon in system tray before quit ugtk_tray_icon_set_visible (&app->trayicon, FALSE); // hide window gtk_widget_hide (GTK_WIDGET (app->window.self)); gtk_main_quit (); } void ugtk_app_get_window_setting (UgtkApp* app, UgtkSetting* setting) { GdkWindowState gdk_wstate; GdkWindow* gdk_window; gint x, y; // get window position, size, and maximized state if (gtk_widget_get_visible (GTK_WIDGET (app->window.self)) == TRUE) { gdk_window = gtk_widget_get_window (GTK_WIDGET (app->window.self)); gdk_wstate = gdk_window_get_state (gdk_window); if (gdk_wstate & GDK_WINDOW_STATE_MAXIMIZED) setting->window.maximized = TRUE; else setting->window.maximized = FALSE; // get geometry if (setting->window.maximized == FALSE) { gtk_window_get_position (app->window.self, &x, &y); gtk_window_get_size (app->window.self, &setting->window.width, &setting->window.height); // gtk_window_get_position() may return: x == -32000, y == -32000 if (x + app->setting.window.width > 0) setting->window.x = x; if (y + app->setting.window.height > 0) setting->window.y = y; } } // GtkPaned position if (app->setting.window.category) setting->window.paned_position_h = gtk_paned_get_position (app->window.hpaned); if (app->setting.window.summary) setting->window.paned_position_v = gtk_paned_get_position (app->window.vpaned); // banner setting->window.banner = gtk_widget_get_visible (app->banner.self); // traveler setting->window.nth_category = app->traveler.category.cursor.pos; setting->window.nth_state = app->traveler.state.cursor.pos; } void ugtk_app_set_window_setting (UgtkApp* app, UgtkSetting* setting) { // set window position, size, and maximized state if (setting->window.width > 0 && setting->window.height > 0 && setting->window.x < gdk_screen_width () && setting->window.y < gdk_screen_height () && setting->window.x + setting->window.width > 0 && setting->window.y + setting->window.height > 0) { gtk_window_move (app->window.self, setting->window.x, setting->window.y); gtk_window_resize (app->window.self, setting->window.width, setting->window.height); } if (setting->window.maximized) gtk_window_maximize (app->window.self); // GtkPaned position if (setting->window.paned_position_h > 0) { gtk_paned_set_position (app->window.hpaned, setting->window.paned_position_h); } if (setting->window.paned_position_v > 0) { if (setting->window.paned_position_v > 100) // for uGet < 2.0.4 gtk_paned_set_position (app->window.vpaned, setting->window.paned_position_v); } // set visible widgets gtk_widget_set_visible (app->toolbar.self, setting->window.toolbar); gtk_widget_set_visible ((GtkWidget*) app->statusbar.self, setting->window.statusbar); gtk_widget_set_visible (gtk_paned_get_child1 (app->window.hpaned), setting->window.category); gtk_widget_set_visible (app->summary.self, setting->window.summary); gtk_widget_set_visible (app->banner.self, setting->window.banner); // Summary app->summary.visible.name = setting->summary.name; app->summary.visible.folder = setting->summary.folder; app->summary.visible.category = setting->summary.category; app->summary.visible.uri = setting->summary.uri; app->summary.visible.message = setting->summary.message; // traveler if (setting->window.nth_category >= app->real.n_children) setting->window.nth_category = 0; if (setting->window.nth_state >= app->split.n_children) setting->window.nth_state = 0; ugtk_traveler_select_category (&app->traveler, setting->window.nth_category, setting->window.nth_state); // menu ugtk_app_set_menu_setting (app, setting); } void ugtk_app_get_column_setting (UgtkApp* app, UgtkSetting* setting) { GtkTreeViewColumn* column; int width; // state column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_STATE); width = gtk_tree_view_column_get_width (column); setting->download_column.width.state = width; // name column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_NAME); width = gtk_tree_view_column_get_width (column); setting->download_column.width.name = width; // complete column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_COMPLETE); width = gtk_tree_view_column_get_width (column); setting->download_column.width.complete = width; // total column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_TOTAL); width = gtk_tree_view_column_get_width (column); setting->download_column.width.total = width; // percent column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_PERCENT); width = gtk_tree_view_column_get_width (column); setting->download_column.width.percent = width; // elapsed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_ELAPSED); width = gtk_tree_view_column_get_width (column); setting->download_column.width.elapsed = width; // left column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_LEFT); width = gtk_tree_view_column_get_width (column); setting->download_column.width.left = width; // speed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_SPEED); width = gtk_tree_view_column_get_width (column); setting->download_column.width.speed = width; // upload_speed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_UPLOAD_SPEED); width = gtk_tree_view_column_get_width (column); setting->download_column.width.upload_speed = width; // uploaded column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_UPLOADED); width = gtk_tree_view_column_get_width (column); setting->download_column.width.uploaded = width; // ratio column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_RATIO); width = gtk_tree_view_column_get_width (column); setting->download_column.width.ratio = width; // retry column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_RETRY); width = gtk_tree_view_column_get_width (column); setting->download_column.width.retry = width; // category column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_CATEGORY); width = gtk_tree_view_column_get_width (column); setting->download_column.width.category = width; // uri column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_URI); width = gtk_tree_view_column_get_width (column); setting->download_column.width.uri = width; // added_on column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_ADDED_ON); width = gtk_tree_view_column_get_width (column); setting->download_column.width.added_on = width; // completed_on column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_COMPLETED_ON); width = gtk_tree_view_column_get_width (column); setting->download_column.width.completed_on = width; } void ugtk_app_set_column_setting (UgtkApp* app, UgtkSetting* setting) { GtkTreeViewColumn* column; int width; // state column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_STATE); width = setting->download_column.width.state; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // name column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_NAME); width = setting->download_column.width.name; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // complete column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_COMPLETE); width = setting->download_column.width.complete; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // total column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_TOTAL); width = setting->download_column.width.total; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // percent column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_PERCENT); width = setting->download_column.width.percent; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // elapsed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_ELAPSED); width = setting->download_column.width.elapsed; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // left column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_LEFT); width = setting->download_column.width.left; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // speed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_SPEED); width = setting->download_column.width.speed; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // upload_speed column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_UPLOAD_SPEED); width = setting->download_column.width.upload_speed; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // uploaded column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_UPLOADED); width = setting->download_column.width.uploaded; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // ratio column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_RATIO); width = setting->download_column.width.ratio; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // retry column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_RETRY); width = setting->download_column.width.retry; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // category column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_CATEGORY); width = setting->download_column.width.category; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // uri column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_URI); width = setting->download_column.width.uri; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // added_on column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_ADDED_ON); width = setting->download_column.width.added_on; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); // completed_on column = gtk_tree_view_get_column (app->traveler.download.view, UGTK_NODE_COLUMN_COMPLETED_ON); width = setting->download_column.width.completed_on; if (width > 0) gtk_tree_view_column_set_fixed_width (column, width); } void ugtk_app_set_plugin_setting (UgtkApp* app, UgtkSetting* setting) { const UgetPluginInfo* default_plugin; int limit[2]; int sensitive = FALSE; switch (setting->plugin_order) { default: case UGTK_PLUGIN_ORDER_CURL: uget_app_remove_plugin ((UgetApp*) app, UgetPluginAria2Info); default_plugin = UgetPluginCurlInfo; sensitive = FALSE; break; case UGTK_PLUGIN_ORDER_ARIA2: uget_app_remove_plugin ((UgetApp*) app, UgetPluginCurlInfo); default_plugin = UgetPluginAria2Info; sensitive = TRUE; break; case UGTK_PLUGIN_ORDER_CURL_ARIA2: uget_app_add_plugin ((UgetApp*) app, UgetPluginAria2Info); default_plugin = UgetPluginCurlInfo; sensitive = TRUE; break; case UGTK_PLUGIN_ORDER_ARIA2_CURL: uget_app_add_plugin ((UgetApp*) app, UgetPluginCurlInfo); default_plugin = UgetPluginAria2Info; sensitive = TRUE; break; } // set default plug-in uget_app_set_default_plugin ((UgetApp*) app, default_plugin); // set agent plug-in (used by media and MEGA plug-in) uget_plugin_agent_global_set(UGET_PLUGIN_AGENT_GLOBAL_PLUGIN, (void*) default_plugin); // set media plug-in uget_app_add_plugin ((UgetApp*) app, UgetPluginMediaInfo); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_MEDIA_GLOBAL_MATCH_MODE, (void*)(intptr_t) setting->media.match_mode); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_MEDIA_GLOBAL_QUALITY, (void*)(intptr_t) setting->media.quality); uget_plugin_global_set(UgetPluginMediaInfo, UGET_PLUGIN_MEDIA_GLOBAL_TYPE, (void*)(intptr_t) setting->media.type); // set MEGA plug-in uget_app_add_plugin ((UgetApp*) app, UgetPluginMegaInfo); // set aria2 plug-in if (setting->plugin_order >= UGTK_PLUGIN_ORDER_ARIA2) { uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_URI, setting->aria2.uri); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_PATH, setting->aria2.path); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_ARGUMENT, setting->aria2.args); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_TOKEN, setting->aria2.token); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_LAUNCH, (void*)(intptr_t) setting->aria2.launch); uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_ARIA2_GLOBAL_SHUTDOWN, (void*)(intptr_t) setting->aria2.shutdown); limit[0] = setting->aria2.limit.download * 1024; limit[1] = setting->aria2.limit.upload * 1024; uget_plugin_global_set(UgetPluginAria2Info, UGET_PLUGIN_GLOBAL_SPEED_LIMIT, limit); } // app->aria2.remote_updated = FALSE; gtk_widget_set_sensitive ((GtkWidget*) app->trayicon.menu.create_torrent, sensitive); gtk_widget_set_sensitive ((GtkWidget*) app->trayicon.menu.create_metalink, sensitive); gtk_widget_set_sensitive ((GtkWidget*) app->menubar.file.create_torrent, sensitive); gtk_widget_set_sensitive ((GtkWidget*) app->menubar.file.create_metalink, sensitive); gtk_widget_set_sensitive ((GtkWidget*) app->toolbar.create_torrent, sensitive); gtk_widget_set_sensitive ((GtkWidget*) app->toolbar.create_metalink, sensitive); } void ugtk_app_set_other_setting (UgtkApp* app, UgtkSetting* setting) { // clipboard & commandline ugtk_clipboard_set_pattern (&app->clipboard, setting->clipboard.pattern); app->clipboard.website = app->setting.clipboard.website; // global speed limit uget_task_set_speed (&app->task, setting->bandwidth.normal.download * 1024, setting->bandwidth.normal.upload * 1024); } void ugtk_app_set_menu_setting (UgtkApp* app, UgtkSetting* setting) { // ---------------------------------------------------- // UgtkEditMenu gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.clipboard_monitor, setting->clipboard.monitor); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.clipboard_quiet, setting->clipboard.quiet); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.commandline_quiet, setting->commandline.quiet); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.skip_existing, setting->ui.skip_existing); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.apply_recent, setting->ui.apply_recent); switch (app->setting.completion.action) { default: case 0: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.disable, TRUE); break; case 1: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.hibernate, TRUE); break; case 2: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.suspend, TRUE); break; case 3: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.shutdown, TRUE); break; case 4: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.reboot, TRUE); break; case 5: gtk_check_menu_item_set_active ( (GtkCheckMenuItem*)app->menubar.edit.completion.custom, TRUE); break; } gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.edit.completion.remember, setting->completion.remember); // ---------------------------------------------------- // UgtkViewMenu gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.toolbar, setting->window.toolbar); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.statusbar, setting->window.statusbar); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.category, setting->window.category); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary, setting->window.summary); // summary items gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary_items.name, setting->summary.name); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary_items.folder, setting->summary.folder); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary_items.category, setting->summary.category); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary_items.uri, setting->summary.uri); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.summary_items.message, setting->summary.message); // download column gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.complete, setting->download_column.complete); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.total, setting->download_column.total); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.percent, setting->download_column.percent); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.elapsed, setting->download_column.elapsed); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.left, setting->download_column.left); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.speed, setting->download_column.speed); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.upload_speed, setting->download_column.upload_speed); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.uploaded, setting->download_column.uploaded); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.ratio, setting->download_column.ratio); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.retry, setting->download_column.retry); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.category, setting->download_column.category); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.uri, setting->download_column.uri); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.added_on, setting->download_column.added_on); gtk_check_menu_item_set_active ( (GtkCheckMenuItem*) app->menubar.view.columns.completed_on, setting->download_column.completed_on); } void ugtk_app_set_ui_setting (UgtkApp* app, UgtkSetting* setting) { GtkIconSize icon_size; #ifdef HAVE_APP_INDICATOR // AppIndicator ugtk_tray_icon_use_indicator (&app->trayicon, setting->ui.app_indicator); #endif ugtk_tray_icon_set_visible (&app->trayicon, setting->ui.show_trayicon); // ---------------------------------------------------- // large icon if (setting->ui.large_icon) icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR; else icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR; // toolbar gtk_toolbar_set_icon_size ((GtkToolbar*) app->toolbar.self, icon_size); // state list ugtk_node_view_use_large_icon (app->traveler.state.view, setting->ui.large_icon, setting->download_column.width.state); // category list ugtk_node_view_use_large_icon (app->traveler.category.view, setting->ui.large_icon, setting->download_column.width.state); // download list ugtk_node_view_use_large_icon (app->traveler.download.view, setting->ui.large_icon, setting->download_column.width.state); // summary ugtk_node_view_use_large_icon (app->summary.view, setting->ui.large_icon, setting->download_column.width.state); } // decide sensitive for menu, toolbar void ugtk_app_decide_download_sensitive (UgtkApp* app) { GtkTreeSelection* selection; gboolean sensitive; static gboolean sensitive_last = TRUE; gint n_selected; selection = gtk_tree_view_get_selection (app->traveler.download.view); n_selected = gtk_tree_selection_count_selected_rows (selection); if (n_selected > 0) sensitive = TRUE; else sensitive = FALSE; // change sensitive after select/unselect if (sensitive_last != sensitive) { sensitive_last = sensitive; gtk_widget_set_sensitive (app->toolbar.runnable, sensitive); gtk_widget_set_sensitive (app->toolbar.pause, sensitive); gtk_widget_set_sensitive (app->toolbar.properties, sensitive); gtk_widget_set_sensitive (app->menubar.download.open, sensitive); gtk_widget_set_sensitive (app->menubar.download.open_folder, sensitive); gtk_widget_set_sensitive (app->menubar.download.delete, sensitive); gtk_widget_set_sensitive (app->menubar.download.delete_file, sensitive); gtk_widget_set_sensitive (app->menubar.download.force_start, sensitive); gtk_widget_set_sensitive (app->menubar.download.runnable, sensitive); gtk_widget_set_sensitive (app->menubar.download.pause, sensitive); gtk_widget_set_sensitive (app->menubar.download.move_to.item, sensitive); gtk_widget_set_sensitive (app->menubar.download.prioriy.item, sensitive); } // properties if (n_selected > 1) { gtk_widget_set_sensitive (app->toolbar.properties, FALSE); gtk_widget_set_sensitive (app->menubar.download.properties, FALSE); } else { gtk_widget_set_sensitive (app->toolbar.properties, sensitive); gtk_widget_set_sensitive (app->menubar.download.properties, sensitive); } // Move Up/Down/Top/Bottom functions need reset sensitive when selection changed. // These need by on_move_download_xxx() series. if (n_selected > 0) { // Any Category/Status can't move download position if they were sorted. if (app->setting.download_column.sort.nth == UGTK_NODE_COLUMN_STATE) sensitive = TRUE; else sensitive = FALSE; } // move up/down/top/bottom gtk_widget_set_sensitive (app->toolbar.move_up, sensitive); gtk_widget_set_sensitive (app->toolbar.move_down, sensitive); gtk_widget_set_sensitive (app->toolbar.move_top, sensitive); gtk_widget_set_sensitive (app->toolbar.move_bottom, sensitive); gtk_widget_set_sensitive (app->menubar.download.move_up, sensitive); gtk_widget_set_sensitive (app->menubar.download.move_down, sensitive); gtk_widget_set_sensitive (app->menubar.download.move_top, sensitive); gtk_widget_set_sensitive (app->menubar.download.move_bottom, sensitive); } // decide sensitive for menu, toolbar void ugtk_app_decide_category_sensitive (UgtkApp* app) { static gboolean sensitive_last = TRUE; gboolean sensitive; if (app->traveler.category.cursor.node) sensitive = TRUE; else sensitive = FALSE; if (sensitive_last != sensitive) { sensitive_last = sensitive; gtk_widget_set_sensitive (app->menubar.category.properties, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.self, sensitive); } // cursor at "All Category" if (app->traveler.category.cursor.pos == 0) { gtk_widget_set_sensitive (app->menubar.file.save_category, FALSE); gtk_widget_set_sensitive (app->menubar.category.delete, FALSE); } else { gtk_widget_set_sensitive (app->menubar.file.save_category, sensitive); gtk_widget_set_sensitive (app->menubar.category.delete, sensitive); } // Move Up if (app->traveler.category.cursor.pos <= 1) gtk_widget_set_sensitive (app->menubar.category.move_up, FALSE); else gtk_widget_set_sensitive (app->menubar.category.move_up, TRUE); // Move Down if (app->traveler.category.cursor.pos == 0 || app->traveler.category.cursor.node->next == NULL) { gtk_widget_set_sensitive (app->menubar.category.move_down, FALSE); } else gtk_widget_set_sensitive (app->menubar.category.move_down, TRUE); ugtk_app_decide_download_sensitive (app); } void ugtk_app_decide_trayicon_visible (UgtkApp* app) { gboolean visible; if (app->setting.ui.show_trayicon) visible = TRUE; else { if (gtk_widget_get_visible ((GtkWidget*) app->window.self)) visible = FALSE; else visible = TRUE; } ugtk_tray_icon_set_visible (&app->trayicon, visible); } void ugtk_app_decide_to_quit (UgtkApp* app) { UgtkConfirmDialog* cdialog; if (app->setting.ui.exit_confirmation == FALSE) ugtk_app_quit (app); else if (app->dialogs.exit_confirmation) gtk_widget_show (app->dialogs.exit_confirmation); else { cdialog = ugtk_confirm_dialog_new (UGTK_CONFIRM_DIALOG_EXIT, app); ugtk_confirm_dialog_run (cdialog); } } // ------------------------------------ // create node by UI void ugtk_app_create_category (UgtkApp* app) { UgtkNodeDialog* ndialog; UgetCommon* common_src; UgetCommon* common; UgetNode* cnode_src; UgetNode* cnode; gchar* title; title = g_strconcat (UGTK_APP_NAME, " - ", _("New Category"), NULL); ndialog = ugtk_node_dialog_new (title, app, TRUE); g_free (title); ugtk_download_form_set_folders (&ndialog->download, &app->setting); // category list cnode_src = app->traveler.category.cursor.node->base; if (cnode_src->parent != &app->real) cnode_src = app->real.children; common_src = ug_info_get(cnode_src->info, UgetCommonInfo); cnode = uget_node_new (NULL); common = ug_info_realloc(cnode->info, UgetCommonInfo); ug_info_assign (cnode->info, cnode_src->info, NULL); ug_free(common->name); common->name = ug_strdup_printf("%s%s", _("Copy - "), (common_src->name) ? common_src->name : NULL); ugtk_node_dialog_set (ndialog, cnode->info); ugtk_node_dialog_run (ndialog, UGTK_NODE_DIALOG_NEW_CATEGORY, cnode); } void ugtk_app_create_download (UgtkApp* app, const char* sub_title, const char* uri) { UgtkNodeDialog* ndialog; UgUri uuri; UgetNode* cnode; GList* list; union { gchar* title; UgetNode* cnode; } temp; if (sub_title) temp.title = g_strconcat (UGTK_APP_NAME, " - ", sub_title, NULL); else temp.title = g_strconcat (UGTK_APP_NAME, " - ", _("New Download"), NULL); ndialog = ugtk_node_dialog_new (temp.title, app, FALSE); g_free (temp.title); ugtk_download_form_set_folders (&ndialog->download, &app->setting); // category list cnode = app->traveler.category.cursor.node->base; if (cnode->parent != &app->real) cnode = app->real.children; if (uri != NULL) { // set URI entry gtk_entry_set_text ((GtkEntry*) ndialog->download.uri_entry, uri); ndialog->download.changed.uri = TRUE; // match category by URI ug_uri_init (&uuri, uri); temp.cnode = uget_app_match_category ((UgetApp*) app, &uuri, NULL); if (temp.cnode) cnode = temp.cnode; } else if ( (list = ugtk_clipboard_get_uris (&app->clipboard)) != NULL ) { // use first URI from clipboard to set URI entry gtk_entry_set_text ((GtkEntry*) ndialog->download.uri_entry, list->data); ndialog->download.changed.uri = TRUE; // match category by URI from clipboard ug_uri_init (&uuri, list->data); temp.cnode = uget_app_match_category ((UgetApp*) app, &uuri, NULL); if (temp.cnode) cnode = temp.cnode; // g_list_free_full (list, g_free); ugtk_download_form_complete_entry (&ndialog->download); } if (cnode) cnode = cnode->base; ugtk_node_dialog_set_category (ndialog, cnode); ugtk_node_dialog_run (ndialog, UGTK_NODE_DIALOG_NEW_DOWNLOAD, NULL); } // ------------------------------------ // delete selected node void ugtk_app_delete_category (UgtkApp* app) { UgetNode* cnode; int pos; cnode = app->traveler.category.cursor.node->base; pos = app->traveler.category.cursor.pos; // move cursor if (pos <= 0) return; if (cnode->next) ugtk_traveler_select_category (&app->traveler, pos + 1, -1); else { if (app->real.n_children > 1) ugtk_traveler_select_category (&app->traveler, pos - 1, -1); else { // The last category will be deleted. ugtk_app_add_default_category (app); ugtk_traveler_select_category (&app->traveler, pos + 1, -1); } } // remove category uget_app_delete_category ((UgetApp*) app, cnode); // sync UgtkMenubar.download.move_to ugtk_menubar_sync_category (&app->menubar, app, TRUE); } void ugtk_app_delete_download (UgtkApp* app, gboolean delete_files) { UgetNode* cursor; UgetNode* node; GList* link; GList* list = NULL; // check shift key status GdkWindow* gdk_win; GdkDevice* dev_pointer; GdkModifierType mask; // check shift key status gdk_win = gtk_widget_get_parent_window ((GtkWidget*) app->traveler.download.view); dev_pointer = gdk_device_manager_get_client_pointer ( gdk_display_get_device_manager (gdk_window_get_display (gdk_win))); gdk_window_get_device_position (gdk_win, dev_pointer, NULL, NULL, &mask); cursor = app->traveler.download.cursor.node; if (cursor) cursor = cursor->base; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; link->data = node; if (delete_files || mask & GDK_SHIFT_MASK) uget_app_delete_download ((UgetApp*) app, node, delete_files); else { if (uget_app_recycle_download ((UgetApp*) app, node)) continue; } // if current node has been deleted if (cursor == node) cursor = NULL; link->data = NULL; } if (delete_files == FALSE && (mask & GDK_SHIFT_MASK) == 0) { ugtk_traveler_set_cursor (&app->traveler, cursor); ugtk_traveler_set_selected (&app->traveler, list); } g_list_free (list); // refresh gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); app->user_action = TRUE; } // ------------------------------------ // edit selected node void ugtk_app_edit_category (UgtkApp* app) { UgtkNodeDialog* ndialog; UgetNode* node; gchar* title; if (app->traveler.category.cursor.pos == 0) node = app->real.children; else node = app->traveler.category.cursor.node; if (node == NULL) return; title = g_strconcat (UGTK_APP_NAME " - ", _("Category Properties"), NULL); ndialog = ugtk_node_dialog_new (title, app, TRUE); g_free (title); ugtk_download_form_set_folders (&ndialog->download, &app->setting); ugtk_node_dialog_set (ndialog, node->base->info); ugtk_node_dialog_run (ndialog, UGTK_NODE_DIALOG_EDIT_CATEGORY, node->base); } void ugtk_app_edit_download (UgtkApp* app) { UgtkNodeDialog* ndialog; UgetNode* node; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Download Properties"), NULL); ndialog = ugtk_node_dialog_new (title, app, FALSE); g_free (title); ugtk_download_form_set_folders (&ndialog->download, &app->setting); node = app->traveler.download.cursor.node; ugtk_node_dialog_set (ndialog, node->base->info); ugtk_node_dialog_run (ndialog, UGTK_NODE_DIALOG_EDIT_DOWNLOAD, node->base); } // ------------------------------------ // queue/pause void ugtk_app_queue_download (UgtkApp* app, gboolean keep_active) { UgetRelation* relation; UgetNode* node; UgetNode* cursor; GList* list; GList* link; cursor = app->traveler.download.cursor.node; if (cursor) cursor = cursor->base; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; link->data = node; relation = ug_info_realloc(node->info, UgetRelationInfo); if (keep_active && relation->group & UGET_GROUP_ACTIVE) continue; uget_app_queue_download ((UgetApp*) app, node); } if (app->traveler.state.cursor.pos == 0) { ugtk_traveler_set_cursor (&app->traveler, cursor); ugtk_traveler_set_selected (&app->traveler, list); } g_list_free (list); // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.download.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); // ugtk_summary_show (&app->summary, app->traveler.download.cursor.node); } void ugtk_app_pause_download (UgtkApp* app) { UgetNode* node; UgetNode* cursor; GList* list; GList* link; cursor = app->traveler.download.cursor.node; if (cursor) cursor = cursor->base; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; link->data = node; uget_app_pause_download ((UgetApp*) app, node); } if (app->traveler.state.cursor.pos == 0) { ugtk_traveler_set_cursor (&app->traveler, cursor); ugtk_traveler_set_selected (&app->traveler, list); } g_list_free (list); // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.download.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); // ugtk_summary_show (&app->summary, app->traveler.download.cursor.node); app->user_action = TRUE; } void ugtk_app_switch_download_state (UgtkApp* app) { UgetRelation* relation; UgetNode* node; UgetNode* cursor; GList* list; GList* link; cursor = app->traveler.download.cursor.node; if (cursor) cursor = cursor->base; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; link->data = node; relation = ug_info_realloc(node->info, UgetRelationInfo); if (relation->group & UGET_GROUP_PAUSED) uget_app_queue_download ((UgetApp*) app, node); else if (relation->group & UGET_GROUP_ACTIVE) uget_app_pause_download ((UgetApp*) app, node); } if (app->traveler.state.cursor.pos == 0) { ugtk_traveler_set_cursor (&app->traveler, cursor); ugtk_traveler_set_selected (&app->traveler, list); } g_list_free (list); // refresh other data & status gtk_widget_queue_draw ((GtkWidget*) app->traveler.download.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); // ugtk_summary_show (&app->summary, app->traveler.download.cursor.node); app->user_action = TRUE; } // ------------------------------------ // move selected node void ugtk_app_move_download_up (UgtkApp* app) { if (ugtk_traveler_move_selected_up (&app->traveler) > 0) { gtk_widget_set_sensitive (app->toolbar.move_down, TRUE); gtk_widget_set_sensitive (app->toolbar.move_bottom, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_down, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_bottom, TRUE); } else { gtk_widget_set_sensitive (app->toolbar.move_up, FALSE); gtk_widget_set_sensitive (app->toolbar.move_top, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_up, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_top, FALSE); } } void ugtk_app_move_download_down (UgtkApp* app) { if (ugtk_traveler_move_selected_down (&app->traveler) > 0) { gtk_widget_set_sensitive (app->toolbar.move_up, TRUE); gtk_widget_set_sensitive (app->toolbar.move_top, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_up, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_top, TRUE); } else { gtk_widget_set_sensitive (app->toolbar.move_down, FALSE); gtk_widget_set_sensitive (app->toolbar.move_bottom, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_down, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_bottom, FALSE); } } void ugtk_app_move_download_top (UgtkApp* app) { if (ugtk_traveler_move_selected_top (&app->traveler) > 0) { gtk_widget_set_sensitive (app->toolbar.move_down, TRUE); gtk_widget_set_sensitive (app->toolbar.move_bottom, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_down, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_bottom, TRUE); } gtk_widget_set_sensitive (app->toolbar.move_up, FALSE); gtk_widget_set_sensitive (app->toolbar.move_top, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_up, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_top, FALSE); } void ugtk_app_move_download_bottom (UgtkApp* app) { if (ugtk_traveler_move_selected_bottom (&app->traveler) > 0) { gtk_widget_set_sensitive (app->toolbar.move_up, TRUE); gtk_widget_set_sensitive (app->toolbar.move_top, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_up, TRUE); gtk_widget_set_sensitive (app->menubar.download.move_top, TRUE); } gtk_widget_set_sensitive (app->toolbar.move_down, FALSE); gtk_widget_set_sensitive (app->toolbar.move_bottom, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_down, FALSE); gtk_widget_set_sensitive (app->menubar.download.move_bottom, FALSE); } void ugtk_app_move_download_to (UgtkApp* app, UgetNode* cnode) { UgetNode* node; GList* link; GList* list = NULL; if (cnode == app->traveler.category.cursor.node->base) return; list = ugtk_traveler_get_selected (&app->traveler); for (link = list; link; link = link->next) { node = link->data; node = node->base; if (node->parent == cnode) continue; uget_node_remove (node->parent, node); uget_node_clear_fake (node); uget_node_append (cnode, node); } g_list_free (list); // refresh gtk_widget_queue_draw ((GtkWidget*) app->traveler.category.view); gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); } // ------------------------------------ // torrent & metalink static GtkWidget* create_file_chooser (GtkWindow* parent, GtkFileChooserAction action, const gchar* title, const gchar* filter_name, const gchar* mine_type) { GtkWidget* dialog; GtkFileFilter* filter; dialog = gtk_file_chooser_dialog_new (title, parent, action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_window_set_destroy_with_parent ((GtkWindow*) dialog, TRUE); if (filter_name) { filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, filter_name); gtk_file_filter_add_mime_type (filter, mine_type); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); } return dialog; } static void on_create_torrent_response (GtkWidget* dialog, gint response, UgtkApp* app) { gchar* file; if (response != GTK_RESPONSE_OK ) { gtk_widget_destroy (dialog); return; } // get filename file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); // file = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); ugtk_app_create_download (app, _("New Torrent"), file); g_free (file); } static void on_create_metalink_response (GtkWidget* dialog, gint response, UgtkApp* app) { gchar* file; if (response != GTK_RESPONSE_OK) { gtk_widget_destroy (dialog); return; } // get filename file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); // file = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); ugtk_app_create_download (app, _("New Metalink"), file); g_free (file); } void ugtk_app_create_torrent (UgtkApp* app) { GtkWidget* dialog; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Open Torrent file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_OPEN, title, _("Torrent file (*.torrent)"), "application/x-bittorrent"); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_create_torrent_response), app); gtk_widget_show (dialog); } void ugtk_app_create_metalink (UgtkApp* app) { GtkFileFilter* filter; GtkWidget* dialog; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Open Metalink file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_OPEN, title, NULL, NULL); g_free (title); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, "Metalink file (*.metalink, *.meta4)"); gtk_file_filter_add_pattern (filter, "*.metalink"); gtk_file_filter_add_pattern (filter, "*.meta4"); // gtk_file_filter_add_mime_type (filter, "application/metalink+xml"); // gtk_file_filter_add_mime_type (filter, "application/metalink4+xml"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); g_signal_connect (dialog, "response", G_CALLBACK (on_create_metalink_response), app); gtk_widget_show (dialog); } // ------------------------------------ // import/export static void on_save_category_response (GtkWidget* dialog, gint response, UgtkApp* app) { UgetNode* cnode; gchar* file; gtk_widget_set_sensitive ((GtkWidget*) app->window.self, TRUE); if (response != GTK_RESPONSE_OK) { gtk_widget_destroy (dialog); return; } if (app->traveler.category.cursor.pos == 0) return; // get filename file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); // file = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); cnode = app->traveler.category.cursor.node; if (uget_app_save_category ((UgetApp*) app, cnode->base, file, NULL) == FALSE) ugtk_app_show_message (app, GTK_MESSAGE_ERROR, _("Failed to save category file.")); g_free (file); } static void on_load_category_response (GtkWidget* dialog, gint response, UgtkApp* app) { gchar* file; gtk_widget_set_sensitive ((GtkWidget*) app->window.self, TRUE); if (response != GTK_RESPONSE_OK) { gtk_widget_destroy (dialog); return; } // get filename file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); // file = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); if (uget_app_load_category ((UgetApp*) app, file, NULL)) ugtk_menubar_sync_category (&app->menubar, app, TRUE); else ugtk_app_show_message (app, GTK_MESSAGE_ERROR, _("Failed to load category file.")); g_free (file); } void ugtk_app_save_category (UgtkApp* app) { GtkWidget* dialog; gchar* title; gtk_widget_set_sensitive ((GtkWidget*) app->window.self, FALSE); title = g_strconcat (UGTK_APP_NAME " - ", _("Save Category file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_SAVE, title, NULL, NULL); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_save_category_response), app); gtk_widget_show (dialog); } void ugtk_app_load_category (UgtkApp* app) { GtkWidget* dialog; gchar* title; gtk_widget_set_sensitive ((GtkWidget*) app->window.self, FALSE); title = g_strconcat (UGTK_APP_NAME " - ", _("Open Category file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_OPEN, title, _("JSON file (*.json)"), "application/json"); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_load_category_response), app); gtk_widget_show (dialog); } static void on_import_html_file_response (GtkWidget* dialog, gint response, UgtkApp* app) { UgHtmlFilter* filter; UgHtmlFilterTag* tag_a; UgHtmlFilterTag* tag_img; UgtkBatchDialog* bdialog; UgtkSelectorPage* page; UgetNode* cnode; gchar* string; gchar* file; if (response != GTK_RESPONSE_OK ) { gtk_widget_destroy (dialog); return; } // read URLs from html file string = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); file = g_filename_to_utf8 (string, -1, NULL, NULL, NULL); g_free (string); string = NULL; // parse html filter = ug_html_filter_new (); tag_a = ug_html_filter_tag_new ("A", "HREF"); // ug_html_filter_add_tag (filter, tag_a); tag_img = ug_html_filter_tag_new ("IMG", "SRC"); // ug_html_filter_add_tag (filter, tag_img); ug_html_filter_parse_file (filter, file); g_free (file); if (filter->base_href) string = g_strdup (filter->base_href); ug_html_filter_free (filter); // UgtkBatchDialog bdialog = ugtk_batch_dialog_new ( gtk_window_get_title ((GtkWindow*) dialog), app); ugtk_download_form_set_folders (&bdialog->download, &app->setting); ugtk_batch_dialog_use_selector (bdialog); // category cnode = app->traveler.category.cursor.node->base; if (cnode->parent != &app->real) cnode = app->real.children; ugtk_batch_dialog_set_category (bdialog, cnode); // set if (string) { gtk_entry_set_text (bdialog->selector.href_entry, string); g_free (string); } // add link page = ugtk_selector_add_page (&bdialog->selector, _("Link ")); ugtk_selector_page_add_uris (page, (GList*)tag_a->attr_values.head); ug_list_clear (&tag_a->attr_values, TRUE); ug_html_filter_tag_unref (tag_a); // add image page = ugtk_selector_add_page (&bdialog->selector, _("Image ")); ugtk_selector_page_add_uris (page, (GList*)tag_img->attr_values.head); ug_list_clear (&tag_img->attr_values, TRUE); ug_html_filter_tag_unref (tag_img); ugtk_batch_dialog_run (bdialog); } static void on_import_text_file_response (GtkWidget* dialog, gint response, UgtkApp* app) { UgtkBatchDialog* bdialog; UgtkSelectorPage* page; UgetNode* cnode; gchar* string; gchar* file; GList* list; GError* error = NULL; if (response != GTK_RESPONSE_OK ) { gtk_widget_destroy (dialog); return; } // read URLs from text file string = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); file = g_filename_to_utf8 (string, -1, NULL, NULL, NULL); g_free (string); list = ugtk_text_file_get_uris (file, &error); g_free (file); if (error) { ugtk_app_show_message (app, GTK_MESSAGE_ERROR, error->message); g_error_free (error); return; } // UgtkBatchDialog bdialog = ugtk_batch_dialog_new ( gtk_window_get_title ((GtkWindow*) dialog), app); ugtk_batch_dialog_use_selector (bdialog); ugtk_download_form_set_folders (&bdialog->download, &app->setting); // category cnode = app->traveler.category.cursor.node->base; if (cnode->parent != &app->real) cnode = app->real.children; ugtk_batch_dialog_set_category (bdialog, cnode); page = ugtk_selector_add_page (&bdialog->selector, _("Text File")); ugtk_selector_hide_href (&bdialog->selector); ugtk_selector_page_add_uris (page, list); g_list_free (list); ugtk_batch_dialog_run (bdialog); } static void on_export_text_file_response (GtkWidget* dialog, gint response, UgtkApp* app) { GIOChannel* channel; UgetCommon* common; UgetNode* node; gchar* fname; if (response != GTK_RESPONSE_OK ) { gtk_widget_destroy (dialog); return; } // write all URLs to text file fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy (dialog); channel = g_io_channel_new_file (fname, "w", NULL); g_free (fname); node = app->traveler.category.cursor.node->base; for (node = node->children; node; node = node->next) { common = ug_info_get (node->info, UgetCommonInfo); if (common == NULL) continue; if (common->uri) { g_io_channel_write_chars (channel, common->uri, -1, NULL, NULL); #ifdef _WIN32 g_io_channel_write_chars (channel, "\r\n", 2, NULL, NULL); #else g_io_channel_write_chars (channel, "\n", 1, NULL, NULL); #endif } } g_io_channel_unref (channel); } void ugtk_app_import_html_file (UgtkApp* app) { GtkWidget* dialog; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Import URLs from HTML file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_OPEN, title, _("HTML file (*.htm, *.html)"), "text/html"); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_import_html_file_response), app); gtk_widget_show (dialog); } void ugtk_app_import_text_file (UgtkApp* app) { GtkWidget* dialog; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Import URLs from text file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_OPEN, title, _("Plain text file"), "text/plain"); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_import_text_file_response), app); gtk_widget_show (dialog); } void ugtk_app_export_text_file (UgtkApp* app) { GtkWidget* dialog; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Export URLs to text file"), NULL); dialog = create_file_chooser (app->window.self, GTK_FILE_CHOOSER_ACTION_SAVE, title, NULL, NULL); g_free (title); g_signal_connect (dialog, "response", G_CALLBACK (on_export_text_file_response), app); gtk_widget_show (dialog); } // ------------------------------------ // batch void ugtk_app_sequence_batch (UgtkApp* app) { UgtkBatchDialog* bdialog; UgetNode* cnode; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("URL Sequence batch"), NULL); bdialog = ugtk_batch_dialog_new (title, app); g_free (title); ugtk_batch_dialog_use_sequencer (bdialog); ugtk_download_form_set_folders (&bdialog->download, &app->setting); // category list cnode = app->traveler.category.cursor.node->base; if (cnode->parent != &app->real) cnode = app->real.children; ugtk_batch_dialog_set_category (bdialog, cnode); ugtk_batch_dialog_run (bdialog); } void ugtk_app_clipboard_batch (UgtkApp* app) { UgtkBatchDialog* bdialog; UgtkSelectorPage* page; UgetNode* cnode; GList* list; gchar* title; list = ugtk_clipboard_get_uris (&app->clipboard); if (list == NULL) { ugtk_app_show_message (app, GTK_MESSAGE_ERROR, _("No URLs found in clipboard.")); return; } // filter existing if (app->setting.ui.skip_existing) { if (ugtk_app_filter_existing (app, list) == 0) { // g_list_foreach (list, (GFunc) g_free, NULL); g_list_free (list); ugtk_app_show_message (app, GTK_MESSAGE_INFO, _("All URLs had existed.")); return; } } title = g_strconcat (UGTK_APP_NAME " - ", _("Clipboard batch"), NULL); bdialog = ugtk_batch_dialog_new (title, app); g_free (title); ugtk_download_form_set_folders (&bdialog->download, &app->setting); ugtk_batch_dialog_use_selector (bdialog); // selector ugtk_selector_hide_href (&bdialog->selector); page = ugtk_selector_add_page (&bdialog->selector, _("Clipboard")); ugtk_selector_page_add_uris (page, list); g_list_free (list); // category list cnode = app->traveler.category.cursor.node->base; if (cnode->parent != &app->real) cnode = app->real.children; ugtk_batch_dialog_set_category (bdialog, cnode); ugtk_batch_dialog_run (bdialog); } int ugtk_app_filter_existing (UgtkApp* app, GList* uris) { int counts; for (counts = 0; uris; uris = uris->next) { if (uris->data == NULL) continue; if (uget_uri_hash_find (app->uri_hash, (char*) uris->data) == FALSE) counts++; else { g_free (uris->data); uris->data = NULL; } } return counts; } // ------------------------------------ // emit signal "row-changed" for UgtkNodeTree and UgtkNodeList void ugtk_app_download_changed (UgtkApp* app, UgetNode* dnode) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; if (ugtk_traveler_get_iter (&app->traveler, &iter, dnode)) { model = GTK_TREE_MODEL (app->traveler.download.model); path = gtk_tree_model_get_path (model, &iter); if (path) { gtk_tree_model_row_changed (model, path, &iter); gtk_tree_path_free (path); } } } void ugtk_app_category_changed (UgtkApp* app, UgetNode* cnode) { GtkTreeIter iter; GtkTreePath* path; GtkTreeModel* model; model = GTK_TREE_MODEL (app->traveler.category.model); if (app->traveler.category.cursor.pos > 0) { iter.stamp = app->traveler.category.model->stamp; iter.user_data = cnode; // update category path = gtk_tree_model_get_path (model, &iter); gtk_tree_model_row_changed (model, path, &iter); gtk_tree_path_free (path); } // update "All Category" path = gtk_tree_path_new_first (); gtk_tree_model_get_iter_first (model, &iter); gtk_tree_model_row_changed (model, path, &iter); gtk_tree_path_free (path); // refresh status list gtk_widget_queue_draw ((GtkWidget*) app->traveler.state.view); } void ugtk_app_add_default_category (UgtkApp* app) { UgetNode* cnode; UgetCommon* common; UgetCategory* category; static int counts = 0; cnode = uget_node_new (NULL); common = ug_info_realloc (cnode->info, UgetCommonInfo); common->name = ug_strdup_printf ("%s %d", _("New"), counts++); common->folder = ug_strdup (g_get_home_dir ()); category = ug_info_realloc (cnode->info, UgetCategoryInfo); *(char**)ug_array_alloc (&category->schemes, 1) = ug_strdup ("ftps"); *(char**)ug_array_alloc (&category->schemes, 1) = ug_strdup ("magnet"); *(char**)ug_array_alloc (&category->hosts, 1) = ug_strdup (".edu"); *(char**)ug_array_alloc (&category->hosts, 1) = ug_strdup (".idv"); *(char**)ug_array_alloc (&category->file_exts, 1) = ug_strdup ("torrent"); *(char**)ug_array_alloc (&category->file_exts, 1) = ug_strdup ("metalink"); uget_app_add_category ((UgetApp*) app, cnode, TRUE); } // ------------------------------------ // others static void on_message_response (GtkWidget* dialog, gint response, GtkWidget** value) { gtk_widget_destroy (dialog); *value = NULL; } void ugtk_app_show_message (UgtkApp* app, GtkMessageType type, const gchar* message) { GtkWidget* dialog; GtkWidget** value; gchar* title; dialog = gtk_message_dialog_new (app->window.self, GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, "%s", message); // set title switch (type) { case GTK_MESSAGE_ERROR: if (app->dialogs.error) gtk_widget_destroy (app->dialogs.error); app->dialogs.error = dialog; value = &app->dialogs.error; title = g_strconcat (UGTK_APP_NAME " - ", _("Error"), NULL); break; default: if (app->dialogs.message) gtk_widget_destroy (app->dialogs.message); app->dialogs.message = dialog; value = &app->dialogs.message; title = g_strconcat (UGTK_APP_NAME " - ", _("Message"), NULL); break; } gtk_window_set_title ((GtkWindow*) dialog, title); g_free (title); // signal handler g_signal_connect (dialog, "response", G_CALLBACK (on_message_response), value); gtk_widget_show (dialog); } // ------------------------------------------------------- // UgtkClipboard void ugtk_clipboard_init (struct UgtkClipboard* clipboard, const gchar* pattern) { clipboard->self = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); clipboard->text = NULL; clipboard->regex = g_regex_new (pattern, G_REGEX_CASELESS, 0, NULL); clipboard->website = TRUE; } void ugtk_clipboard_set_pattern (struct UgtkClipboard* clipboard, const gchar* pattern) { if (clipboard->regex) g_regex_unref (clipboard->regex); if (pattern) clipboard->regex = g_regex_new (pattern, G_REGEX_CASELESS, 0, NULL); else clipboard->regex = g_regex_new ("", G_REGEX_CASELESS, 0, NULL); } void ugtk_clipboard_set_text (struct UgtkClipboard* clipboard, gchar* text) { g_free (clipboard->text); clipboard->text = text; gtk_clipboard_set_text (clipboard->self, text, -1); } GList* ugtk_clipboard_get_uris (struct UgtkClipboard* clipboard) { GList* list; gchar* text; if (gtk_clipboard_wait_is_text_available (clipboard->self) == FALSE) return NULL; text = gtk_clipboard_wait_for_text (clipboard->self); if (text == NULL) return NULL; // get URIs that scheme is not "file" from text list = ugtk_text_get_uris (text); list = ugtk_uri_list_remove_scheme (list, "file"); g_free (text); return list; } GList* ugtk_clipboard_get_matched (struct UgtkClipboard* clipboard, const gchar* text) { GList* link; GList* list; gchar* temp; if (text == NULL) { g_free (clipboard->text); clipboard->text = NULL; return NULL; } // compare temp = (clipboard->text) ? clipboard->text : ""; if (g_ascii_strcasecmp (text, temp) == 0) return NULL; // replace text g_free (clipboard->text); clipboard->text = g_strdup (text); // get and filter list list = ugtk_text_get_uris (text); list = ugtk_uri_list_remove_scheme (list, "file"); // filter by filename extension for (link = list; link; link = link->next) { temp = ug_filename_from_uri (link->data); // get filename extension if (temp) text = strrchr (temp, '.'); else text = NULL; // free URIs if not matched if (text == NULL || g_regex_match (clipboard->regex, text+1, 0, NULL) == FALSE) { // storage or media website if (clipboard->website == FALSE || uget_site_get_id (link->data) == UGET_SITE_UNKNOWN) { g_free (link->data); link->data = NULL; } } ug_free (temp); } list = g_list_remove_all (list, NULL); return list; } // ------------------------------------------------------- // UgtkStatusbar void ugtk_statusbar_set_info (struct UgtkStatusbar* statusbar, gint n_selected) { static guint context_id = 0; gchar* string; if (context_id == 0) context_id = gtk_statusbar_get_context_id (statusbar->self, "selected"); gtk_statusbar_pop (statusbar->self, context_id); if (n_selected > 0) { string = g_strdup_printf (_("Selected %d items"), n_selected); gtk_statusbar_push (statusbar->self, context_id, string); g_free (string); } } void ugtk_statusbar_set_speed (struct UgtkStatusbar* statusbar, gint64 down_speed, gint64 up_speed) { char* string; string = ug_str_from_int_unit (down_speed, "/s"); gtk_label_set_text (statusbar->down_speed, string); ug_free (string); string = ug_str_from_int_unit (up_speed, "/s"); gtk_label_set_text (statusbar->up_speed, string); ug_free (string); } uget-2.2.2/ui-gtk/UgtkNodeView.h0000664000175000017500000000556613470304403013342 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_NODE_VIEW_H #define UGTK_NODE_VIEW_H #include #ifdef __cplusplus extern "C" { #endif // GtkTreeViewColumn* column; // column = gtk_tree_view_get_column (tree_view, UGTK_NODE_COLUMN_NAME); // gtk_tree_view_column_set_visible (column, TRUE); typedef enum { UGTK_NODE_COLUMN_STATE = 0, UGTK_NODE_COLUMN_NAME = 1, // Category & Status only UGTK_NODE_COLUMN_QUANTITY = 2, // Download only UGTK_NODE_COLUMN_COMPLETE = 2, // complete size UGTK_NODE_COLUMN_TOTAL, // total size UGTK_NODE_COLUMN_PERCENT, UGTK_NODE_COLUMN_ELAPSED, // consuming time UGTK_NODE_COLUMN_LEFT, // remaining time UGTK_NODE_COLUMN_SPEED, UGTK_NODE_COLUMN_UPLOAD_SPEED, // torrent UGTK_NODE_COLUMN_UPLOADED, // torrent UGTK_NODE_COLUMN_RATIO, // torrent UGTK_NODE_COLUMN_RETRY, UGTK_NODE_COLUMN_CATEGORY, // category name UGTK_NODE_COLUMN_URI, UGTK_NODE_COLUMN_ADDED_ON, UGTK_NODE_COLUMN_COMPLETED_ON, UGTK_NODE_N_COLUMNS, } UgtkNodeColumn; // return GtkTreeView GtkWidget* ugtk_node_view_new_for_download (void); GtkWidget* ugtk_node_view_new_for_category (void); GtkWidget* ugtk_node_view_new_for_state (void); void ugtk_node_view_use_large_icon (GtkTreeView* view, gboolean is_large, int fixed_width); #ifdef __cplusplus } #endif #endif // UGTK_NODE_VIEW_H uget-2.2.2/ui-gtk/UgtkTraveler.h0000664000175000017500000001035713470304403013400 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_TRAVELER_H #define UGTK_TRAVELER_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif // Uget GTK node Traveler typedef struct UgtkTraveler UgtkTraveler; typedef struct UgtkApp UgtkApp; struct UgtkTraveler { UgtkApp* app; struct { GtkWidget* self; GtkTreeView* view; UgtkNodeList* model; struct { // pos_last used by "cursor-changed" signal handler // if selection changed by user, pos != pos_last. int pos; int pos_last; UgetNode* node; } cursor; } state; struct { GtkWidget* self; GtkTreeView* view; UgtkNodeTree* model; struct { // pos_last used by "cursor-changed" signal handler // if selection changed by user, pos != pos_last. int pos; int pos_last; UgetNode* node; } cursor; } category; struct { GtkWidget* self; GtkTreeView* view; UgtkNodeTree* model; struct { // pos_last used by "cursor-changed" signal handler // if selection changed by user, pos != pos_last. int pos; int pos_last; UgetNode* node; } cursor; } download; // ugtk_traveler_reserve_selection() // ugtk_traveler_restore_selection() struct { GList* list; UgetNode* node; } reserved; }; void ugtk_traveler_init (UgtkTraveler* traveler, UgtkApp* app); void ugtk_traveler_select_category (UgtkTraveler* traveler, int nth_category, int nth_state); // get download iter void ugtk_traveler_set_cursor (UgtkTraveler* traveler, UgetNode* dnode); UgetNode* ugtk_traveler_get_cursor (UgtkTraveler* traveler); gboolean ugtk_traveler_get_iter (UgtkTraveler* traveler, GtkTreeIter* iter, UgetNode* dnode); // return all selected download node (reverse order) GList* ugtk_traveler_get_selected (UgtkTraveler* traveler); void ugtk_traveler_set_selected (UgtkTraveler* traveler, GList* nodes); GList* ugtk_traveler_reserve_selection (UgtkTraveler* traveler); void ugtk_traveler_restore_selection (UgtkTraveler* traveler); gint ugtk_traveler_move_selected_up (UgtkTraveler* traveler); gint ugtk_traveler_move_selected_down (UgtkTraveler* traveler); gint ugtk_traveler_move_selected_top (UgtkTraveler* traveler); gint ugtk_traveler_move_selected_bottom (UgtkTraveler* traveler); void ugtk_traveler_set_sorting (UgtkTraveler* traveler, gboolean user_sortable, UgtkNodeColumn nth_column, GtkSortType type); #ifdef __cplusplus } #endif #endif // UGTK_TRAVELER_H uget-2.2.2/ui-gtk/UgtkBanner.h0000664000175000017500000000472113470304403013017 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_BANNER_H #define UGTK_BANNER_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkBanner UgtkBanner; // -------------------------------- // Banner struct UgtkBanner { GtkWidget* self; GtkTextView* text_view; GtkTextBuffer* buffer; GtkTextTag* tag_link; int show_builtin; uint8_t hovering_over_link; char* link; struct { UgetRss* self; UgetRssFeed* feed; UgetRssItem* item; } rss; } banner; void ugtk_banner_init (UgtkBanner* banner); void ugtk_banner_show (UgtkBanner* banner, const char* title, const char* url); int ugtk_banner_show_rss (UgtkBanner* banner, UgetRss* urss); void ugtk_banner_show_donation (UgtkBanner* banner); void ugtk_banner_show_survey (UgtkBanner* banner); #ifdef __cplusplus } #endif #endif // UGTK_BANNER_H uget-2.2.2/ui-gtk/UgtkNodeTree.c0000664000175000017500000005020713470304403013312 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ /* * This file base on GTK+ 2.0 Tree View Tutorial - custom-list.c */ #include #define NODE_TREE_N_COLUMNS 1 /* boring declarations of local functions */ static void init (UgtkNodeTree* ugtree); static void class_init (UgtkNodeTreeClass *klass); static void tree_model_init (GtkTreeModelIface *iface); static void finalize (GObject* object); static GtkTreeModelFlags get_flags (GtkTreeModel* tree_model); static gint get_n_columns (GtkTreeModel* tree_model); static GType get_column_type (GtkTreeModel* tree_model, gint index); static gboolean get_iter (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreePath* path); static GtkTreePath* get_path (GtkTreeModel* tree_model, GtkTreeIter* iter); static void get_value (GtkTreeModel* tree_model, GtkTreeIter* iter, gint column, GValue* value); static gboolean iter_next (GtkTreeModel* tree_model, GtkTreeIter* iter); static gboolean iter_children (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent); static gboolean iter_has_child (GtkTreeModel* tree_model, GtkTreeIter* iter); static gint iter_n_children (GtkTreeModel* tree_model, GtkTreeIter* iter); static gboolean iter_nth_child (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent, gint n); static gboolean iter_parent (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* child); static GObjectClass* parent_class = NULL; /* GObject stuff - nothing to worry about */ /***************************************************************************** * * class_init: more boilerplate GObject/GType stuff. * Init callback for the type system, * called once when our new class is created. * *****************************************************************************/ static void class_init (UgtkNodeTreeClass* klass) { GObjectClass *object_class; parent_class = (GObjectClass*) g_type_class_peek_parent (klass); object_class = (GObjectClass*) klass; object_class->finalize = finalize; } /***************************************************************************** * * tree_model_init: init callback for the interface registration * in ugtk_node_tree_get_type. Here we override * the GtkTreeModel interface functions that * we implement. * *****************************************************************************/ static void tree_model_init (GtkTreeModelIface* iface) { iface->get_flags = get_flags; iface->get_n_columns = get_n_columns; iface->get_column_type = get_column_type; iface->get_iter = get_iter; iface->get_path = get_path; iface->get_value = get_value; iface->iter_next = iter_next; iface->iter_children = iter_children; iface->iter_has_child = iter_has_child; iface->iter_n_children = iter_n_children; iface->iter_nth_child = iter_nth_child; iface->iter_parent = iter_parent; } /***************************************************************************** * * init: this is called everytime a new object object * instance is created (we do that in g_object_new). * Initialise the list structure's fields here. * *****************************************************************************/ static void init (UgtkNodeTree* utree) { utree->stamp = g_random_int(); /* Random int to check whether an iter belongs to our model */ } /***************************************************************************** * * finalize: this is called just before a object is * destroyed. Free dynamically allocated memory here. * *****************************************************************************/ static void finalize (GObject* object) { // UgtkNodeTree *utree = UGTK_NODE_TREE(object); // must chain up - finalize parent (*parent_class->finalize) (object); } /***************************************************************************** * * get_flags: tells the rest of the world whether our tree model * has any special characteristics. In our case, * we have a list model (instead of a tree), and each * tree iter is valid as long as the row in question * exists, as it only contains a pointer to our struct. * *****************************************************************************/ static GtkTreeModelFlags get_flags (GtkTreeModel* tree_model) { g_return_val_if_fail (UGTK_IS_NODE_TREE(tree_model), (GtkTreeModelFlags)0); if (UGTK_NODE_TREE (tree_model)->list_only) return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST); else return (GTK_TREE_MODEL_ITERS_PERSIST); } /***************************************************************************** * * get_n_columns: tells the rest of the world how many data * columns we export via the tree model interface * *****************************************************************************/ static gint get_n_columns (GtkTreeModel* tree_model) { g_return_val_if_fail (UGTK_IS_NODE_TREE(tree_model), 0); return NODE_TREE_N_COLUMNS; } /***************************************************************************** * * get_column_type: tells the rest of the world which type of * data an exported model column contains * *****************************************************************************/ static GType get_column_type (GtkTreeModel* tree_model, gint index) { g_return_val_if_fail (UGTK_IS_NODE_TREE(tree_model), G_TYPE_INVALID); g_return_val_if_fail (index < NODE_TREE_N_COLUMNS && index >= 0, G_TYPE_INVALID); return G_TYPE_POINTER; } /***************************************************************************** * * get_iter: converts a tree path (physical position) into a * tree iter structure (the content of the iter * fields will only be used internally by our model). * We simply store a pointer to our CustomRecord * structure that represents that row in the tree iter. * *****************************************************************************/ static gboolean get_iter (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreePath* path) { UgtkNodeTree* utree; UgetNode* node; gint* indices; gint n, depth; g_assert (UGTK_IS_NODE_TREE(tree_model)); g_assert (path != NULL); utree = UGTK_NODE_TREE(tree_model); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); // prefix.root if (utree->prefix.root) { n = utree->prefix.len; if (n > utree->prefix.root->n_children || n == 0) n = utree->prefix.root->n_children; if (indices[0] < n) node = uget_node_nth_child (utree->prefix.root, indices[0]); else if (utree->root) node = uget_node_nth_child (utree->root, indices[0] - n); else return FALSE; for (n = 1; n < depth; n++) { if (node == NULL) return FALSE; node = uget_node_nth_child (node, indices[n]); } } else { for (node = utree->root, n = 0; n < depth; n++) { if (node == NULL) return FALSE; node = uget_node_nth_child (node, indices[n]); } } if (node == NULL) return FALSE; else { // We store a pointer to UgetNode in the iter iter->stamp = utree->stamp; iter->user_data = node; iter->user_data2 = NULL; /* unused */ iter->user_data3 = NULL; /* unused */ return TRUE; } } /***************************************************************************** * * get_path: converts a tree iter into a tree path (ie. the * physical position of that row in the list). * *****************************************************************************/ static GtkTreePath* get_path (GtkTreeModel* tree_model, GtkTreeIter* iter) { GtkTreePath* path; UgtkNodeTree* utree; UgetNode* node; gint n; g_return_val_if_fail (UGTK_IS_NODE_TREE(tree_model), NULL); g_return_val_if_fail (iter != NULL, NULL); g_return_val_if_fail (iter->user_data != NULL, NULL); node = iter->user_data; path = gtk_tree_path_new(); utree = UGTK_NODE_TREE (tree_model); // prefix.root if (utree->prefix.root) { n = utree->prefix.len; if (n > utree->prefix.root->n_children || n == 0) n = utree->prefix.root->n_children; while (node->parent) { if (node->parent == utree->prefix.root) { gtk_tree_path_prepend_index (path, uget_node_child_position (node->parent, node)); return path; } else if (node->parent == utree->root) { gtk_tree_path_prepend_index (path, uget_node_child_position (node->parent, node) + n); return path; } gtk_tree_path_prepend_index (path, uget_node_child_position (node->parent, node)); node = node->parent; } } else { while (node->parent && node != utree->root) { gtk_tree_path_prepend_index (path, uget_node_child_position (node->parent, node)); node = node->parent; } } return path; } /***************************************************************************** * * get_value: Returns a row's exported data columns * (_get_value is what gtk_tree_model_get uses) * *****************************************************************************/ static void get_value (GtkTreeModel* tree_model, GtkTreeIter* iter, gint column, GValue* value) { // UgtkNodeTree* utree; g_return_if_fail (UGTK_IS_NODE_TREE (tree_model)); g_return_if_fail (iter != NULL); g_return_if_fail (column < NODE_TREE_N_COLUMNS); g_value_init (value, G_TYPE_POINTER); // utree = UGTK_NODE_TREE (tree_model); g_value_set_pointer (value, iter->user_data); } /***************************************************************************** * * iter_next: Takes an iter structure and sets it to point * to the next row. * *****************************************************************************/ static gboolean iter_next (GtkTreeModel* tree_model, GtkTreeIter* iter) { UgtkNodeTree* utree; UgetNode* node; gint n; g_return_val_if_fail (UGTK_IS_NODE_TREE (tree_model), FALSE); utree = UGTK_NODE_TREE (tree_model); node = iter->user_data; if (node == NULL) return FALSE; // prefix.root if (utree->prefix.root && utree->prefix.root == node->parent) { n = utree->prefix.len; if (n > utree->prefix.root->n_children || n == 0) n = utree->prefix.root->n_children; if (uget_node_child_position (node->parent, node) == n - 1) { if (utree->root == NULL || utree->root->children == NULL) return FALSE; iter->stamp = utree->stamp; iter->user_data = utree->root->children; return TRUE; } } if (node->next == NULL) return FALSE; else { iter->stamp = utree->stamp; iter->user_data = node->next; return TRUE; } } /***************************************************************************** * * iter_children: Returns TRUE or FALSE depending on whether * the row specified by 'parent' has any children. * If it has children, then 'iter' is set to * point to the first child. Special case: if * 'parent' is NULL, then the first top-level * row should be returned if it exists. * *****************************************************************************/ static gboolean iter_children (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent) { UgtkNodeTree* utree; UgetNode* node; g_return_val_if_fail (UGTK_IS_NODE_TREE (tree_model), FALSE); utree = UGTK_NODE_TREE (tree_model); // parent == NULL is a special case; we need to return the first top-level row if (parent) node = parent->user_data; else { // prefix.root if (utree->prefix.root && utree->prefix.root->children) { iter->stamp = utree->stamp; iter->user_data = utree->prefix.root->children; return TRUE; } node = utree->root; } // Set iter to first child item. if (node == NULL || node->children == NULL) return FALSE; else { iter->stamp = utree->stamp; iter->user_data = node->children; return TRUE; } } /***************************************************************************** * * iter_has_child: Returns TRUE or FALSE depending on whether * the row specified by 'iter' has any children. * We only have a list and thus no children. * *****************************************************************************/ static gboolean iter_has_child (GtkTreeModel* tree_model, GtkTreeIter* iter) { UgetNode* node; node = iter->user_data; if (node->children == NULL) return FALSE; else return TRUE; } /***************************************************************************** * * iter_n_children: Returns the number of children the row * specified by 'iter' has. This is usually 0, * as we only have a list and thus do not have * any children to any rows. A special case is * when 'iter' is NULL, in which case we need * to return the number of top-level nodes, * ie. the number of rows in our list. * *****************************************************************************/ static gint iter_n_children (GtkTreeModel* tree_model, GtkTreeIter* iter) { UgtkNodeTree* utree; UgetNode* node; gint n = 0; g_return_val_if_fail (UGTK_IS_NODE_TREE (tree_model), -1); if (iter == NULL) { utree = UGTK_NODE_TREE (tree_model); // prefix.root if (utree->prefix.root) { n = utree->prefix.len; if (n > utree->prefix.root->n_children || n == 0) n = utree->prefix.root->n_children; } if (utree->root) n += utree->root->n_children; return n; } node = iter->user_data; return node->n_children; } /***************************************************************************** * * iter_nth_child: If the row specified by 'parent' has any * children, set 'iter' to the n-th child and * return TRUE if it exists, otherwise FALSE. * A special case is when 'parent' is NULL, in * which case we need to set 'iter' to the n-th * row if it exists. * *****************************************************************************/ static gboolean iter_nth_child (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* parent, gint n) { UgtkNodeTree* utree; UgetNode* node; gint n_prefix; g_return_val_if_fail (UGTK_IS_NODE_TREE (tree_model), FALSE); utree = UGTK_NODE_TREE (tree_model); // special case: if parent == NULL, set iter to n-th top-level row if (parent) node = parent->user_data; else { // prefix.root if (utree->prefix.root) { n_prefix = utree->prefix.len; if (n_prefix > utree->prefix.root->n_children) n_prefix = utree->prefix.root->n_children; if (n >= n_prefix) n -= n_prefix; else { iter->stamp = utree->stamp; iter->user_data = uget_node_nth_child (utree->prefix.root, n); return TRUE; } } node = utree->root; } if (node == NULL || n >= node->n_children) return FALSE; else { iter->stamp = utree->stamp; iter->user_data = uget_node_nth_child (node, n); return TRUE; } } /***************************************************************************** * * iter_parent: Point 'iter' to the parent node of 'child'. As * we have a list and thus no children and no * parents of children, we can just return FALSE. * *****************************************************************************/ static gboolean iter_parent (GtkTreeModel* tree_model, GtkTreeIter* iter, GtkTreeIter* child) { UgtkNodeTree* utree; UgetNode* node; if (child == NULL || child->user_data == NULL) return FALSE; utree = UGTK_NODE_TREE (tree_model); node = child->user_data; // prefix.root if (node->parent == utree->prefix.root) return FALSE; if (node->parent == utree->root) return FALSE; else { iter->stamp = utree->stamp; iter->user_data = node->parent; return TRUE; } } /***************************************************************************** * * ugtk_node_tree_get_type: here we register our new type and its interfaces * with the type system. If you want to implement * additional interfaces like GtkTreeSortable, you * will need to do it here. * *****************************************************************************/ GType ugtk_node_tree_get_type (void) { static GType ugtk_node_tree_type = 0; /* Some boilerplate type registration stuff */ if (ugtk_node_tree_type == 0) { static const GTypeInfo ugtk_node_tree_info = { sizeof (UgtkNodeTreeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) class_init, NULL, /* class finalize */ NULL, /* class_data */ sizeof (UgtkNodeTree), 0, /* n_preallocs */ (GInstanceInitFunc) init }; static const GInterfaceInfo tree_model_info = { (GInterfaceInitFunc) tree_model_init, NULL, NULL }; /* First register the new derived type with the GObject type system */ ugtk_node_tree_type = g_type_register_static (G_TYPE_OBJECT, "UgtkNodeTree", &ugtk_node_tree_info, (GTypeFlags)0); /* Now register our GtkTreeModel interface with the type system */ g_type_add_interface_static (ugtk_node_tree_type, GTK_TYPE_TREE_MODEL, &tree_model_info); } return ugtk_node_tree_type; } /***************************************************************************** * * ugtk_node_tree_new: This is what you use in your own code to create a * new uget tree model for you to use. * *****************************************************************************/ UgtkNodeTree* ugtk_node_tree_new (UgetNode* root, gboolean list_only) { UgtkNodeTree* utree; utree = (UgtkNodeTree*) g_object_new (UGTK_TYPE_NODE_TREE, NULL); utree->root = root; utree->list_only = list_only; g_assert( utree != NULL ); return utree; } void ugtk_node_tree_set_prefix (UgtkNodeTree* utree, UgetNode* prefix_root, gint prefix_len) { utree->prefix.root = prefix_root; utree->prefix.len = prefix_len; } uget-2.2.2/ui-gtk/UgtkSelector.h0000664000175000017500000001026513470304403013372 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SELECTOR_H #define UGTK_SELECTOR_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkSelector UgtkSelector; typedef struct UgtkSelectorPage UgtkSelectorPage; typedef void (*UgtkSelectorNotify) (gpointer user_data, gboolean completed); // ---------------------------------------------------------------------------- // UgtkSelector // struct UgtkSelector { GtkWidget* self; // GtkVBox GtkWindow* parent; // parent window of UgtkSelector.self GtkNotebook* notebook; // GtkWidget* href_label; GtkEntry* href_entry; // entry for hypertext reference GtkWidget* href_separator; // select button GtkWidget* select_all; GtkWidget* select_none; GtkWidget* select_filter; // select by filter // UgtkSelectorPage is placed in array GArray* pages; // UgtkSelectorFilter use UgtkSelectorFilterData in UgtkSelectorPage struct UgtkSelectorFilter { GtkDialog* dialog; GtkTreeView* host_view; GtkTreeView* ext_view; } filter; // callback struct { UgtkSelectorNotify func; gpointer data; } notify; }; void ugtk_selector_init (UgtkSelector* selector, GtkWindow* parent); void ugtk_selector_finalize (UgtkSelector* selector); void ugtk_selector_hide_href (UgtkSelector* selector); // (gchar*) list->data. // To free the returned value, use: // g_list_free_full (list, (GDestroyNotify) g_free); GList* ugtk_selector_get_marked_uris (UgtkSelector* selector); // count marked item and notify gint ugtk_selector_count_marked (UgtkSelector* selector); gint ugtk_selector_n_items (UgtkSelector* selector); UgtkSelectorPage* ugtk_selector_add_page (UgtkSelector* selector, const gchar* title); UgtkSelectorPage* ugtk_selector_get_page (UgtkSelector* selector, gint nth_page); // ---------------------------------------------------------------------------- // UgtkSelectorPage // struct UgtkSelectorPage { GtkWidget* self; // GtkScrolledWindow GtkTreeView* view; GtkListStore* store; // total marked count gint n_marked; // used by UgtkSelectorFilter struct UgtkSelectorFilterData { GHashTable* hash; GtkListStore* host; GtkListStore* ext; } filter; }; void ugtk_selector_page_init (UgtkSelectorPage* page); void ugtk_selector_page_finalize (UgtkSelectorPage* page); // return numbers of uri added int ugtk_selector_page_add_uris (UgtkSelectorPage* page, GList* uris); void ugtk_selector_page_make_filter (UgtkSelectorPage* page); void ugtk_selector_page_mark_by_filter_all (UgtkSelectorPage* page); #ifdef __cplusplus } #endif #endif // End of UGTK_SELECTOR_H uget-2.2.2/ui-gtk/UgtkBatchDialog.h0000664000175000017500000000652113470304403013753 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_BATCH_DIALOG_H #define UGTK_BATCH_DIALOG_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkBatchDialog UgtkBatchDialog; struct UgtkBatchDialog { UGTK_NODE_DIALOG_MEMBERS; /* // ------ UgtkNodeDialog members ------ GtkDialog* self; GtkBox* hbox; GtkWidget* notebook; GtkTreeView* node_view; UgtkNodeTree* node_tree; gulong handler_id[3]; UgtkApp* app; UgetNode* note; UgData* node_data; UgtkProxyForm proxy; UgtkDownloadForm download; UgtkCategoryForm category; */ UgtkSelector selector; UgtkSequence sequencer; }; UgtkBatchDialog* ugtk_batch_dialog_new (const char* title, UgtkApp* app); void ugtk_batch_dialog_free (UgtkBatchDialog* bdialog); void ugtk_batch_dialog_use_selector (UgtkBatchDialog* bdialog); void ugtk_batch_dialog_use_sequencer (UgtkBatchDialog* bdialog); // enable/disable category node list view in left side // return index of selected category #define ugtk_batch_dialog_get_category(bdialog, cnode) \ ugtk_node_dialog_get_category((UgtkNodeDialog*) bdialog, cnode) #define ugtk_batch_dialog_set_category(bdialog, cnode) \ ugtk_node_dialog_set_category((UgtkNodeDialog*) bdialog, cnode) // void ugtk_batch_dialog_apply_recent (UgtkNodeDialog* ndialog, UgtkApp* app); #define ugtk_batch_dialog_apply_recent(bdialog, app) \ ugtk_node_dialog_apply_recent((UgtkNodeDialog*) bdialog, app); void ugtk_batch_dialog_disable_batch (UgtkBatchDialog* bdialog); void ugtk_batch_dialog_run (UgtkBatchDialog* bdialog); #ifdef __cplusplus } #endif #endif // End of UGTK_BATCH_DIALOG_H uget-2.2.2/ui-gtk/UgtkSettingForm.h0000664000175000017500000001513713470304403014056 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SETTING_FORM_H #define UGTK_SETTING_FORM_H #include #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // UgtkClipboardForm struct UgtkClipboardForm { GtkWidget* self; GtkWidget* pattern; // GtkTextView GtkTextBuffer* buffer; GtkToggleButton* monitor; GtkToggleButton* quiet; // add download to Nth category GtkWidget* nth_label; GtkSpinButton* nth_spin; // Monitor media website address GtkToggleButton* website; }; void ugtk_clipboard_form_init (struct UgtkClipboardForm* cbform); void ugtk_clipboard_form_set (struct UgtkClipboardForm* cbform, UgtkSetting* setting); void ugtk_clipboard_form_get (struct UgtkClipboardForm* cbform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkUserInterfaceForm struct UgtkUserInterfaceForm { GtkWidget* self; GtkToggleButton* confirm_exit; GtkToggleButton* confirm_delete; GtkToggleButton* show_trayicon; GtkToggleButton* start_in_tray; GtkToggleButton* close_to_tray; GtkToggleButton* start_in_offline_mode; GtkToggleButton* start_notification; GtkToggleButton* sound_notification; GtkToggleButton* apply_recent; GtkToggleButton* skip_existing; GtkToggleButton* large_icon; #ifdef HAVE_APP_INDICATOR GtkToggleButton* app_indicator; #endif }; void ugtk_user_interface_form_init (struct UgtkUserInterfaceForm* uiform); void ugtk_user_interface_form_set (struct UgtkUserInterfaceForm* uiform, UgtkSetting* setting); void ugtk_user_interface_form_get (struct UgtkUserInterfaceForm* uiform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkBandwidthForm struct UgtkBandwidthForm { GtkWidget* self; GtkSpinButton* upload; GtkSpinButton* download; }; void ugtk_bandwidth_form_init (struct UgtkBandwidthForm* bwform); void ugtk_bandwidth_form_set (struct UgtkBandwidthForm* bwform, UgtkSetting* setting); void ugtk_bandwidth_form_get (struct UgtkBandwidthForm* bwform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkCompletionForm struct UgtkCompletionForm { GtkWidget* self; GtkEntry* command; GtkEntry* on_error; }; void ugtk_completion_form_init (struct UgtkCompletionForm* csform); void ugtk_completion_form_set (struct UgtkCompletionForm* csform, UgtkSetting* setting); void ugtk_completion_form_get (struct UgtkCompletionForm* csform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkAutoSaveForm struct UgtkAutoSaveForm { GtkWidget* self; // auto save and interval GtkToggleButton* enable; GtkWidget* interval_label; GtkSpinButton* interval_spin; GtkWidget* minutes_label; // minutes }; void ugtk_auto_save_form_init (struct UgtkAutoSaveForm* asform); void ugtk_auto_save_form_set (struct UgtkAutoSaveForm* asform, UgtkSetting* setting); void ugtk_auto_save_form_get (struct UgtkAutoSaveForm* asform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkCommandlineForm struct UgtkCommandlineForm { GtkWidget* self; // --quiet GtkToggleButton* quiet; // --category-index GtkWidget* index_label; GtkSpinButton* index_spin; }; void ugtk_commandline_form_init (struct UgtkCommandlineForm* clform); void ugtk_commandline_form_set (struct UgtkCommandlineForm* clform, UgtkSetting* setting); void ugtk_commandline_form_get (struct UgtkCommandlineForm* clform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkPluginForm struct UgtkPluginForm { GtkWidget* self; GtkComboBoxText* order; // Aria2 options GtkWidget* aria2_opts; GtkToggleButton* launch; GtkToggleButton* shutdown; GtkEntry* uri; GtkEntry* token; GtkWidget* local; // GtkFrame GtkEntry* path; GtkWidget* args; // GtkTextView GtkTextBuffer* args_buffer; // Speed Limits for Aria2 GtkSpinButton* upload; // KiB/s GtkSpinButton* download; // KiB/s }; void ugtk_plugin_form_init (struct UgtkPluginForm* psform); void ugtk_plugin_form_set (struct UgtkPluginForm* psform, UgtkSetting* setting); void ugtk_plugin_form_get (struct UgtkPluginForm* psform, UgtkSetting* setting); // ---------------------------------------------------------------------------- // UgtkMediaWebsiteForm struct UgtkMediaWebsiteForm { GtkWidget* self; GtkComboBoxText* match_mode; GtkComboBoxText* quality; GtkComboBoxText* type; }; void ugtk_media_website_form_init (struct UgtkMediaWebsiteForm* mwform); void ugtk_media_website_form_set (struct UgtkMediaWebsiteForm* mwform, UgtkSetting* setting); void ugtk_media_website_form_get (struct UgtkMediaWebsiteForm* mwform, UgtkSetting* setting); #ifdef __cplusplus } #endif #endif // End of UGTK_SETTING_FORM_H uget-2.2.2/ui-gtk/UgtkApp.h0000664000175000017500000002233613470304403012334 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_APP_H #define UGTK_APP_H #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define UGTK_APP_DIR "uGet" #define UGTK_APP_NAME "uGet" #define UGTK_APP_ICON_NAME "uget-icon" #define UGTK_APP_ACCEL_PATH_NEW "/File/New" #define UGTK_APP_ACCEL_PATH_LOAD "/File/Load" #define UGTK_APP_ACCEL_PATH_SAVE "/File/Save" #define UGTK_APP_ACCEL_PATH_SAVE_ALL "/File/SaveAll" #define UGTK_APP_ACCEL_PATH_DELETE "/Download/Delete" #define UGTK_APP_ACCEL_PATH_DELETE_F "/Download/DeleteFile" #define UGTK_APP_ACCEL_PATH_OPEN "/Download/Open" #define UGTK_APP_ACCEL_PATH_OPEN_F "/Download/OpenFolder" #define UGTK_APP_ACCEL_PATH_SWITCH "/Download/SwitchState" typedef struct UgtkApp UgtkApp; struct UgtkApp { UGET_APP_MEMBERS; /* // ------ UgetApp members ------ UgetNode real; // real root node for real nodes UgetNode split; // virtual root UgetNode sorted; // virtual root UgetNode sorted_split; // virtual root UgetNode mix; // virtual root UgetNode mix_split; // virtual root UgRegistry infos; UgRegistry plugins; UgetPluginInfo* plugin_default; UgetTask task; UgArrayPtr nodes; void* uri_hash; char* config_dir; int n_error; // uget_app_grow() will count these value: int n_moved; // n_error, n_moved, n_deleted, and int n_deleted; // n_completed int n_completed; // */ UgetRpc* rpc; UgtkSetting setting; UgtkScheduleState schedule_state; // recent download settings struct { UgInfo* info; int category_index; int saved; } recent; // status gboolean user_action; // RSS UgetRss* rss_builtin; // Built-in RSS // Clipboard struct UgtkClipboard { GtkClipboard* self; gchar* text; GRegex* regex; gboolean processing; // monitor storage or media website gboolean website; } clipboard; // dialogs struct UgtkDialogs { GtkWidget* error; GtkWidget* message; GtkWidget* exit_confirmation; GtkWidget* delete_confirmation; GtkWidget* delete_category_confirmation; GtkWidget* setting; } dialogs; // ------------------------------------------------------- // GUI: Main Window and Tray Icon GtkAccelGroup* accel_group; UgtkTrayIcon trayicon; UgtkBanner banner; UgtkMenubar menubar; UgtkSummary summary; UgtkTraveler traveler; // (UgetNode) node traveler // -------------------------------- // Main Window (initialize in UgtkApp-ui.c) struct UgtkWindow { GtkWindow* self; GtkPaned* hpaned; // separate left side and right side GtkPaned* vpaned; // right side (UgtkTreeView and UgtkSummary) } window; // -------------------------------- // status bar (initialize in UgtkApp-ui.c) struct UgtkStatusbar { GtkStatusbar* self; GtkLabel* down_speed; GtkLabel* up_speed; } statusbar; // -------------------------------- // Toolbar (initialize in UgtkApp-ui.c) struct UgtkToolbar { GtkWidget* self; // GtkBox GtkWidget* toolbar; // GtkToolItem GtkWidget* create; // GtkMenuItem // menu for tool button GtkWidget* create_download; GtkWidget* create_category; GtkWidget* create_clipboard; GtkWidget* create_sequence; GtkWidget* create_torrent; GtkWidget* create_metalink; // GtkToolItem GtkWidget* save; GtkWidget* runnable; GtkWidget* pause; GtkWidget* properties; GtkWidget* move_up; GtkWidget* move_down; GtkWidget* move_top; GtkWidget* move_bottom; } toolbar; }; void ugtk_app_init (UgtkApp* app, UgetRpc* ipc); void ugtk_app_final (UgtkApp* app); // UgtkApp-ui.c, UgtkApp-callback.c, and UgtkApp-timeout.c void ugtk_app_init_ui (UgtkApp* app); void ugtk_app_init_callback (UgtkApp* app); void ugtk_app_init_timeout (UgtkApp* app); void ugtk_app_save (UgtkApp* app); void ugtk_app_load (UgtkApp* app); void ugtk_app_quit (UgtkApp* app); // set UgtkSetting from/to UgtkApp void ugtk_app_get_window_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_window_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_get_column_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_column_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_plugin_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_other_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_menu_setting (UgtkApp* app, UgtkSetting* setting); void ugtk_app_set_ui_setting (UgtkApp* app, UgtkSetting* setting); // decide sensitive or visible void ugtk_app_decide_download_sensitive (UgtkApp* app); void ugtk_app_decide_category_sensitive (UgtkApp* app); void ugtk_app_decide_trayicon_visible (UgtkApp* app); void ugtk_app_decide_to_quit (UgtkApp* app); // create node by UI void ugtk_app_create_category (UgtkApp* app); void ugtk_app_create_download (UgtkApp* app, const char* sub_title, const char* uri); // delete selected node void ugtk_app_delete_category (UgtkApp* app); void ugtk_app_delete_download (UgtkApp* app, gboolean delete_files); // edit selected node void ugtk_app_edit_category (UgtkApp* app); void ugtk_app_edit_download (UgtkApp* app); // queue/pause void ugtk_app_queue_download (UgtkApp* app, gboolean keep_active); void ugtk_app_pause_download (UgtkApp* app); void ugtk_app_switch_download_state (UgtkApp* app); // move selected node void ugtk_app_move_download_up (UgtkApp* app); void ugtk_app_move_download_down (UgtkApp* app); void ugtk_app_move_download_top (UgtkApp* app); void ugtk_app_move_download_bottom (UgtkApp* app); void ugtk_app_move_download_to (UgtkApp* app, UgetNode* cnode); // torrent & metalink void ugtk_app_create_torrent (UgtkApp* app); void ugtk_app_create_metalink (UgtkApp* app); // import/export void ugtk_app_save_category (UgtkApp* app); void ugtk_app_load_category (UgtkApp* app); void ugtk_app_import_html_file (UgtkApp* app); void ugtk_app_import_text_file (UgtkApp* app); void ugtk_app_export_text_file (UgtkApp* app); // batch void ugtk_app_sequence_batch (UgtkApp* app); void ugtk_app_clipboard_batch (UgtkApp* app); int ugtk_app_filter_existing (UgtkApp* app, GList* uris); // emit signal "row-changed" for UgtkNodeTree and UgtkNodeList void ugtk_app_download_changed (UgtkApp* app, UgetNode* dnode); void ugtk_app_category_changed (UgtkApp* app, UgetNode* cnode); void ugtk_app_add_default_category (UgtkApp* app); void ugtk_app_show_message (UgtkApp* app, GtkMessageType type, const gchar* message); // -------------------------------------------------------- // UgClipboard void ugtk_clipboard_init (struct UgtkClipboard* clipboard, const gchar* pattern); void ugtk_clipboard_set_pattern (struct UgtkClipboard* clipboard, const gchar* pattern); void ugtk_clipboard_set_text (struct UgtkClipboard* clipboard, gchar* text); GList* ugtk_clipboard_get_uris (struct UgtkClipboard* clipboard); GList* ugtk_clipboard_get_matched (struct UgtkClipboard* clipboard, const gchar* text); // -------------------------------------------------------- // UgStatusbar void ugtk_statusbar_set_info (struct UgtkStatusbar* statusbar, gint n_selected); void ugtk_statusbar_set_speed (struct UgtkStatusbar* statusbar, gint64 down_speed, gint64 up_speed); #ifdef __cplusplus } #endif #endif // UGTK_APP_H uget-2.2.2/ui-gtk/UgtkSelector.c0000664000175000017500000006342113470304403013367 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include // UGTK_APP_NAME #include // ---------------------------------------------------------------------------- // UgtkSelectorItem // typedef struct UgtkSelectorItem UgtkSelectorItem; struct UgtkSelectorItem { gboolean mark; gchar* uri; void* data; }; // GtkListStore for UgtkSelectorItem static GList* ugtk_selector_store_get_marked (GtkListStore* store, GList* list); static void ugtk_selector_store_set_mark_all (GtkListStore* store, gboolean mark); static void ugtk_selector_store_clear (GtkListStore* store); // GtkTreeView for UgtkSelectorItem static GtkTreeView* ugtk_selector_view_new (const gchar* title, gboolean active_toggled); static GtkCellRenderer* ugtk_selector_view_get_renderer_toggle (GtkTreeView* view); // ---------------------------------------------------------------------------- // UgtkSelector // static void ugtk_selector_init_ui (UgtkSelector* selector); static void ugtk_selector_filter_init (struct UgtkSelectorFilter* filter, UgtkSelector* selector); static void ugtk_selector_filter_show (struct UgtkSelectorFilter* filter, UgtkSelectorPage* page); // signal handlers static void on_selector_item_toggled (GtkCellRendererToggle* cell, gchar* path_str, UgtkSelector* selector); static void on_selector_mark_all (GtkWidget* button, UgtkSelector* selector); static void on_selector_mark_none (GtkWidget* button, UgtkSelector* selector); static void on_selector_mark_filter (GtkWidget* button, UgtkSelector* selector); static void on_filter_dialog_response (GtkDialog* dialog, gint response_id, UgtkSelector* selector); static void on_filter_button_all (GtkWidget* widget, GtkTreeView* treeview); static void on_filter_button_none (GtkWidget* widget, GtkTreeView* treeview); void ugtk_selector_init (UgtkSelector* selector, GtkWindow* parent) { selector->parent = parent; ugtk_selector_init_ui (selector); // UgtkSelectorPage initialize selector->pages = g_array_new (FALSE, FALSE, sizeof (UgtkSelectorPage)); // UgtkSelectorFilter initialize ugtk_selector_filter_init (&selector->filter, selector); g_signal_connect (selector->select_all, "clicked", G_CALLBACK (on_selector_mark_all), selector); g_signal_connect (selector->select_none, "clicked", G_CALLBACK (on_selector_mark_none), selector); g_signal_connect (selector->select_filter, "clicked", G_CALLBACK (on_selector_mark_filter), selector); } void ugtk_selector_finalize (UgtkSelector* selector) { UgtkSelectorPage* page; GArray* array; guint index; // UgtkSelectorPage finalize array = selector->pages; for (index=0; index < array->len; index++) { page = &g_array_index (array, UgtkSelectorPage, index); ugtk_selector_page_finalize (page); } g_array_free (selector->pages, TRUE); // UgtkSelectorFilter finalize gtk_widget_destroy (GTK_WIDGET (selector->filter.dialog)); } void ugtk_selector_hide_href (UgtkSelector* selector) { gtk_widget_hide ((GtkWidget*) selector->href_label); gtk_widget_hide ((GtkWidget*) selector->href_entry); gtk_widget_hide ((GtkWidget*) selector->href_separator); } static GList* ugtk_selector_get_marked (UgtkSelector* selector) { UgtkSelectorPage* page; GList* list; guint index; list = NULL; for (index = 0; index < selector->pages->len; index++) { page = &g_array_index (selector->pages, UgtkSelectorPage, index); list = ugtk_selector_store_get_marked (page->store, list); } return g_list_reverse (list); } GList* ugtk_selector_get_marked_uris (UgtkSelector* selector) { UgtkSelectorItem* item; GString* gstr; GList* list; GList* link; const gchar* base_href; list = ugtk_selector_get_marked (selector); base_href = gtk_entry_get_text (selector->href_entry); if (base_href[0] == 0) base_href = NULL; for (link = list; link; link = link->next) { item = link->data; // URI list if (ug_uri_init (NULL, item->uri) == 0 && base_href) { gstr = g_string_new (base_href); if (gstr->str[gstr->len -1] == '/') { if (item->uri[0] == '/') g_string_truncate (gstr, gstr->len -1); } else if (item->uri[0] != '/') g_string_append_c (gstr, '/'); g_string_append (gstr, item->uri); } else gstr = g_string_new (item->uri); link->data = g_string_free (gstr, FALSE); } return list; } gint ugtk_selector_count_marked (UgtkSelector* selector) { gint count; guint index; count = 0; for (index = 0; index < selector->pages->len; index++) { count += g_array_index (selector->pages, UgtkSelectorPage, index).n_marked; // count += page->n_marked; } if (selector->notify.func) selector->notify.func (selector->notify.data, (count) ? TRUE: FALSE); return count; } gint ugtk_selector_n_items (UgtkSelector* selector) { gint count; guint index; UgtkSelectorPage* page; count = 0; for (index = 0; index < selector->pages->len; index++) { page = &g_array_index (selector->pages, UgtkSelectorPage, index); count += gtk_tree_model_iter_n_children (GTK_TREE_MODEL (page->store), NULL); } return count; } UgtkSelectorPage* ugtk_selector_add_page (UgtkSelector* selector, const gchar* title) { GtkCellRenderer* renderer; UgtkSelectorPage* page; GArray* array; array = selector->pages; g_array_set_size (array, array->len + 1); page = &g_array_index (array, UgtkSelectorPage, array->len - 1); ugtk_selector_page_init (page); renderer = ugtk_selector_view_get_renderer_toggle (page->view); g_signal_connect (renderer, "toggled", G_CALLBACK (on_selector_item_toggled), selector); gtk_notebook_append_page (selector->notebook, page->self, gtk_label_new (title)); return page; } UgtkSelectorPage* ugtk_selector_get_page (UgtkSelector* selector, gint nth_page) { UgtkSelectorPage* page; if (nth_page < 0) nth_page = gtk_notebook_get_current_page (selector->notebook); if (nth_page == -1 || nth_page >= (gint)selector->pages->len) return NULL; page = &g_array_index (selector->pages, UgtkSelectorPage, nth_page); return page; } // ---------------------------------------------------------------------------- // UgtkSelectorFilter use UgtkSelectorFilterData in UgtkSelectorPage // static GtkWidget* ugtk_selector_filter_view_init (GtkTreeView* item_view) { GtkSizeGroup* sizegroup; GtkWidget* widget; GtkBox* vbox; GtkBox* hbox; vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); // filter view and it's scrolled window gtk_widget_set_size_request ((GtkWidget*) item_view, 120, 120); widget = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (item_view)); gtk_box_pack_start (vbox, widget, TRUE, TRUE, 2); // button sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_button_new_with_label (_("All")); gtk_size_group_add_widget (sizegroup, widget); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 1); g_signal_connect (widget, "clicked", G_CALLBACK (on_filter_button_all), item_view); widget = gtk_button_new_with_label (_("None")); gtk_size_group_add_widget (sizegroup, widget); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 1); g_signal_connect (widget, "clicked", G_CALLBACK (on_filter_button_none), item_view); return (GtkWidget*) vbox; } static void ugtk_selector_filter_init (struct UgtkSelectorFilter* filter, UgtkSelector* selector) { GtkDialog* dialog; GtkWidget* widget; GtkBox* vbox; GtkBox* hbox; gchar* title; title = g_strconcat (UGTK_APP_NAME " - ", _("Mark by filter"), NULL); dialog = (GtkDialog*) gtk_dialog_new_with_buttons (title, selector->parent, 0, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_free (title); gtk_window_set_modal ((GtkWindow*) dialog, FALSE); // gtk_window_set_resizable ((GtkWindow*) dialog, FALSE); gtk_window_set_destroy_with_parent ((GtkWindow*) dialog, TRUE); gtk_window_set_transient_for ((GtkWindow*) dialog, selector->parent); gtk_window_resize ((GtkWindow*) dialog, 480, 330); g_signal_connect (dialog, "response", G_CALLBACK (on_filter_dialog_response), selector); filter->dialog = dialog; vbox = (GtkBox*) gtk_dialog_get_content_area (dialog); gtk_box_pack_start (vbox, gtk_label_new (_("Mark URLs by host AND filename extension.")), FALSE, FALSE, 3); gtk_box_pack_start (vbox, gtk_label_new (_("This will reset all marks of URLs.")), FALSE, FALSE, 3); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, TRUE, TRUE, 1); // filter view ----------------------- // left side filter->host_view = ugtk_selector_view_new (_("Host"), TRUE); widget = ugtk_selector_filter_view_init (filter->host_view); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 2); // right side (filename extension) filter->ext_view = ugtk_selector_view_new (_("File Ext."), TRUE); widget = ugtk_selector_filter_view_init (filter->ext_view); gtk_box_pack_start (hbox, widget, FALSE, TRUE, 2); gtk_widget_show_all (GTK_WIDGET (vbox)); } static void ugtk_selector_filter_show (struct UgtkSelectorFilter* filter, UgtkSelectorPage* page) { GtkWindow* parent; gtk_tree_view_set_model (filter->host_view, GTK_TREE_MODEL (page->filter.host)); gtk_tree_view_set_model (filter->ext_view, GTK_TREE_MODEL (page->filter.ext)); // disable sensitive of parent window // enable sensitive in function on_filter_dialog_response() parent = gtk_window_get_transient_for ((GtkWindow*) filter->dialog); if (parent) gtk_widget_set_sensitive ((GtkWidget*) parent, FALSE); // create filter dialog if (gtk_window_get_modal (parent)) gtk_dialog_run (filter->dialog); else gtk_widget_show ((GtkWidget*) filter->dialog); } // signal handler ------------------------------ static void on_selector_item_toggled (GtkCellRendererToggle* cell, gchar* path_str, UgtkSelector* selector) { UgtkSelectorPage* page; UgtkSelectorItem* item; GtkTreeIter iter; GtkTreePath* path; GtkTreeModel* model; page = ugtk_selector_get_page (selector, -1); model = GTK_TREE_MODEL (page->store); path = gtk_tree_path_new_from_string (path_str); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, 0, &item, -1); // UgtkSelectorItem.mark item->mark ^= 1; if (item->mark) page->n_marked++; else page->n_marked--; // count and notify ugtk_selector_count_marked (selector); } static void on_selector_mark_all (GtkWidget* button, UgtkSelector* selector) { UgtkSelectorPage* page; page = ugtk_selector_get_page (selector, -1); if (page == NULL) return; ugtk_selector_store_set_mark_all (page->store, TRUE); gtk_widget_queue_draw (GTK_WIDGET (page->view)); // count and notify page->n_marked = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (page->store), NULL); ugtk_selector_count_marked (selector); } static void on_selector_mark_none (GtkWidget* button, UgtkSelector* selector) { UgtkSelectorPage* page; page = ugtk_selector_get_page (selector, -1); if (page == NULL) return; ugtk_selector_store_set_mark_all (page->store, FALSE); gtk_widget_queue_draw (GTK_WIDGET (page->view)); // count and notify page->n_marked = 0; ugtk_selector_count_marked (selector); } static void on_selector_mark_filter (GtkWidget* button, UgtkSelector* selector) { UgtkSelectorPage* page; page = ugtk_selector_get_page (selector, -1); if (page == NULL) return; ugtk_selector_page_make_filter (page); ugtk_selector_filter_show (&selector->filter, page); } static void on_filter_dialog_response (GtkDialog* dialog, gint response_id, UgtkSelector* selector) { UgtkSelectorPage* page; GtkWindow* parent; if (response_id == GTK_RESPONSE_OK) { // update selection of page page = ugtk_selector_get_page (selector, -1); if (page) ugtk_selector_page_mark_by_filter_all (page); } // enable parent window parent = gtk_window_get_transient_for ((GtkWindow*) dialog); if (parent) gtk_widget_set_sensitive ((GtkWidget*) parent, TRUE); // hide filter dialog gtk_widget_hide ((GtkWidget*) dialog); // count and notify ugtk_selector_count_marked (selector); } static void on_filter_button_all (GtkWidget* widget, GtkTreeView* treeview) { GtkListStore* store; store = (GtkListStore*) gtk_tree_view_get_model (treeview); ugtk_selector_store_set_mark_all (store, TRUE); gtk_widget_queue_draw ((GtkWidget*) treeview); } static void on_filter_button_none (GtkWidget* widget, GtkTreeView* treeview) { GtkListStore* store; store = (GtkListStore*) gtk_tree_view_get_model (treeview); ugtk_selector_store_set_mark_all (store, FALSE); gtk_widget_queue_draw ((GtkWidget*) treeview); } // ---------------------------------------------------------------------------- // UgtkSelectorPage // void ugtk_selector_page_init (UgtkSelectorPage* page) { GtkScrolledWindow* scrolled; page->store = gtk_list_store_new (1, G_TYPE_POINTER); page->view = ugtk_selector_view_new (_("URL"), FALSE); gtk_tree_view_set_model (page->view, GTK_TREE_MODEL (page->store)); // scrolled page->self = gtk_scrolled_window_new (NULL, NULL); scrolled = GTK_SCROLLED_WINDOW (page->self); gtk_scrolled_window_set_shadow_type (scrolled, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scrolled, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (page->view)); gtk_widget_show (page->self); // total marked count page->n_marked = 0; // UgtkSelectorFilterData initialize page->filter.hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_list_free); page->filter.host = gtk_list_store_new (1, G_TYPE_POINTER); page->filter.ext = gtk_list_store_new (1, G_TYPE_POINTER); } void ugtk_selector_page_finalize (UgtkSelectorPage* page) { ugtk_selector_store_clear (page->store); g_object_unref (page->store); // UgtkSelectorFilterData finalize g_hash_table_destroy (page->filter.hash); ugtk_selector_store_clear (page->filter.host); g_object_unref (page->filter.host); ugtk_selector_store_clear (page->filter.ext); g_object_unref (page->filter.ext); } int ugtk_selector_page_add_uris (UgtkSelectorPage* page, GList* uris) { GtkTreeIter iter; UgtkSelectorItem* item; int counts; for (counts = 0; uris; uris = uris->next) { if (uris->data == NULL) continue; counts++; item = g_slice_alloc (sizeof (UgtkSelectorItem)); item->mark = TRUE; item->uri = uris->data; item->data = NULL; uris->data = NULL; // item->uri gtk_list_store_append (page->store, &iter); gtk_list_store_set (page->store, &iter, 0, item, -1); page->n_marked++; } return counts; } static void ugtk_selector_page_add_filter (UgtkSelectorPage* page, GtkListStore* filter_store, gchar* key, UgtkSelectorItem* value) { UgtkSelectorItem* filter_item; GtkTreeIter iter; GList* filter_list; gchar* orig_key; if (g_hash_table_lookup_extended (page->filter.hash, key, (gpointer*) &orig_key, (gpointer*) &filter_list) == FALSE) { filter_item = g_slice_alloc (sizeof (UgtkSelectorItem)); filter_item->uri = key; filter_item->mark = TRUE; filter_item->data = NULL; gtk_list_store_append (filter_store, &iter); gtk_list_store_set (filter_store, &iter, 0, filter_item, -1); filter_list = NULL; } else { g_hash_table_steal (page->filter.hash, key); g_free (key); key = orig_key; } filter_list = g_list_prepend (filter_list, value); g_hash_table_insert (page->filter.hash, key, filter_list); } void ugtk_selector_page_make_filter (UgtkSelectorPage* page) { UgtkSelectorItem* item; GtkTreeModel* model; GtkTreeIter iter; UgUri* upart; int value; gchar* key; if (g_hash_table_size (page->filter.hash)) return; upart = g_slice_alloc (sizeof (UgUri)); model = GTK_TREE_MODEL (page->store); value = gtk_tree_model_get_iter_first (model, &iter); while (value) { gtk_tree_model_get (model, &iter, 0, &item, -1); // create filter by host ---------------- ug_uri_init (upart, item->uri); if (upart->authority) key = g_strndup (item->uri, upart->path); else key = g_strdup ("(none)"); ugtk_selector_page_add_filter (page, page->filter.host, key, item); // create filter by filename extension -- value = ug_uri_part_file_ext (upart, (const char**) &key); if (value) key = g_strdup_printf (".%.*s", value, key); else key = g_strdup (".(none)"); ugtk_selector_page_add_filter (page, page->filter.ext, key, item); // next value = gtk_tree_model_iter_next (model, &iter); } g_slice_free1 (sizeof (UgUri), upart); } static void ugtk_selector_page_mark_by_filter (UgtkSelectorPage* page, GtkListStore* filter_store) { UgtkSelectorItem* item; GList* related; GList* marked; GList* link; marked = ugtk_selector_store_get_marked (filter_store, NULL); for (link = marked; link; link = link->next) { item = link->data; related = g_hash_table_lookup (page->filter.hash, item->uri); for (; related; related = related->next) { item = related->data; item->mark++; // increase mark count } } g_list_free (marked); } void ugtk_selector_page_mark_by_filter_all (UgtkSelectorPage* page) { UgtkSelectorItem* item; GtkTreeModel* model; GtkTreeIter iter; gboolean valid; // clear all mark ugtk_selector_store_set_mark_all (page->store, FALSE); page->n_marked = 0; // If filter (host and filename extension) was selected, increase mark count. ugtk_selector_page_mark_by_filter (page, page->filter.host); ugtk_selector_page_mark_by_filter (page, page->filter.ext); // remark model = GTK_TREE_MODEL (page->store); valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { gtk_tree_model_get (model, &iter, 0, &item, -1); valid = gtk_tree_model_iter_next (model, &iter); // decrease mark count. If mark count is 2, it still marked. if (item->mark > 0) { item->mark--; if (item->mark) page->n_marked++; } } } // ---------------------------------------------------------------------------- // GtkListStore for UgtkSelectorItem // (UgItem*) list->data. To free the returned value, call g_list_free() static GList* ugtk_selector_store_get_marked (GtkListStore* store, GList* list) { UgtkSelectorItem* item; GtkTreeModel* model; GtkTreeIter iter; gboolean valid; model = GTK_TREE_MODEL (store); valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { gtk_tree_model_get (model, &iter, 0, &item, -1); valid = gtk_tree_model_iter_next (model, &iter); if (item->mark) list = g_list_prepend (list, item); } return list; } static void ugtk_selector_store_set_mark_all (GtkListStore* store, gboolean mark) { UgtkSelectorItem* item; GtkTreeModel* model; GtkTreeIter iter; gboolean valid; model = (GtkTreeModel*) store; valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { gtk_tree_model_get (model, &iter, 0, &item, -1); valid = gtk_tree_model_iter_next (model, &iter); item->mark = mark; } } static void ugtk_selector_store_clear (GtkListStore* store) { UgtkSelectorItem* item; GtkTreeModel* model; GtkTreeIter iter; model = GTK_TREE_MODEL (store); while (gtk_tree_model_get_iter_first (model, &iter)) { gtk_tree_model_get (model, &iter, 0, &item, -1); gtk_list_store_remove (store, &iter); g_free (item->uri); g_slice_free1 (sizeof (UgtkSelectorItem), item); } } // ---------------------------------------------------------------------------- // GtkTreeView for UgtkSelectorItem // static void col_set_toggle (GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgtkSelectorItem* item; gtk_tree_model_get (model, iter, 0, &item, -1); g_object_set (cell, "active", item->mark, NULL); } static void col_set_uri (GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { UgtkSelectorItem* item; gtk_tree_model_get (model, iter, 0, &item, -1); g_object_set (cell, "text", item->uri, NULL); } // toggled callback static void on_cell_toggled (GtkCellRendererToggle* cell, gchar* path_str, GtkTreeView* view) { GtkTreeIter iter; GtkTreePath* path; GtkTreeModel* model; UgtkSelectorItem* item; path = gtk_tree_path_new_from_string (path_str); model = gtk_tree_view_get_model (view); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, 0, &item, -1); item->mark ^= 1; } static GtkTreeView* ugtk_selector_view_new (const gchar* title, gboolean active_toggled) { GtkTreeView* view; GtkCellRenderer* renderer; GtkTreeViewColumn* column; view = (GtkTreeView*) gtk_tree_view_new (); // gtk_tree_view_set_fixed_height_mode (view, TRUE); // UgtkSelectorItem.mark renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, "M"); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_toggle, NULL, NULL); gtk_tree_view_column_set_resizable (column, FALSE); gtk_tree_view_column_set_alignment (column, 0.5); gtk_tree_view_column_set_min_width (column, 15); // gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); if (active_toggled) { g_signal_connect (renderer, "toggled", G_CALLBACK (on_cell_toggled), view); } // UgtkSelectorItem.uri renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (column, title); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, col_set_uri, NULL, NULL); gtk_tree_view_column_set_resizable (column, TRUE); // gtk_tree_view_column_set_expand (column, TRUE); // gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (view, column); gtk_widget_show (GTK_WIDGET (view)); return view; } static GtkCellRenderer* ugtk_selector_view_get_renderer_toggle (GtkTreeView* view) { GtkCellRenderer* renderer; GtkTreeViewColumn* column; GList* list; column = gtk_tree_view_get_column (view, 0); list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column)); renderer = list->data; g_list_free (list); return renderer; } // UI static void ugtk_selector_init_ui (UgtkSelector* selector) { GtkBox* vbox; GtkBox* hbox; GtkWidget* widget; gchar* string; selector->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); vbox = (GtkBox*) selector->self; hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); string = g_strconcat (_("Base hypertext reference"), " :", NULL); selector->href_label = gtk_label_new (string); g_free (string); gtk_box_pack_start (hbox, selector->href_label, FALSE, TRUE, 1); selector->href_entry = (GtkEntry*) gtk_entry_new (); gtk_box_pack_start (vbox, (GtkWidget*) selector->href_entry, FALSE, FALSE, 1); selector->href_separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (vbox, selector->href_separator, FALSE, FALSE, 1); selector->notebook = (GtkNotebook*) gtk_notebook_new (); gtk_box_pack_start (vbox, (GtkWidget*) selector->notebook, TRUE, TRUE, 1); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); // select all widget = gtk_button_new_with_mnemonic (_("Mark _All")); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 1); selector->select_all = widget; // select none widget = gtk_button_new_with_mnemonic (_("Mark _None")); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 1); selector->select_none = widget; // select by filter widget = gtk_button_new_with_mnemonic (_("_Mark by filter...")); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 1); selector->select_filter = widget; gtk_widget_show_all ((GtkWidget*) vbox); } uget-2.2.2/ui-gtk/UgtkCategoryForm.c0000664000175000017500000002433313470304403014207 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #include #include static gchar* string_from_ug_array (UgArrayStr* uarray); static void string_to_ug_array (const gchar* string, UgArrayStr* uarray); void ugtk_category_form_init (UgtkCategoryForm* cform) { GtkWidget* label; GtkWidget* entry; GtkGrid* top_grid; GtkGrid* grid; GtkWidget* widget; cform->self = gtk_grid_new (); top_grid = (GtkGrid*) cform->self; gtk_container_set_border_width (GTK_CONTAINER (top_grid), 2); label = gtk_label_new_with_mnemonic (_("Category _name:")); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); g_object_set (label, "margin", 2, NULL); g_object_set (entry, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (top_grid, label, 0, 0, 1, 1); gtk_grid_attach (top_grid, entry, 1, 0, 1, 1); cform->name_entry = entry; cform->name_label = label; // ------------------------------------------------------------------------ // Capacity grid = (GtkGrid*) gtk_grid_new (); g_object_set (grid, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (top_grid, GTK_WIDGET (grid), 0, 1, 2, 1); cform->spin_active = gtk_spin_button_new_with_range (1.0, 20.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (cform->spin_active), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_active), 5); label = gtk_label_new_with_mnemonic (_("Active _downloads:")); gtk_label_set_mnemonic_widget (GTK_LABEL(label), cform->spin_active); g_object_set (label, "margin", 2, NULL); g_object_set (cform->spin_active, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, label, 0, 0, 1, 1); gtk_grid_attach (grid, cform->spin_active, 1, 0, 1, 1); cform->spin_finished = gtk_spin_button_new_with_range (0.0, 99999.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (cform->spin_finished), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_finished), 5); label = gtk_label_new_with_mnemonic (_("Capacity of Finished:")); gtk_label_set_mnemonic_widget (GTK_LABEL(label), cform->spin_finished); g_object_set (label, "margin", 2, NULL); g_object_set (cform->spin_finished, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, label, 0, 1, 1, 1); gtk_grid_attach (grid, cform->spin_finished, 1, 1, 1, 1); cform->spin_recycled = gtk_spin_button_new_with_range (0.0, 99999.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (cform->spin_recycled), TRUE); // gtk_entry_set_width_chars (GTK_ENTRY(cform->spin_recycled), 5); label = gtk_label_new_with_mnemonic (_("Capacity of Recycled:")); gtk_label_set_mnemonic_widget (GTK_LABEL(label), cform->spin_recycled); g_object_set (label, "margin", 2, NULL); g_object_set (cform->spin_recycled, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, label, 0, 2, 1, 1); gtk_grid_attach (grid, cform->spin_recycled, 1, 2, 1, 1); // ------------------------------------------------------------------------ // URI Matching conditions widget = gtk_frame_new (_("URI Matching conditions")); g_object_set (grid, "margin-top", 4, "margin-bottom", 4, NULL); gtk_grid_attach (top_grid, widget, 0, 2, 2, 1); grid = (GtkGrid*) gtk_grid_new (); g_object_set (grid, "margin-top", 2, "margin-bottom", 2, NULL); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) grid); label = gtk_label_new_with_mnemonic (_("Matched _Hosts:")); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); g_object_set (label, "margin", 2, NULL); g_object_set (entry, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (grid, label, 0, 0, 1, 1); gtk_grid_attach (grid, entry, 1, 0, 1, 1); cform->hosts_entry = entry; cform->hosts_label = label; label = gtk_label_new_with_mnemonic (_("Matched _Schemes:")); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); g_object_set (label, "margin", 2, NULL); g_object_set (entry, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (grid, label, 0, 1, 1, 1); gtk_grid_attach (grid, entry, 1, 1, 1, 1); cform->schemes_entry = entry; cform->schemes_label = label; label = gtk_label_new_with_mnemonic (_("Matched _Types:")); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); g_object_set (label, "margin", 2, NULL); g_object_set (entry, "margin", 2, "hexpand", TRUE, NULL); gtk_grid_attach (grid, label, 0, 2, 1, 1); gtk_grid_attach (grid, entry, 1, 2, 1, 1); cform->types_entry = entry; cform->types_label = label; gtk_widget_show_all (GTK_WIDGET (top_grid)); } void ugtk_category_form_get (UgtkCategoryForm* cform, UgInfo* cnode_info) { UgetCategory* category; UgetCommon* common; const gchar* text; category = ug_info_realloc(cnode_info, UgetCategoryInfo); common = ug_info_realloc(cnode_info, UgetCommonInfo); if (gtk_widget_is_sensitive (cform->name_entry) == TRUE) { text = gtk_entry_get_text ((GtkEntry*) cform->name_entry); ug_free(common->name); common->name = (*text) ? ug_strdup(text) : NULL; } category->active_limit = gtk_spin_button_get_value_as_int ( (GtkSpinButton*) cform->spin_active); // Finished category->finished_limit = gtk_spin_button_get_value_as_int ( (GtkSpinButton*) cform->spin_finished); // Recycled category->recycled_limit = gtk_spin_button_get_value_as_int ( (GtkSpinButton*) cform->spin_recycled); // matching - clear ug_array_foreach_str (&category->hosts, (UgForeachFunc) ug_free, NULL); ug_array_foreach_str (&category->schemes, (UgForeachFunc) ug_free, NULL); ug_array_foreach_str (&category->file_exts, (UgForeachFunc) ug_free, NULL); category->hosts.length = 0; category->schemes.length = 0; category->file_exts.length = 0; // matching - set string_to_ug_array (gtk_entry_get_text ((GtkEntry*) cform->hosts_entry), &category->hosts); string_to_ug_array (gtk_entry_get_text ((GtkEntry*) cform->schemes_entry), &category->schemes); string_to_ug_array (gtk_entry_get_text ((GtkEntry*) cform->types_entry), &category->file_exts); } void ugtk_category_form_set (UgtkCategoryForm* cform, UgInfo* cnode_info) { UgetCommon* common; UgetCategory* category; gchar* str; category = ug_info_realloc(cnode_info, UgetCategoryInfo); common = ug_info_get(cnode_info, UgetCommonInfo); if (gtk_widget_is_sensitive (cform->name_entry) == TRUE) { gtk_entry_set_text ((GtkEntry*) cform->name_entry, (common->name) ? common->name : ""); } gtk_spin_button_set_value ((GtkSpinButton*) cform->spin_active, (gdouble) category->active_limit); // Finished gtk_spin_button_set_value ((GtkSpinButton*) cform->spin_finished, (gdouble) category->finished_limit); // Recycled gtk_spin_button_set_value ((GtkSpinButton*) cform->spin_recycled, (gdouble) category->recycled_limit); // matching str = string_from_ug_array (&category->hosts); gtk_entry_set_text ((GtkEntry*) cform->hosts_entry, str); g_free (str); str = string_from_ug_array (&category->schemes); gtk_entry_set_text ((GtkEntry*) cform->schemes_entry, str); g_free (str); str = string_from_ug_array (&category->file_exts); gtk_entry_set_text ((GtkEntry*) cform->types_entry, str); g_free (str); } void ugtk_category_form_set_multiple (UgtkCategoryForm* cform, gboolean multiple_mode) { if (multiple_mode) { gtk_widget_hide (cform->name_entry); gtk_widget_hide (cform->name_label); gtk_widget_set_sensitive (cform->name_entry, FALSE); gtk_widget_set_sensitive (cform->name_label, FALSE); } else { gtk_widget_show (cform->name_entry); gtk_widget_show (cform->name_label); gtk_widget_set_sensitive (cform->name_entry, TRUE); gtk_widget_set_sensitive (cform->name_label, TRUE); } } // ---------------------------------------------------------------------------- // static function static gchar* string_from_ug_array (UgArrayStr* uarray) { int index, length; char* buffer; for (length = 0, index = 0; index < uarray->length; index++) length += strlen(uarray->at[index]) + 1; // + ';' buffer = g_malloc (length + 1); buffer[0] = 0; for (index = 0; index < uarray->length; index++) { strcat (buffer, uarray->at[index]); strcat (buffer, ";"); } return buffer; } static void string_to_ug_array (const gchar* string, UgArrayStr* uarray) { const gchar* cur; const gchar* prev; for (prev = string, cur = string; ; cur++) { if ((cur[0] == ';' || cur[0] == 0) && cur != prev) { *(char**)ug_array_alloc (uarray, 1) = ug_strndup (prev, cur - prev); prev = cur + 1; } if (cur[0] == 0) break; } } uget-2.2.2/ui-gtk/UgtkMenubar.h0000664000175000017500000001301513470304403013177 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_MENUBAR_H #define UGTK_MENUBAR_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkMenubar UgtkMenubar; typedef struct UgtkApp UgtkApp; struct UgtkMenubar { GtkWidget* self; // GtkMenuBar // GtkWidget* self; // GtkMenu* // GtkWidget* shell; // GtkMenuShell* // GtkWidget* other; // GtkMenuItem* struct UgtkFileMenu { // file.create GtkWidget* create_download; GtkWidget* create_category; GtkWidget* create_torrent; GtkWidget* create_metalink; // file.batch struct UgtkFileBatchMenu { GtkWidget* clipboard; // Clipboard batch GtkWidget* sequence; // URL Sequence batch GtkWidget* text_import; // Text file import (.txt) GtkWidget* html_import; // HTML file import (.html) GtkWidget* text_export; // Export to Text file (.txt) } batch; GtkWidget* open_category; GtkWidget* save_category; GtkWidget* save; GtkWidget* offline_mode; GtkWidget* quit; } file; struct UgtkEditMenu { GtkWidget* clipboard_monitor; GtkWidget* clipboard_quiet; GtkWidget* commandline_quiet; GtkWidget* skip_existing; GtkWidget* apply_recent; GtkWidget* settings; // Completion Auto-Actions struct { GtkWidget* disable; GtkWidget* hibernate; GtkWidget* suspend; GtkWidget* shutdown; GtkWidget* reboot; GtkWidget* custom; // separator GtkWidget* remember; GtkWidget* help; } completion; } edit; struct UgtkViewMenu { GtkWidget* toolbar; GtkWidget* statusbar; GtkWidget* category; GtkWidget* summary; struct UgtkViewItemMenu { GtkWidget* name; GtkWidget* folder; GtkWidget* category; // GtkWidget* elapsed; GtkWidget* uri; GtkWidget* message; } summary_items; struct UgtkViewColMenu // download columns { GtkWidget* self; // GtkMenu GtkWidget* complete; GtkWidget* total; GtkWidget* percent; GtkWidget* elapsed; // consuming time GtkWidget* left; // remaining time GtkWidget* speed; GtkWidget* upload_speed; // torrent GtkWidget* uploaded; // torrent GtkWidget* ratio; // torrent GtkWidget* retry; GtkWidget* category; GtkWidget* uri; GtkWidget* added_on; GtkWidget* completed_on; } columns; } view; struct UgtkCategoryMenu { GtkWidget* self; // GtkMenu GtkWidget* create; GtkWidget* delete; GtkWidget* properties; GtkWidget* move_up; GtkWidget* move_down; } category; struct UgtkDownloadMenu { GtkWidget* self; // GtkMenu GtkWidget* create; GtkWidget* delete; GtkWidget* delete_file; // delete file and data. GtkWidget* open; GtkWidget* open_folder; // open containing folder GtkWidget* force_start; GtkWidget* runnable; GtkWidget* pause; struct UgtkDownloadMoveToMenu { GtkWidget* self; // GtkMenu GtkWidget* item; // GtkMenuItem // This array used for mapping menu item and it's category // index 0, 2, 4, 6... GtkMenuItem* // index 1, 3, 5, 7... UgetNode* GPtrArray* array; } move_to; GtkWidget* move_up; GtkWidget* move_down; GtkWidget* move_top; GtkWidget* move_bottom; struct UgtkDownloadPrioriyMenu { GtkWidget* self; // GtkMenu GtkWidget* item; // GtkMenuItem // GtkRadioMenuItem GtkWidget* high; GtkWidget* normal; GtkWidget* low; } prioriy; GtkWidget* properties; } download; struct UgtkHelpMenu { GtkWidget* help_online; GtkWidget* documentation; GtkWidget* support_forum; GtkWidget* submit_feedback; GtkWidget* report_bug; GtkWidget* keyboard_shortcuts; GtkWidget* check_updates; GtkWidget* about_uget; } help; }; void ugtk_menubar_init_ui (UgtkMenubar* menubar, GtkAccelGroup* accel_group); void ugtk_menubar_init_callback (UgtkMenubar* menubar, UgtkApp* app); void ugtk_menubar_sync_category (UgtkMenubar* menubar, UgtkApp* app, gboolean reset); #ifdef __cplusplus } #endif #endif // UGTK_MENUBAR_H uget-2.2.2/ui-gtk/UgtkApp-ui.c0000664000175000017500000004205613470304403012743 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include // GdkScreen #include static void ugtk_statusbar_init_ui (struct UgtkStatusbar* app_statusbar); static void ugtk_toolbar_init_ui (struct UgtkToolbar* app_toolbar, GtkAccelGroup* accel_group); static void ugtk_window_init_ui (struct UgtkWindow* window, UgtkApp* app); static void ugtk_app_init_size (UgtkApp* app); #if defined _WIN32 || defined _WIN64 static void ugtk_app_init_ui_win32 (UgtkApp* app, int screen_width); #endif void ugtk_app_init_ui (UgtkApp* app) { // Registers a new accelerator "Ctrl+N" with the global accelerator map. gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_NEW, GDK_KEY_n, GDK_CONTROL_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_LOAD, GDK_KEY_o, GDK_CONTROL_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_SAVE, GDK_KEY_s, GDK_CONTROL_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_SAVE_ALL, GDK_KEY_s, GDK_CONTROL_MASK | GDK_SHIFT_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_DELETE, GDK_KEY_Delete, 0); // gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_DELETE_F, GDK_KEY_Delete, GDK_SHIFT_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_DELETE_F, GDK_KEY_Delete, GDK_CONTROL_MASK); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_OPEN, GDK_KEY_Return, 0); gtk_accel_map_add_entry (UGTK_APP_ACCEL_PATH_OPEN_F, GDK_KEY_Return, GDK_SHIFT_MASK); // accelerators app->accel_group = gtk_accel_group_new (); // tray icon ugtk_tray_icon_init (&app->trayicon); // Main Window and it's widgets ugtk_banner_init (&app->banner); ugtk_menubar_init_ui (&app->menubar, app->accel_group); ugtk_summary_init (&app->summary, app->accel_group); ugtk_traveler_init (&app->traveler, app); ugtk_statusbar_init_ui (&app->statusbar); ugtk_toolbar_init_ui (&app->toolbar, app->accel_group); ugtk_window_init_ui (&app->window, app); ugtk_app_init_size (app); } // set default size static void ugtk_app_init_size (UgtkApp* app) { GdkScreen* screen; gint width, height; gint paned_position; screen = gdk_screen_get_default (); if (screen) { width = gdk_screen_get_width (screen); height = gdk_screen_get_height (screen); } else { width = 0; height = 0; } // decide window & traveler size if (width <= 640) { width = 620; height = 430; paned_position = 165; } if (width <= 800) { width = width * 95 / 100; height = height * 9 / 10; paned_position = 180; } else if (width <= 1000) { width = width * 90 / 100; height = height * 8 / 10; paned_position = 200; } else { width = width * 85 / 100; height = height * 8 / 10; paned_position = width * 22 / 100; } gtk_window_resize (app->window.self, width, height); gtk_paned_set_position (app->window.hpaned, paned_position); #if defined _WIN32 || defined _WIN64 ugtk_app_init_ui_win32 (app, width); #endif } #if defined _WIN32 || defined _WIN64 static void ugtk_app_init_ui_win32 (UgtkApp* app, int screen_width) { GSettings* gset; gint sidebar_width; #if 0 // This will use icons\hicolor\index.theme GtkIconTheme* icon_theme; gchar* path; icon_theme = gtk_icon_theme_get_default (); path = g_build_filename (UG_DATADIR, "icons", NULL); gtk_icon_theme_append_search_path (icon_theme, path); g_free (path); #endif if (screen_width <= 800) sidebar_width = 0; else if (screen_width <= 1200) sidebar_width = 180; else sidebar_width = 220; gset = g_settings_new ("org.gtk.Settings.FileChooser"); g_settings_set_boolean (gset, "sort-directories-first", TRUE); // default of "sidebar-width" == 148 if (sidebar_width > 0 && g_settings_get_int(gset, "sidebar-width") == 148) g_settings_set_int (gset, "sidebar-width", sidebar_width); } #endif // _WIN32 || _WIN64 // ---------------------------------------------------------------------------- // UgtkWindow static void ugtk_window_init_ui (struct UgtkWindow* window, UgtkApp* app) { GtkBox* vbox; GtkBox* lbox; // left side vbox GtkBox* rbox; // right side vbox window->self = (GtkWindow*) gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (window->self, UGTK_APP_NAME); // gtk_window_resize (window->self, 640, 480); gtk_window_add_accel_group (window->self, app->accel_group); gtk_window_set_default_icon_name (UGTK_APP_ICON_NAME); #if GTK_MAJOR_VERSION <= 3 && GTK_MINOR_VERSION < 14 gtk_window_set_has_resize_grip (window->self, FALSE); #endif // top container for Main Window vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window->self), GTK_WIDGET (vbox)); // banner + menubar gtk_box_pack_start (vbox, app->banner.self, FALSE, FALSE, 0); gtk_box_pack_start (vbox, app->menubar.self, FALSE, FALSE, 0); // hpaned window->hpaned = (GtkPaned*) gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (vbox, GTK_WIDGET (window->hpaned), TRUE, TRUE, 0); lbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); rbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_paned_pack1 (window->hpaned, GTK_WIDGET (lbox), FALSE, TRUE); gtk_paned_pack2 (window->hpaned, GTK_WIDGET (rbox), TRUE, FALSE); gtk_box_pack_start (lbox, gtk_label_new (_("Status")), FALSE, FALSE, 0); gtk_box_pack_start (lbox, app->traveler.state.self, FALSE, FALSE, 0); gtk_box_pack_start (lbox, gtk_label_new (_("Category")), FALSE, FALSE, 0); gtk_box_pack_start (lbox, app->traveler.category.self, TRUE, TRUE, 0); gtk_box_pack_start (rbox, app->toolbar.self, FALSE, FALSE, 0); // vpaned window->vpaned = (GtkPaned*) gtk_paned_new (GTK_ORIENTATION_VERTICAL); gtk_box_pack_start (rbox, (GtkWidget*) window->vpaned, TRUE, TRUE, 0); gtk_paned_pack1 (window->vpaned, app->traveler.download.self , TRUE, TRUE); gtk_paned_pack2 (window->vpaned, app->summary.self, FALSE, TRUE); gtk_box_pack_start (vbox, GTK_WIDGET (app->statusbar.self), FALSE, FALSE, 0); gtk_widget_show_all ((GtkWidget*) vbox); } // ---------------------------------------------------------------------------- // UgtkStatusbar // static void ugtk_statusbar_init_ui (struct UgtkStatusbar* sbar) { GtkBox* hbox; GtkWidget* widget; PangoContext* context; PangoLayout* layout; int text_width; sbar->self = (GtkStatusbar*) gtk_statusbar_new (); hbox = GTK_BOX (sbar->self); // calculate text width context = gtk_widget_get_pango_context (GTK_WIDGET (sbar->self)); layout = pango_layout_new (context); pango_layout_set_text (layout, "9999 MiB/s", -1); pango_layout_get_pixel_size (layout, &text_width, NULL); g_object_unref (layout); if (text_width < 100) text_width = 100; // upload speed label widget = gtk_label_new (""); sbar->up_speed = (GtkLabel*) widget; gtk_widget_set_size_request (widget, text_width, 0); gtk_box_pack_end (hbox, widget, FALSE, TRUE, 2); // gtk_label_set_width_chars (sbar->down_speed, 15); gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); gtk_box_pack_end (hbox, gtk_label_new ("\xE2\x86\x91"), FALSE, TRUE, 2); // "↑" gtk_box_pack_end (hbox, gtk_separator_new (GTK_ORIENTATION_VERTICAL), FALSE, TRUE, 8); // download speed label widget = gtk_label_new (""); sbar->down_speed = (GtkLabel*) widget; gtk_widget_set_size_request (widget, text_width, 0); gtk_box_pack_end (hbox, widget, FALSE, TRUE, 2); // gtk_label_set_width_chars (sbar->down_speed, 15); gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); gtk_box_pack_end (hbox, gtk_label_new ("\xE2\x86\x93"), FALSE, TRUE, 2); // "↓" } // ---------------------------------------------------------------------------- // UgtkToolbar // static void ugtk_toolbar_init_ui (struct UgtkToolbar* ugt, GtkAccelGroup* accel_group) { GtkToolbar* toolbar; GtkToolItem* tool_item; GtkWidget* image; GtkWidget* menu; GtkWidget* menu_item; // toolbar ugt->toolbar = gtk_toolbar_new (); toolbar = GTK_TOOLBAR (ugt->toolbar); gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_ICONS); gtk_toolbar_set_icon_size (toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR); ugt->self = ugt->toolbar; gtk_widget_show (ugt->self); // New button --- start --- #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-new", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_menu_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_menu_tool_button_new_from_stock (GTK_STOCK_NEW); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Create new download")); gtk_menu_tool_button_set_arrow_tooltip_text ((GtkMenuToolButton*)tool_item, "Create new item"); gtk_tool_item_set_homogeneous (tool_item, FALSE); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->create = GTK_WIDGET (tool_item); // menu for tool button (accelerators) menu = gtk_menu_new (); gtk_menu_set_accel_group ((GtkMenu*) menu, accel_group); gtk_menu_tool_button_set_menu ((GtkMenuToolButton*)tool_item, menu); // New Download (accelerators) menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _Download...")); gtk_menu_item_set_accel_path ((GtkMenuItem*) menu_item, UGTK_APP_ACCEL_PATH_NEW); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-new", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_download = menu_item; // New Category menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _Category...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("gtk-dnd-multiple", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_category = menu_item; // New Clipboard batch menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Clipboard _batch...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("edit-paste", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_clipboard = menu_item; gtk_widget_show_all (menu); // New URL Sequence batch menu_item = gtk_image_menu_item_new_with_mnemonic (_("New _URL Sequence batch...")); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("view-sort-ascending", GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock (GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU); #endif gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_sequence = menu_item; gtk_widget_show_all (menu); gtk_menu_shell_append ((GtkMenuShell*)menu, gtk_separator_menu_item_new() ); // New Torrent menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Torrent...")); // image = gtk_image_new_from_stock (GTK_STOCK_FILE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_torrent = menu_item; gtk_widget_show_all (menu); // New Metalink menu_item = gtk_image_menu_item_new_with_mnemonic (_("New Metalink...")); // image = gtk_image_new_from_stock (GTK_STOCK_FILE, GTK_ICON_SIZE_MENU); // gtk_image_menu_item_set_image ((GtkImageMenuItem*)menu_item, image); gtk_menu_shell_append ((GtkMenuShell*)menu, menu_item); ugt->create_metalink = menu_item; gtk_widget_show_all (menu); // New button --- end --- #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_SAVE); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Save all settings")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->save = GTK_WIDGET (tool_item); tool_item = gtk_separator_tool_item_new (); gtk_toolbar_insert (toolbar, tool_item, -1); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("media-playback-start", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Set selected download runnable")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->runnable = GTK_WIDGET (tool_item); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("media-playback-pause", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Set selected download to pause")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->pause = GTK_WIDGET (tool_item); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_PROPERTIES); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Set selected download properties")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->properties = GTK_WIDGET (tool_item); tool_item = gtk_separator_tool_item_new (); gtk_toolbar_insert (toolbar, tool_item, -1); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-up", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_GO_UP); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Move selected download up")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->move_up = GTK_WIDGET (tool_item); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-down", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_GO_DOWN); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Move selected download down")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->move_down = GTK_WIDGET (tool_item); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-top", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_GOTO_TOP); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Move selected download to top")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->move_top = GTK_WIDGET (tool_item); #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 10 image = gtk_image_new_from_icon_name ("go-bottom", GTK_ICON_SIZE_SMALL_TOOLBAR); tool_item = (GtkToolItem*) gtk_tool_button_new (image, NULL); #else tool_item = (GtkToolItem*) gtk_tool_button_new_from_stock (GTK_STOCK_GOTO_BOTTOM); #endif gtk_tool_item_set_tooltip_text (tool_item, _("Move selected download to bottom")); gtk_toolbar_insert (toolbar, tool_item, -1); ugt->move_bottom = GTK_WIDGET (tool_item); gtk_widget_show_all ((GtkWidget*) toolbar); } uget-2.2.2/ui-gtk/UgtkNodeTree.h0000664000175000017500000000640213470304403013315 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ /* * This file base on GTK+ 2.0 Tree View Tutorial - custom-list.h */ #ifndef UGTK_NODE_TREE_H #define UGTK_NODE_TREE_H #include #include #ifdef __cplusplus extern "C" { #endif #define UGTK_TYPE_NODE_TREE (ugtk_node_tree_get_type ()) #define UGTK_NODE_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UGTK_TYPE_NODE_TREE, UgtkNodeTree)) #define UGTK_NODE_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UGTK_TYPE_NODE_TREE, UgtkNodeTreeClass)) #define UGTK_IS_NODE_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UGTK_TYPE_NODE_TREE)) #define UGTK_IS_NODE_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UGTK_TYPE_NODE_TREE)) #define UGTK_NODE_TREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UGTK_TYPE_NODE_TREE, UgtkNodeTreeClass)) typedef struct UgtkNodeTree UgtkNodeTree; typedef struct UgtkNodeTreeClass UgtkNodeTreeClass; // ---------------------------------------------------------------------------- // UgtkNodeTree : GtkTreeModel for UgNode (UgetNode) parent and children nodes. struct UgtkNodeTree { GObject parent; // this MUST be the first member UgetNode* root; gint stamp; // Random integer to check whether an iter belongs to our model gboolean list_only; struct { UgetNode* root; gint len; } prefix; }; // ------------------------------------ struct UgtkNodeTreeClass { GObjectClass parent_class; }; UgtkNodeTree* ugtk_node_tree_new (UgetNode* root, gboolean list_only); GType ugtk_node_tree_get_type (void); void ugtk_node_tree_set_prefix (UgtkNodeTree* utree, UgetNode* prefix_root, gint prefix_len); #ifdef __cplusplus } #endif #endif // UGTK_NODE_TREE_H uget-2.2.2/ui-gtk/UgtkAboutDialog.c0000664000175000017500000001332613470304403014000 00000000000000static const char uget_license[] = { " Copyright (C) 2005-2019 by C.H. Huang" "\n" " plushuang.tw@gmail.com" "\n" "\n" "This library is free software; you can redistribute it and/or" "\n" "modify it under the terms of the GNU Lesser General Public" "\n" "License as published by the Free Software Foundation; either" "\n" "version 2.1 of the License, or (at your option) any later version." "\n" "\n" "This library is distributed in the hope that it will be useful," "\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of" "\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU" "\n" "Lesser General Public License for more details." "\n" "\n" "You should have received a copy of the GNU Lesser General Public" "\n" "License along with this library; if not, write to the Free Software" "\n" "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" "\n" "\n" "---------" "\n" "\n" "In addition, as a special exception, the copyright holders give" "\n" "permission to link the code of portions of this program with the" "\n" "OpenSSL library under certain conditions as described in each" "\n" "individual source file, and distribute linked combinations" "\n" "including the two." "\n" "You must obey the GNU Lesser General Public License in all respects" "\n" "for all of the code used other than OpenSSL. If you modify" "\n" "file(s) with this exception, you may extend this exception to your" "\n" "version of the file(s), but you are not obligated to do so. If you" "\n" "do not wish to do so, delete this exception statement from your" "\n" "version. If you delete this exception statement from all source" "\n" "files in the program, then also delete it here." "\n" "\0" }; #include #include #include #define UGET_URL_WEBSITE "http://ugetdm.com/" // static data static const gchar* uget_authors[] = { "C.H. Huang (\xE9\xBB\x83\xE6\xAD\xA3\xE9\x9B\x84)", NULL }; static const gchar* uget_artists[] = { "Michael Tunnell (visuex.com)", NULL}; static const gchar* uget_comments = N_("Download Manager"); static const gchar* uget_copyright = "Copyright (C) 2005-2018 C.H. Huang"; static const gchar* translator_credits = N_("translator-credits"); static void ugtk_about_dialog_on_response (GtkWidget* widget, gint response_id, UgtkAboutDialog* adialog) { // GTK_RESPONSE_CANCEL ugtk_about_dialog_free (adialog); } UgtkAboutDialog* ugtk_about_dialog_new (GtkWindow* parent) { UgtkAboutDialog* adialog; GtkScrolledWindow* scrolled; GtkTextBuffer* textbuf; GtkWidget* textview; GtkBox* box; char* path; char* comments; adialog = g_malloc (sizeof (UgtkAboutDialog)); adialog->self = (GtkDialog*) gtk_about_dialog_new (); gtk_window_set_transient_for ((GtkWindow*) adialog->self, parent); gtk_dialog_set_default_response (adialog->self, GTK_RESPONSE_CANCEL); path = g_build_filename ( ugtk_get_data_dir (), "pixmaps", "uget", "logo.png", NULL); adialog->pixbuf = gdk_pixbuf_new_from_file (path, NULL); g_free (path); comments = g_strconcat ( gettext (uget_comments), "\n", _("uGet Founder: "), uget_authors[0], "\n", _("uGet Project Manager: "), uget_artists[0], "\n", NULL); g_object_set (adialog->self, // "logo-icon-name", UGTK_APP_ICON_NAME, "logo", adialog->pixbuf, "program-name", UGTK_APP_NAME, "version", PACKAGE_VERSION, "comments", comments, "copyright", uget_copyright, #if defined _WIN32 || defined _WIN64 "website-label", UGET_URL_WEBSITE, #else "website", UGET_URL_WEBSITE, #endif "license", uget_license, "authors", uget_authors, "artists", uget_artists, "translator-credits", gettext (translator_credits), NULL); g_free (comments); textview = gtk_text_view_new (); textbuf = gtk_text_view_get_buffer ((GtkTextView*) textview); adialog->textbuf = textbuf; adialog->scrolled = gtk_scrolled_window_new (NULL, NULL); scrolled = (GtkScrolledWindow*) adialog->scrolled; gtk_widget_set_size_request ((GtkWidget*) scrolled, 200, 120); gtk_scrolled_window_set_shadow_type (scrolled, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scrolled, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scrolled), textview); gtk_widget_hide ((GtkWidget*) scrolled); box = (GtkBox*) gtk_dialog_get_content_area (adialog->self); gtk_box_pack_end (box, (GtkWidget*) scrolled, TRUE, TRUE, 2); g_signal_connect (adialog->self, "response", G_CALLBACK (ugtk_about_dialog_on_response), adialog); return adialog; } void ugtk_about_dialog_free (UgtkAboutDialog* adialog) { gtk_widget_destroy ((GtkWidget*) adialog->self); if (adialog->pixbuf) g_object_unref (adialog->pixbuf); g_free (adialog); } void ugtk_about_dialog_set_info (UgtkAboutDialog* adialog, const gchar* info_text) { gtk_text_buffer_set_text (adialog->textbuf, info_text, -1); gtk_widget_show_all ((GtkWidget*) adialog->scrolled); } void ugtk_about_dialog_run (UgtkAboutDialog* adialog) { gtk_dialog_run (adialog->self); } uget-2.2.2/ui-gtk/UgtkNodeDialog.h0000664000175000017500000001057613470304403013624 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_NODE_DIALOG_H #define UGTK_NODE_DIALOG_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkNodeDialog UgtkNodeDialog; typedef enum { UGTK_NODE_DIALOG_NEW_DOWNLOAD, UGTK_NODE_DIALOG_NEW_CATEGORY, UGTK_NODE_DIALOG_EDIT_DOWNLOAD, UGTK_NODE_DIALOG_EDIT_CATEGORY, } UgtkNodeDialogMode; #define UGTK_NODE_DIALOG_MEMBERS \ GtkDialog* self; \ GtkBox* hbox; \ GtkWidget* notebook; \ GtkTreeView* node_view; \ UgtkNodeTree* node_tree; \ gulong handler_id[3]; \ UgtkApp* app; \ UgetNode* node; \ UgInfo* node_info; \ UgtkProxyForm proxy; \ UgtkDownloadForm download; \ UgtkCategoryForm category struct UgtkNodeDialog { UGTK_NODE_DIALOG_MEMBERS; /* // ------ UgtkNodeDialog members ------ GtkDialog* self; GtkBox* hbox; GtkWidget* notebook; GtkTreeView* node_view; UgtkNodeTree* node_tree; gulong handler_id[3]; UgtkApp* app; UgetNode* note; UgInfo* node_info; UgtkProxyForm proxy; UgtkDownloadForm download; UgtkCategoryForm category; */ // handler_id[0] : "row-changed" // handler_id[1] : "row-deleted" // handler_id[2] : "row-inserted" }; UgtkNodeDialog* ugtk_node_dialog_new (const char* title, UgtkApp* app, gboolean has_category_form); void ugtk_node_dialog_free (UgtkNodeDialog* ndialog); // enable/disable category node list view in left side // return index of selected category int ugtk_node_dialog_get_category (UgtkNodeDialog* ndialog, UgetNode** cnode); void ugtk_node_dialog_set_category (UgtkNodeDialog* ndialog, UgetNode* cnode); // set/get node's info to/from UgtkNodeDialog void ugtk_node_dialog_get (UgtkNodeDialog* ndialog, UgInfo* node_info); void ugtk_node_dialog_set (UgtkNodeDialog* ndialog, UgInfo* node_info); void ugtk_node_dialog_run (UgtkNodeDialog* ndialog, UgtkNodeDialogMode mode, UgetNode* node4edit); void ugtk_node_dialog_store_recent (UgtkNodeDialog* ndialog, UgtkApp* app); void ugtk_node_dialog_apply_recent (UgtkNodeDialog* ndialog, UgtkApp* app); void ugtk_node_dialog_monitor_uri (UgtkNodeDialog* ndialog); gboolean ugtk_node_dialog_confirm_existing (UgtkNodeDialog* ndialog, const char* uri); // initialize notebook and it's form void ugtk_node_dialog_init (UgtkNodeDialog* ndialog, const char* title, UgtkApp* app, gboolean has_category_form); #ifdef __cplusplus } #endif #endif // End of UGTK_NODE_DIALOG_H uget-2.2.2/ui-gtk/UgtkSetting.h0000664000175000017500000001367513470304403013237 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SETTING_H #define UGTK_SETTING_H #ifdef HAVE_CONFIG_H #include #endif #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkSetting UgtkSetting; typedef enum { UGTK_SCHEDULE_TURN_OFF, UGTK_SCHEDULE_UPLOAD_ONLY, // reserve UGTK_SCHEDULE_LIMITED_SPEED, UGTK_SCHEDULE_NORMAL, UGTK_SCHEDULE_N_STATE, } UgtkScheduleState; typedef enum { UGTK_PLUGIN_ORDER_CURL, UGTK_PLUGIN_ORDER_ARIA2, UGTK_PLUGIN_ORDER_CURL_ARIA2, UGTK_PLUGIN_ORDER_ARIA2_CURL, UGTK_PLUGIN_N_ORDER, } UgtkPluginOrder; struct UgtkSetting { // "WindowSetting" struct UgtkWindowSetting { // visible: boolean int toolbar; int statusbar; int category; int summary; int banner; // window position: int int x; int y; int width; int height; // window ststus: boolean int maximized; // user action int nth_category; int nth_state; int paned_position_h; int paned_position_v; } window; // "SummarySetting" struct UgtkSummarySetting { // visible: boolean int name; int folder; int category; int uri; int message; } summary; // "DownloadColumn" struct UgtkDownloadColumnSetting { // visible: boolean int complete; int total; int percent; int elapsed; // consuming time int left; // remaining time int speed; int upload_speed; int uploaded; int ratio; int retry; int category; int uri; int added_on; int completed_on; // width: integer struct UgtkDownloadColumnWidth { int state; // state icon int name; int complete; int total; int percent; int elapsed; // consuming time int left; // remaining time int speed; int upload_speed; int uploaded; int ratio; int retry; int category; int uri; int added_on; int completed_on; } width; struct { int type; // GtkSortType int nth; // UgtkNodeColumn } sort; } download_column; // "UserInterface" struct UgtkUserInterfaceSetting { // boolean int exit_confirmation; int delete_confirmation; int show_trayicon; int start_in_tray; int close_to_tray; int start_in_offline_mode; int start_notification; int sound_notification; int apply_recent; int skip_existing; int large_icon; #ifdef HAVE_APP_INDICATOR int app_indicator; #endif } ui; // "ClipboardSetting" struct UgtkClipboardSetting { char* pattern; int monitor; int quiet; int nth_category; int website; } clipboard; // "BandwidthSetting" - global speed limits struct UgtkBandwidthSetting { struct { int upload; // KiB / second int download; // KiB / second } normal, scheduler; } bandwidth; // "SchedulerSetting" struct UgtkSchedulerSetting { int enable; UgArrayInt state; // [7][24] 1 week, 7 days, 24 hours } scheduler; // "CommandlineSetting" struct UgtkCommandlineSetting { int quiet; // --quiet int nth_category; // --category-index } commandline; // "PluginOrder" int plugin_order; // UgtkPluginOrder: matching order // UgetPluginAria2 option struct UgtkPluginAria2Setting { // aria2 speed limit struct { int download; // KiB / second int upload; // KiB / second } limit; // aria2 options int launch; int shutdown; char* token; char* path; char* args; char* uri; } aria2; // UgetPluginMedia option struct UgtkPluginMediaSetting { int match_mode; int quality; int type; } media; // Completion Auto-Actions struct UgtkCompletionSetting { int remember; int action; char* command; char* on_error; } completion; struct UgtkAutoSaveSetting { int enable; int interval; } auto_save; // "FolderHistory" UgList folder_history; int offline_mode; }; void ugtk_setting_init (UgtkSetting* setting); int ugtk_setting_save (UgtkSetting* setting, const char* file); int ugtk_setting_load (UgtkSetting* setting, const char* file); void ugtk_setting_reset (UgtkSetting* setting); void ugtk_setting_add_folder (UgtkSetting* setting, const char* folder); void ugtk_setting_fix_data (UgtkSetting* setting); #ifdef __cplusplus } #endif #endif // UGTK_SETTING_H uget-2.2.2/ui-gtk/UgtkUtil.h0000664000175000017500000000506013470304403012524 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_UTIL_H #define UGTK_UTIL_H #include //#include #ifdef __cplusplus extern "C" { #endif // ------------------------------------------------------------------ // URI list functions // To get URIs from text file, error is G_FILE_ERROR. GList* ugtk_text_file_get_uris (const gchar* file_utf8, GError** error); // get URIs from text GList* ugtk_text_get_uris (const gchar* text); // remove URIs from list by scheme GList* ugtk_uri_list_remove_scheme (GList* uris, const gchar* scheme); // ------------------------------------------------------------------ // check BOM in file header and set it's encoding. // return encoding string. const char* ugtk_io_channel_decide_encoding (GIOChannel* channel); // ------------------------------------------------------------------ // others // gboolean ugtk_launch_uri (const gchar* uri); gboolean ugtk_launch_default_app (const gchar* folder, const gchar* file); #ifdef __cplusplus } #endif #endif // UGTK_UTIL_H uget-2.2.2/ui-gtk/UgtkSettingForm.c0000664000175000017500000010702413470304403014046 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // ---------------------------------------------------------------------------- // UgtkClipboardForm // // void ugtk_clipboard_form_init (struct UgtkClipboardForm* cbform) { PangoContext* context; PangoLayout* layout; int text_height; GtkTextView* textview; GtkWidget* widget; GtkBox* vbox; GtkBox* hbox; GtkScrolledWindow* scroll; cbform->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox = (GtkBox*) cbform->self; // Monitor button widget = gtk_check_button_new_with_mnemonic (_("_Enable clipboard monitor")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); cbform->monitor = (GtkToggleButton*) widget; // quiet mode widget = gtk_check_button_new_with_mnemonic (_("_Quiet mode")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 0); cbform->quiet = (GtkToggleButton*) widget; // Nth category hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Default category index")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); cbform->nth_label = widget; widget = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); cbform->nth_spin = (GtkSpinButton*) widget; // hint hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (" - "); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); widget = gtk_label_new (_("Adding to Nth category if no matched category.")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); gtk_box_pack_start (vbox, gtk_label_new (""), FALSE, FALSE, 2); // media or storage website widget = gtk_check_button_new_with_mnemonic (_("_Monitor URL of website")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); cbform->website = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, gtk_label_new (""), FALSE, FALSE, 2); // get text height --- begin --- context = gtk_widget_get_pango_context (widget); layout = pango_layout_new (context); pango_layout_set_text (layout, "joIN", -1); pango_layout_get_pixel_size (layout, NULL, &text_height); g_object_unref (layout); // get text height --- end --- hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Monitor clipboard for specified file types:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 1); // Scrolled Window scroll = (GtkScrolledWindow*) gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (scroll, GTK_SHADOW_IN); gtk_widget_set_size_request (GTK_WIDGET (scroll), 100, text_height * 6); gtk_box_pack_start (vbox, GTK_WIDGET (scroll), FALSE, FALSE, 2); // file type pattern : TextView cbform->buffer = gtk_text_buffer_new (NULL); cbform->pattern = gtk_text_view_new_with_buffer (cbform->buffer); g_object_unref (cbform->buffer); textview = (GtkTextView*) cbform->pattern; gtk_text_view_set_wrap_mode (textview, GTK_WRAP_WORD_CHAR); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (cbform->pattern)); // tips hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); gtk_box_pack_end (hbox, gtk_label_new (_("Separate the types with character '|'.")), FALSE, FALSE, 2); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); gtk_box_pack_end (hbox, gtk_label_new (_("You can use regular expressions here.")), FALSE, FALSE, 2); } void ugtk_clipboard_form_set (struct UgtkClipboardForm* cbform, UgtkSetting* setting) { if (setting->clipboard.pattern) gtk_text_buffer_set_text (cbform->buffer, setting->clipboard.pattern, -1); gtk_toggle_button_set_active (cbform->monitor, setting->clipboard.monitor); gtk_toggle_button_set_active (cbform->quiet, setting->clipboard.quiet); gtk_toggle_button_set_active (cbform->website, setting->clipboard.website); gtk_spin_button_set_value (cbform->nth_spin, setting->clipboard.nth_category); gtk_toggle_button_toggled (cbform->monitor); gtk_toggle_button_toggled (cbform->quiet); // on_clipboard_quiet_mode_toggled ((GtkWidget*) cbform->quiet, cbform); } void ugtk_clipboard_form_get (struct UgtkClipboardForm* cbform, UgtkSetting* setting) { GtkTextIter iter1; GtkTextIter iter2; gtk_text_buffer_get_start_iter (cbform->buffer, &iter1); gtk_text_buffer_get_end_iter (cbform->buffer, &iter2); ug_free (setting->clipboard.pattern); setting->clipboard.pattern = gtk_text_buffer_get_text (cbform->buffer, &iter1, &iter2, FALSE); setting->clipboard.monitor = gtk_toggle_button_get_active (cbform->monitor); setting->clipboard.quiet = gtk_toggle_button_get_active (cbform->quiet); setting->clipboard.website = gtk_toggle_button_get_active (cbform->website); setting->clipboard.nth_category = gtk_spin_button_get_value_as_int (cbform->nth_spin); // remove line break ug_str_remove_crlf (setting->clipboard.pattern, setting->clipboard.pattern); } // ---------------------------------------------------------------------------- // UgtkUserInterfaceForm // void ugtk_user_interface_form_init (struct UgtkUserInterfaceForm* uiform) { GtkWidget* widget; GtkBox* vbox; uiform->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); // Confirmation vbox = (GtkBox*) uiform->self; widget = gtk_frame_new (_("Confirmation")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); // Confirmation check buttons widget = gtk_check_button_new_with_label (_("Show confirmation dialog on exit")); uiform->confirm_exit = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Confirm when deleting files")); uiform->confirm_delete = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); // System Tray vbox = (GtkBox*) uiform->self; widget = gtk_frame_new (_("System Tray")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); // System Tray check buttons widget = gtk_check_button_new_with_label (_("Always show tray icon")); uiform->show_trayicon = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Minimize to tray on startup")); uiform->start_in_tray = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Close to tray on window close")); uiform->close_to_tray = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #ifdef HAVE_APP_INDICATOR widget = gtk_check_button_new_with_label (_("Use Ubuntu's App Indicator")); uiform->app_indicator = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); #endif // Others vbox = (GtkBox*) uiform->self; widget = gtk_check_button_new_with_label (_("Enable offline mode on startup")); uiform->start_in_offline_mode = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Download starting notification")); uiform->start_notification = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Sound when download is finished")); uiform->sound_notification = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Apply recent download settings")); uiform->apply_recent = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); // widget = gtk_check_button_new_with_label (_("Skip existing URI from clipboard and command-line")); // uiform->skip_existing = (GtkToggleButton*) widget; // gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); widget = gtk_check_button_new_with_label (_("Display large icon")); uiform->large_icon = (GtkToggleButton*) widget; gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); } void ugtk_user_interface_form_set (struct UgtkUserInterfaceForm* uiform, UgtkSetting* setting) { gtk_toggle_button_set_active (uiform->close_to_tray, setting->ui.close_to_tray); gtk_toggle_button_set_active (uiform->confirm_exit, setting->ui.exit_confirmation); gtk_toggle_button_set_active (uiform->confirm_delete, setting->ui.delete_confirmation); gtk_toggle_button_set_active (uiform->show_trayicon, setting->ui.show_trayicon); gtk_toggle_button_set_active (uiform->start_in_tray, setting->ui.start_in_tray); gtk_toggle_button_set_active (uiform->start_in_offline_mode, setting->ui.start_in_offline_mode); gtk_toggle_button_set_active (uiform->start_notification, setting->ui.start_notification); gtk_toggle_button_set_active (uiform->sound_notification, setting->ui.sound_notification); gtk_toggle_button_set_active (uiform->apply_recent, setting->ui.apply_recent); // gtk_toggle_button_set_active (uiform->skip_existing, // setting->ui.skip_existing); gtk_toggle_button_set_active (uiform->large_icon, setting->ui.large_icon); #ifdef HAVE_APP_INDICATOR gtk_toggle_button_set_active (uiform->app_indicator, setting->ui.app_indicator); #endif } void ugtk_user_interface_form_get (struct UgtkUserInterfaceForm* uiform, UgtkSetting* setting) { setting->ui.close_to_tray = gtk_toggle_button_get_active (uiform->close_to_tray); setting->ui.exit_confirmation = gtk_toggle_button_get_active (uiform->confirm_exit); setting->ui.delete_confirmation = gtk_toggle_button_get_active (uiform->confirm_delete); setting->ui.show_trayicon = gtk_toggle_button_get_active (uiform->show_trayicon); setting->ui.start_in_tray = gtk_toggle_button_get_active (uiform->start_in_tray); setting->ui.start_in_offline_mode = gtk_toggle_button_get_active (uiform->start_in_offline_mode); setting->ui.start_notification = gtk_toggle_button_get_active (uiform->start_notification); setting->ui.sound_notification = gtk_toggle_button_get_active (uiform->sound_notification); setting->ui.apply_recent = gtk_toggle_button_get_active (uiform->apply_recent); // setting->ui.skip_existing = gtk_toggle_button_get_active (uiform->skip_existing); setting->ui.large_icon = gtk_toggle_button_get_active (uiform->large_icon); #ifdef HAVE_APP_INDICATOR setting->ui.app_indicator = gtk_toggle_button_get_active (uiform->app_indicator); #endif } // ---------------------------------------------------------------------------- // UgtkBandwidthForm // void ugtk_bandwidth_form_init (struct UgtkBandwidthForm* bwform) { GtkWidget* widget; GtkBox* box; GtkBox* vbox; GtkBox* hbox; box = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); bwform->self = (GtkWidget*) box; widget = gtk_label_new (_("These will affect all plug-ins.")); gtk_box_pack_start (box, widget, FALSE, FALSE, 2); widget = gtk_label_new (""); gtk_box_pack_start (box, widget, FALSE, FALSE, 2); // Global speed limit widget = gtk_frame_new (_("Global speed limit")); vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); gtk_box_pack_start (box, widget, FALSE, FALSE, 2); // Max upload speed hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Max upload speed")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_label_new (_("KiB/s")); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); widget = gtk_spin_button_new_with_range (0.0, 4000000000.0, 5.0); gtk_entry_set_width_chars (GTK_ENTRY (widget), 15); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); bwform->upload = (GtkSpinButton*) widget; // Max download speed hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Max download speed")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_label_new (_("KiB/s")); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); widget = gtk_spin_button_new_with_range (0.0, 4000000000.0, 5.0); gtk_entry_set_width_chars (GTK_ENTRY (widget), 15); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); bwform->download = (GtkSpinButton*) widget; } void ugtk_bandwidth_form_set (struct UgtkBandwidthForm* bwform, UgtkSetting* setting) { gtk_spin_button_set_value (bwform->upload, setting->bandwidth.normal.upload); gtk_spin_button_set_value (bwform->download, setting->bandwidth.normal.download); } void ugtk_bandwidth_form_get (struct UgtkBandwidthForm* bwform, UgtkSetting* setting) { setting->bandwidth.normal.upload = (guint) gtk_spin_button_get_value (bwform->upload); setting->bandwidth.normal.download = (guint) gtk_spin_button_get_value (bwform->download); } // ---------------------------------------------------------------------------- // UgtkCompletionForm // void ugtk_completion_form_init (struct UgtkCompletionForm* csform) { GtkWidget* widget; GtkWidget* entry; GtkBox* vbox; GtkBox* hbox; widget = gtk_frame_new (_("Completion Auto-Actions")); vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); csform->self = widget; hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); widget = gtk_label_new (_("Custom command:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_box_pack_start (vbox, entry, TRUE, TRUE, 2); csform->command = (GtkEntry*) entry; gtk_box_pack_start (vbox, gtk_label_new (""), FALSE, FALSE, 2); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 1); widget = gtk_label_new (_("Custom command if error occurred:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_box_pack_start (vbox, entry, TRUE, TRUE, 2); csform->on_error = (GtkEntry*) entry; } void ugtk_completion_form_set (struct UgtkCompletionForm* csform, UgtkSetting* setting) { if (setting->completion.command) gtk_entry_set_text (csform->command, setting->completion.command); if (setting->completion.on_error) gtk_entry_set_text (csform->command, setting->completion.on_error); } void ugtk_completion_form_get (struct UgtkCompletionForm* csform, UgtkSetting* setting) { const char* string; ug_free (setting->completion.command); string = gtk_entry_get_text (csform->command); setting->completion.command = (string[0]) ? ug_strdup (string) : NULL; ug_free (setting->completion.on_error); string = gtk_entry_get_text (csform->on_error); setting->completion.on_error = (string[0]) ? ug_strdup (string) : NULL; } // ---------------------------------------------------------------------------- // UgtkAutoSaveForm // static void on_auto_save_toggled (GtkWidget* widget, struct UgtkAutoSaveForm* asform) { gboolean sensitive; sensitive = gtk_toggle_button_get_active (asform->enable); gtk_widget_set_sensitive (asform->interval_label, sensitive); gtk_widget_set_sensitive ((GtkWidget*) asform->interval_spin, sensitive); gtk_widget_set_sensitive (asform->minutes_label, sensitive); } void ugtk_auto_save_form_init (struct UgtkAutoSaveForm* asform) { GtkBox* hbox; GtkWidget* widget; asform->self = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); hbox = (GtkBox*) asform->self; widget = gtk_check_button_new_with_mnemonic (_("_Autosave")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); g_signal_connect (widget, "toggled", G_CALLBACK (on_auto_save_toggled), asform); asform->enable = (GtkToggleButton*) widget; // space widget = gtk_label_new (""); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 30); // auto save interval label widget = gtk_label_new_with_mnemonic (_("_Interval:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); asform->interval_label = widget; gtk_label_set_mnemonic_widget (GTK_LABEL (asform->interval_label), (GtkWidget*) asform->interval_spin); // auto save interval spin widget = gtk_spin_button_new_with_range (1.0, 120.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); asform->interval_spin = (GtkSpinButton*) widget; // auto save interval unit label widget = gtk_label_new_with_mnemonic (_("minutes")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); asform->minutes_label = widget; } void ugtk_auto_save_form_set (struct UgtkAutoSaveForm* asform, UgtkSetting* setting) { gtk_toggle_button_set_active (asform->enable, setting->auto_save.enable); gtk_spin_button_set_value (asform->interval_spin, (gdouble) setting->auto_save.interval); gtk_toggle_button_toggled (asform->enable); // on_auto_save_toggled ((GtkWidget*) asform->enable, asform); } void ugtk_auto_save_form_get (struct UgtkAutoSaveForm* asform, UgtkSetting* setting) { setting->auto_save.enable = gtk_toggle_button_get_active (asform->enable); setting->auto_save.interval = gtk_spin_button_get_value_as_int (asform->interval_spin); } // ---------------------------------------------------------------------------- // UgtkCommandlineForm // void ugtk_commandline_form_init (struct UgtkCommandlineForm* clform) { GtkWidget* widget; GtkBox* vbox; GtkBox* hbox; // Commandline Settings widget = gtk_frame_new (_("Commandline Settings")); clform->self = widget; vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) vbox); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); // --quiet widget = gtk_check_button_new_with_mnemonic (_("Use '--quiet' by default")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 1); clform->quiet = (GtkToggleButton*) widget; // --category-index hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Default category index")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); clform->index_label = widget; widget = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); clform->index_spin = (GtkSpinButton*) widget; // hint hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (" - "); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); widget = gtk_label_new (_("Adding to Nth category if no matched category.")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); } void ugtk_commandline_form_set (struct UgtkCommandlineForm* clform, UgtkSetting* setting) { gtk_toggle_button_set_active (clform->quiet, setting->commandline.quiet); gtk_spin_button_set_value (clform->index_spin, setting->commandline.nth_category); } void ugtk_commandline_form_get (struct UgtkCommandlineForm* clform, UgtkSetting* setting) { setting->commandline.quiet = gtk_toggle_button_get_active (clform->quiet); setting->commandline.nth_category = gtk_spin_button_get_value_as_int (clform->index_spin); } // ---------------------------------------------------------------------------- // UgtkPluginForm // static void on_plugin_launch_toggled (GtkWidget* widget, struct UgtkPluginForm* psform) { gboolean sensitive; sensitive = gtk_toggle_button_get_active (psform->launch); gtk_widget_set_sensitive ((GtkWidget*) psform->local, sensitive); } static void on_order_changed (GtkComboBox* widget, struct UgtkPluginForm* psform) { int index; index = gtk_combo_box_get_active (widget); if (index >= UGTK_PLUGIN_ORDER_ARIA2) gtk_widget_set_sensitive (psform->aria2_opts, TRUE); else gtk_widget_set_sensitive (psform->aria2_opts, FALSE); } void ugtk_plugin_form_init (struct UgtkPluginForm* psform) { PangoContext* context; PangoLayout* layout; int text_height; GtkBox* vbox; GtkBox* hbox; GtkBox* box; GtkWidget* widget; GtkScrolledWindow* scroll; psform->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox = (GtkBox*) psform->self; hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 2); widget = gtk_label_new (_("Plug-in matching order:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); widget = gtk_combo_box_text_new (); psform->order = (GtkComboBoxText*) widget; gtk_combo_box_text_insert_text (psform->order, UGTK_PLUGIN_ORDER_CURL, "curl"); gtk_combo_box_text_insert_text (psform->order, UGTK_PLUGIN_ORDER_ARIA2, "aria2"); gtk_combo_box_text_insert_text (psform->order, UGTK_PLUGIN_ORDER_CURL_ARIA2, "curl + aria2"); gtk_combo_box_text_insert_text (psform->order, UGTK_PLUGIN_ORDER_ARIA2_CURL, "aria2 + curl"); g_signal_connect (psform->order, "changed", G_CALLBACK (on_order_changed), psform); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 4); widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (vbox, widget, TRUE, TRUE, 2); psform->aria2_opts = widget; vbox = (GtkBox*) widget; hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 4); widget = gtk_label_new (_("Aria2 plug-in options")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); gtk_box_pack_start (hbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 4); // URI entry hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 2); widget = gtk_label_new (_("URI")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 4); psform->uri = (GtkEntry*) widget; // Token entry hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 2); widget = gtk_label_new (_("RPC authorization secret token")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 4); psform->token = (GtkEntry*) widget; // ------------------------------------------------------------------------ // Speed Limits widget = gtk_frame_new (_("Global speed limit for aria2 only")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 4); box = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) box); gtk_container_set_border_width (GTK_CONTAINER (box), 2); // Max upload speed hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (box, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Max upload speed")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_label_new (_("KiB/s")); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); widget = gtk_spin_button_new_with_range (0.0, 4000000000.0, 5.0); gtk_entry_set_width_chars (GTK_ENTRY (widget), 15); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); psform->upload = (GtkSpinButton*) widget; // Max download speed hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (box, (GtkWidget*) hbox, FALSE, FALSE, 2); widget = gtk_label_new (_("Max download speed")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_label_new (_("KiB/s")); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); widget = gtk_spin_button_new_with_range (0.0, 4000000000.0, 5.0); gtk_entry_set_width_chars (GTK_ENTRY (widget), 15); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_end (hbox, widget, FALSE, FALSE, 2); psform->download = (GtkSpinButton*) widget; // ------------------------------------------------------------------------ // aria2 works on local device // launch widget = gtk_check_button_new_with_mnemonic (_("_Launch aria2 on startup")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 2); g_signal_connect (widget, "toggled", G_CALLBACK (on_plugin_launch_toggled), psform); psform->launch = (GtkToggleButton*) widget; // shutdown widget = gtk_check_button_new_with_mnemonic (_("_Shutdown aria2 on exit")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 2); psform->shutdown = (GtkToggleButton*) widget; // ------------------------------------------------------------------------ // Local options widget = gtk_frame_new (_("Launch aria2 on local device")); gtk_box_pack_start (vbox, widget, FALSE, FALSE, 4); psform->local = widget; box = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (widget), (GtkWidget*) box); gtk_container_set_border_width (GTK_CONTAINER (box), 2); // Path hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (box, (GtkWidget*) hbox, FALSE, TRUE, 4); widget = gtk_label_new (_("Path")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); gtk_box_pack_start (hbox, widget, TRUE, TRUE, 2); psform->path = (GtkEntry*) widget; // gtk_box_pack_start (box, gtk_label_new (""), FALSE, FALSE, 0); // Arguments // get text height --- begin --- context = gtk_widget_get_pango_context (widget); layout = pango_layout_new (context); pango_layout_set_text (layout, "joIN", -1); pango_layout_get_pixel_size (layout, NULL, &text_height); g_object_unref (layout); // get text height --- end --- hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (box, (GtkWidget*) hbox, FALSE, TRUE, 2); widget = gtk_label_new (_("Arguments")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 2); widget = gtk_label_new (" - "); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); // Arguments - hint widget = gtk_label_new (_("You must restart uGet after modifying it.")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); // Arguments - Scrolled Window scroll = (GtkScrolledWindow*) gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (scroll, GTK_SHADOW_IN); gtk_widget_set_size_request (GTK_WIDGET (scroll), 100, text_height * 3); gtk_box_pack_start (box, GTK_WIDGET (scroll), FALSE, TRUE, 2); // Arguments - text view psform->args_buffer = gtk_text_buffer_new (NULL); psform->args = gtk_text_view_new_with_buffer (psform->args_buffer); g_object_unref (psform->args_buffer); gtk_text_view_set_wrap_mode ((GtkTextView*) psform->args, GTK_WRAP_CHAR); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (psform->args)); // ------------------------------------------------------------------------ on_plugin_launch_toggled ((GtkWidget*) psform->launch, psform); gtk_widget_show (psform->self); } void ugtk_plugin_form_set (struct UgtkPluginForm* psform, UgtkSetting* setting) { gtk_combo_box_set_active ((GtkComboBox*) psform->order, setting->plugin_order); gtk_toggle_button_set_active (psform->launch, setting->aria2.launch); gtk_toggle_button_set_active (psform->shutdown, setting->aria2.shutdown); if (setting->aria2.uri) gtk_entry_set_text (psform->uri, setting->aria2.uri); if (setting->aria2.token) gtk_entry_set_text (psform->token, setting->aria2.token); if (setting->aria2.path) gtk_entry_set_text (psform->path, setting->aria2.path); // if (setting->aria2.args) // gtk_entry_set_text (psform->args, setting->aria2.args); if (setting->aria2.args) gtk_text_buffer_set_text (psform->args_buffer, setting->aria2.args, -1); gtk_spin_button_set_value (psform->upload, setting->aria2.limit.upload); gtk_spin_button_set_value (psform->download, setting->aria2.limit.download); } void ugtk_plugin_form_get (struct UgtkPluginForm* psform, UgtkSetting* setting) { GtkTextIter iter1; GtkTextIter iter2; const char* token; setting->plugin_order = gtk_combo_box_get_active ((GtkComboBox*) psform->order); setting->aria2.launch = gtk_toggle_button_get_active (psform->launch); setting->aria2.shutdown = gtk_toggle_button_get_active (psform->shutdown); ug_free (setting->aria2.uri); ug_free (setting->aria2.token); ug_free (setting->aria2.path); ug_free (setting->aria2.args); setting->aria2.uri = ug_strdup (gtk_entry_get_text (psform->uri)); token = gtk_entry_get_text (psform->token); if (token[0] == 0) setting->aria2.token = NULL; else setting->aria2.token = ug_strdup (token); setting->aria2.path = ug_strdup (gtk_entry_get_text (psform->path)); // setting->aria2.args = ug_strdup (gtk_entry_get_text (psform->args)); gtk_text_buffer_get_start_iter (psform->args_buffer, &iter1); gtk_text_buffer_get_end_iter (psform->args_buffer, &iter2); setting->aria2.args = gtk_text_buffer_get_text (psform->args_buffer, &iter1, &iter2, FALSE); ug_str_remove_crlf (setting->aria2.args, setting->aria2.args); setting->aria2.limit.upload = (guint) gtk_spin_button_get_value (psform->upload); setting->aria2.limit.download = (guint) gtk_spin_button_get_value (psform->download); } // ---------------------------------------------------------------------------- // UgtkMediaWebsiteForm // static void on_match_mode_changed (GtkComboBox* widget, struct UgtkMediaWebsiteForm* mwform) { gboolean sensitive; int index; index = gtk_combo_box_get_active (widget); if (index == UGET_MEDIA_MATCH_0) sensitive = FALSE; else sensitive = TRUE; gtk_widget_set_sensitive ((GtkWidget*) mwform->quality, sensitive); gtk_widget_set_sensitive ((GtkWidget*) mwform->type, sensitive); } void ugtk_media_website_form_init (struct UgtkMediaWebsiteForm* mwform) { GtkBox* vbox; GtkBox* hbox; GtkWidget* widget; GtkGrid* grid; mwform->self = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox = (GtkBox*) mwform->self; hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 2); widget = gtk_label_new (_("Media matching mode:")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); widget = gtk_combo_box_text_new (); mwform->match_mode = (GtkComboBoxText*) widget; gtk_combo_box_text_insert_text (mwform->match_mode, UGET_MEDIA_MATCH_0, _("Don't match")); gtk_combo_box_text_insert_text (mwform->match_mode, UGET_MEDIA_MATCH_1, _("Match 1 condition")); gtk_combo_box_text_insert_text (mwform->match_mode, UGET_MEDIA_MATCH_2, _("Match 2 condition")); gtk_combo_box_text_insert_text (mwform->match_mode, UGET_MEDIA_MATCH_NEAR, _("Near quality")); g_signal_connect (mwform->match_mode, "changed", G_CALLBACK (on_match_mode_changed), mwform); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 4); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, TRUE, 4); widget = gtk_label_new (_("Match conditions")); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); gtk_box_pack_start (hbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 4); // conditions grid = (GtkGrid*) gtk_grid_new (); gtk_box_pack_start (vbox, (GtkWidget*) grid, FALSE, FALSE, 0); // Quality widget = gtk_label_new (_("Quality:")); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, widget, 0, 0, 1, 1); widget = gtk_combo_box_text_new (); mwform->quality = (GtkComboBoxText*) widget; gtk_combo_box_text_insert_text (mwform->quality, UGET_MEDIA_QUALITY_240P, "240p"); gtk_combo_box_text_insert_text (mwform->quality, UGET_MEDIA_QUALITY_360P, "360p"); gtk_combo_box_text_insert_text (mwform->quality, UGET_MEDIA_QUALITY_480P, "480p"); gtk_combo_box_text_insert_text (mwform->quality, UGET_MEDIA_QUALITY_720P, "720p"); gtk_combo_box_text_insert_text (mwform->quality, UGET_MEDIA_QUALITY_1080P, "1080p"); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, widget, 1, 0, 1, 1); // Type widget = gtk_label_new (_("Type:")); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, widget, 0, 1, 1, 1); widget = gtk_combo_box_text_new (); mwform->type = (GtkComboBoxText*) widget; gtk_combo_box_text_insert_text (mwform->type, UGET_MEDIA_TYPE_MP4, "mp4"); gtk_combo_box_text_insert_text (mwform->type, UGET_MEDIA_TYPE_WEBM, "webm"); gtk_combo_box_text_insert_text (mwform->type, UGET_MEDIA_TYPE_3GPP, "3gpp"); gtk_combo_box_text_insert_text (mwform->type, UGET_MEDIA_TYPE_FLV, "flv"); g_object_set (widget, "margin-left", 3, "margin-right", 3, NULL); g_object_set (widget, "margin-top", 2, "margin-bottom", 2, NULL); gtk_grid_attach (grid, widget, 1, 1, 1, 1); gtk_widget_show (mwform->self); } void ugtk_media_website_form_set (struct UgtkMediaWebsiteForm* mwform, UgtkSetting* setting) { gtk_combo_box_set_active ((GtkComboBox*) mwform->match_mode, setting->media.match_mode); gtk_combo_box_set_active ((GtkComboBox*) mwform->quality, setting->media.quality); gtk_combo_box_set_active ((GtkComboBox*) mwform->type, setting->media.type); } void ugtk_media_website_form_get (struct UgtkMediaWebsiteForm* mwform, UgtkSetting* setting) { setting->media.match_mode = gtk_combo_box_get_active ((GtkComboBox*) mwform->match_mode); setting->media.quality = gtk_combo_box_get_active ((GtkComboBox*) mwform->quality); setting->media.type = gtk_combo_box_get_active ((GtkComboBox*) mwform->type); } uget-2.2.2/ui-gtk/UgtkNodeList.h0000664000175000017500000000623713470304403013337 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ /* * This file base on GTK+ 2.0 Tree View Tutorial - custom-list.h */ #ifndef UGTK_NODE_LIST_H #define UGTK_NODE_LIST_H #include #include #ifdef __cplusplus extern "C" { #endif #define UGTK_TYPE_NODE_LIST (ugtk_node_list_get_type ()) #define UGTK_NODE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UGTK_TYPE_NODE_LIST, UgtkNodeList)) #define UGTK_NODE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UGTK_TYPE_NODE_LIST, UgtkNodeListClass)) #define UGTK_IS_NODE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UGTK_TYPE_NODE_LIST)) #define UGTK_IS_NODE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UGTK_TYPE_NODE_LIST)) #define UGTK_NODE_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UGTK_TYPE_NODE_LIST, UgtkNodeListClass)) typedef struct UgtkNodeList UgtkNodeList; typedef struct UgtkNodeListClass UgtkNodeListClass; // ---------------------------------------------------------------------------- // UgtkNodeList : GtkTreeModel for UgetNode real and fake nodes. struct UgtkNodeList { GObject parent; // this MUST be the first member UgetNode* root; gint stamp; // Random integer to check whether an iter belongs to our model gint n_fake; gboolean root_visible; // show root as first item }; // ------------------------------------ struct UgtkNodeListClass { GObjectClass parent_class; }; UgtkNodeList* ugtk_node_list_new (UgetNode* root, gint n_fake, gboolean root_visible); GType ugtk_node_list_get_type (void); #ifdef __cplusplus } #endif #endif // UGTK_NODE_LIST_H uget-2.2.2/ui-gtk/UgtkSummary.c0000664000175000017500000002262413470304403013244 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // static functions static GtkTreeView* ugtk_summary_view_new (); static void ugtk_summary_store_realloc_next (GtkListStore* store, GtkTreeIter* iter); static void ugtk_summary_menu_init (UgtkSummary* summary, GtkAccelGroup* accel_group); void ugtk_summary_init (UgtkSummary* summary, GtkAccelGroup* accel_group) { GtkScrolledWindow* scroll; summary->store = gtk_list_store_new (UGTK_SUMMARY_N_COLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); summary->view = ugtk_summary_view_new (); gtk_tree_view_set_model (summary->view, GTK_TREE_MODEL (summary->store)); summary->self = gtk_scrolled_window_new (NULL, NULL); scroll = GTK_SCROLLED_WINDOW (summary->self); gtk_scrolled_window_set_shadow_type (scroll, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (summary->view)); gtk_widget_set_size_request (summary->self, 200, 90); gtk_widget_show_all (summary->self); // menu ugtk_summary_menu_init (summary, accel_group); // visible summary->visible.name = 1; summary->visible.folder = 1; summary->visible.category = 0; summary->visible.uri = 0; summary->visible.message = 1; } void ugtk_summary_show (UgtkSummary* summary, UgetNode* node) { GtkTreeIter iter; gchar* name; gchar* value; gchar* stock; union { UgetLog* log; UgetEvent* event; UgetCommon* common; } temp; if (node == NULL) { gtk_list_store_clear (summary->store); return; } iter.stamp = 0; // used by ugtk_summary_store_realloc_next() temp.common = ug_info_get (node->info, UgetCommonInfo); // Summary Name if (summary->visible.name) { if (temp.common && temp.common->name) { name = g_strconcat (_("Name"), ":", NULL); value = temp.common->name; } else { name = g_strconcat (_("File"), ":", NULL); value = (temp.common) ? temp.common->file : NULL; if (value == NULL) value = _("unnamed"); } ugtk_summary_store_realloc_next (summary->store, &iter); gtk_list_store_set (summary->store, &iter, UGTK_SUMMARY_COLUMN_ICON , GTK_STOCK_FILE, UGTK_SUMMARY_COLUMN_NAME , name, UGTK_SUMMARY_COLUMN_VALUE, value, -1); g_free (name); } // Summary Folder if (summary->visible.folder) { name = g_strconcat (_("Folder"), ":", NULL); value = (temp.common) ? temp.common->folder : NULL; ugtk_summary_store_realloc_next (summary->store, &iter); gtk_list_store_set (summary->store, &iter, UGTK_SUMMARY_COLUMN_ICON , GTK_STOCK_DIRECTORY, UGTK_SUMMARY_COLUMN_NAME , name, UGTK_SUMMARY_COLUMN_VALUE, value, -1); g_free (name); } // Summary Category if (summary->visible.category) { name = g_strconcat (_("Category"), ":", NULL); if (node->parent) { temp.common = ug_info_get (node->parent->info, UgetCommonInfo); value = (temp.common) ? temp.common->name : NULL; temp.common = ug_info_get (node->info, UgetCommonInfo); } else value = NULL; ugtk_summary_store_realloc_next (summary->store, &iter); gtk_list_store_set (summary->store, &iter, UGTK_SUMMARY_COLUMN_ICON , GTK_STOCK_DND_MULTIPLE, UGTK_SUMMARY_COLUMN_NAME , name, UGTK_SUMMARY_COLUMN_VALUE, value, -1); g_free (name); } // Summary URL if (summary->visible.uri) { name = g_strconcat (_("URI"), ":", NULL); value = (temp.common) ? temp.common->uri : NULL; ugtk_summary_store_realloc_next (summary->store, &iter); gtk_list_store_set (summary->store, &iter, UGTK_SUMMARY_COLUMN_ICON , GTK_STOCK_NETWORK, UGTK_SUMMARY_COLUMN_NAME , name, UGTK_SUMMARY_COLUMN_VALUE, value, -1); g_free (name); } // Summary Message temp.log = ug_info_get (node->info, UgetLogInfo); if (temp.log) temp.event = (UgetEvent*) temp.log->messages.head; if (summary->visible.message) { if (temp.event == NULL) { stock = GTK_STOCK_INFO; value = NULL; } else { value = temp.event->string; switch (temp.event->type) { case UGET_EVENT_ERROR: stock = GTK_STOCK_DIALOG_ERROR; break; case UGET_EVENT_WARNING: stock = GTK_STOCK_DIALOG_WARNING; break; default: stock = GTK_STOCK_INFO; break; } } name = g_strconcat (_("Message"), ":", NULL); ugtk_summary_store_realloc_next (summary->store, &iter); gtk_list_store_set (summary->store, &iter, UGTK_SUMMARY_COLUMN_ICON , stock, UGTK_SUMMARY_COLUMN_NAME , name, UGTK_SUMMARY_COLUMN_VALUE, value, -1); } // clear remaining rows if (gtk_tree_model_iter_next (GTK_TREE_MODEL (summary->store), &iter)) { while (gtk_list_store_remove (summary->store, &iter)) continue; } } gchar* ugtk_summary_get_text_selected (UgtkSummary* summary) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; gchar* name; gchar* value; gtk_tree_view_get_cursor (summary->view, &path, NULL); if (path == NULL) return NULL; model = GTK_TREE_MODEL (summary->store); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); gtk_tree_model_get (model, &iter, UGTK_SUMMARY_COLUMN_NAME , &name, UGTK_SUMMARY_COLUMN_VALUE, &value, -1); return g_strconcat (name, " ", value, NULL); } gchar* ugtk_summary_get_text_all (UgtkSummary* summary) { GtkTreeModel* model; GtkTreeIter iter; gchar* name; gchar* value; gboolean valid; GString* gstr; gstr = g_string_sized_new (60); model = GTK_TREE_MODEL (summary->store); valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { gtk_tree_model_get (model, &iter, UGTK_SUMMARY_COLUMN_NAME , &name, UGTK_SUMMARY_COLUMN_VALUE, &value, -1); valid = gtk_tree_model_iter_next (model, &iter); // string g_string_append (gstr, name); if (value) { g_string_append_c (gstr, ' '); g_string_append (gstr, value); } g_string_append_c (gstr, '\n'); } return g_string_free (gstr, FALSE); } // ---------------------------------------------------------------------------- // UgtkSummary static functions // static GtkTreeView* ugtk_summary_view_new () { GtkTreeView* view; GtkCellRenderer* renderer; view = (GtkTreeView*) gtk_tree_view_new (); gtk_tree_view_set_headers_visible (view, FALSE); // columns renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_insert_column_with_attributes ( view, UGTK_SUMMARY_COLUMN_ICON, NULL, renderer, "stock-id", UGTK_SUMMARY_COLUMN_ICON, NULL); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes ( view, UGTK_SUMMARY_COLUMN_NAME, _("Item"), renderer, "text", UGTK_SUMMARY_COLUMN_NAME, NULL); gtk_tree_view_insert_column_with_attributes ( view, UGTK_SUMMARY_COLUMN_VALUE, _("Value"), renderer, "text", UGTK_SUMMARY_COLUMN_VALUE, NULL); return view; } static void ugtk_summary_store_realloc_next (GtkListStore* store, GtkTreeIter* iter) { GtkTreeModel* model; model = GTK_TREE_MODEL (store); if (iter->stamp == 0) { if (gtk_tree_model_get_iter_first (model, iter) == FALSE) gtk_list_store_append (store, iter); } else if (gtk_tree_model_iter_next (model, iter) == FALSE) gtk_list_store_append (store, iter); } static void ugtk_summary_menu_init (UgtkSummary* summary, GtkAccelGroup* accel_group) { GtkWidget* image; GtkWidget* menu; GtkWidget* menu_item; // UgtkSummary.menu menu = gtk_menu_new (); // Copy menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, accel_group); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); summary->menu.copy = menu_item; // Copy All menu_item = gtk_image_menu_item_new_with_mnemonic (_("Copy _All")); image = gtk_image_new_from_stock (GTK_STOCK_SELECT_ALL, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); summary->menu.copy_all = menu_item; gtk_widget_show_all (menu); summary->menu.self = GTK_MENU (menu); } uget-2.2.2/ui-gtk/UgtkSequence.h0000664000175000017500000000666113470304403013367 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SEQUENCE_H #define UGTK_SEQUENCE_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkSequence UgtkSequence; typedef struct UgtkSeqRange UgtkSeqRange; typedef void (*UgtkSequenceNotify) (gpointer user_data, gboolean completed); enum UgtkSeqType { UGTK_SEQ_TYPE_NONE, UGTK_SEQ_TYPE_NUMBER, UGTK_SEQ_TYPE_CHARACTER }; // ----------------------------------------------------------------------------- // UgtkSeqRange struct UgtkSeqRange { GtkWidget* self; GtkWidget* type; // GtkComboBox - None, Number, and Character GtkWidget* label_to; // digit mode GtkWidget* spin_from; GtkWidget* spin_to; GtkWidget* spin_digits; GtkWidget* label_digits; // character mode GtkWidget* entry_from; GtkWidget* entry_to; GtkWidget* label_case; }; void ugtk_seq_range_init (UgtkSeqRange* range, UgtkSequence* seq, GtkSizeGroup* size_group); void ugtk_seq_range_set_type (UgtkSeqRange* range, enum UgtkSeqType type); enum UgtkSeqType ugtk_seq_range_get_type (UgtkSeqRange* range); // ----------------------------------------------------------------------------- // UgtkSequence struct UgtkSequence { GtkWidget* self; // GtkGrid GtkEntry* entry; // URI + wildcard character (*) UgtkSeqRange range[3]; // range x 3 UgetSequence sequence; // preview struct UgtkSequencePreview { GtkWidget* self; // GtkScrolledWindow GtkTreeView* view; GtkListStore* store; guint status; } preview; // callback struct { // UgtkNotify func1; UgtkSequenceNotify func; gpointer data; } notify; }; void ugtk_sequence_init (UgtkSequence* seq); void ugtk_sequence_show_preview (UgtkSequence* seq); int ugtk_sequence_get_list (UgtkSequence* seq, UgList* result); #ifdef __cplusplus } #endif #endif // End of UGTK_SEQUENCE_H uget-2.2.2/ui-gtk/UgtkSettingDialog.c0000664000175000017500000002376513470304403014353 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include // Callback static void on_cursor_changed (GtkTreeView* view, UgtkSettingDialog* sdialog); static void on_response (GtkDialog *dialog, gint response_id, UgtkSettingDialog* sdialog); UgtkSettingDialog* ugtk_setting_dialog_new (const gchar* title, GtkWindow* parent) { PangoContext* context; PangoLayout* layout; int text_width; UgtkSettingDialog* dialog; GtkCellRenderer* renderer; GtkWidget* widget; GtkBox* vbox; GtkBox* hbox; dialog = g_malloc0 (sizeof (UgtkSettingDialog)); dialog->self = (GtkDialog*) gtk_dialog_new_with_buttons (title, parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); #if GTK_MAJOR_VERSION <= 3 && GTK_MINOR_VERSION < 14 gtk_window_set_has_resize_grip ((GtkWindow*) dialog->self, FALSE); #endif gtk_dialog_set_default_response (dialog->self, GTK_RESPONSE_OK); vbox = (GtkBox*) gtk_dialog_get_content_area (dialog->self); hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (vbox, GTK_WIDGET (hbox), FALSE, FALSE, 2); // Notebook widget = gtk_notebook_new (); gtk_widget_set_size_request (widget, 430, 320); gtk_box_pack_end (hbox, widget, TRUE, TRUE, 3); dialog->notebook = (GtkNotebook*) widget; gtk_notebook_set_show_tabs (dialog->notebook, FALSE); gtk_notebook_set_show_border (dialog->notebook, FALSE); // get text width context = gtk_widget_get_pango_context (widget); layout = pango_layout_new (context); pango_layout_set_text (layout, "User Interface", -1); pango_layout_get_pixel_size (layout, &text_width, NULL); g_object_unref (layout); text_width = text_width * 5 / 3; if (text_width < 130) text_width = 130; // TreeView dialog->list_store = gtk_list_store_new (1, G_TYPE_STRING); widget = gtk_tree_view_new_with_model ( GTK_TREE_MODEL (dialog->list_store)); gtk_widget_set_size_request (widget, text_width, 120); gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0); dialog->tree_view = (GtkTreeView*) widget; gtk_tree_view_set_headers_visible (dialog->tree_view, FALSE); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes ( dialog->tree_view, 0, _("Name"), renderer, "text", 0, NULL); g_signal_connect (dialog->tree_view, "cursor-changed", G_CALLBACK (on_cursor_changed), dialog); // ------------------------------------------------------------------------ // UI settings page vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); ugtk_user_interface_form_init (&dialog->ui); gtk_box_pack_start (vbox, dialog->ui.self, FALSE, FALSE, 2); ugtk_setting_dialog_add (dialog, _("User Interface"), (GtkWidget*) vbox); // ------------------------------------------------------------------------ // Clipboard settings page ugtk_clipboard_form_init (&dialog->clipboard); gtk_container_set_border_width (GTK_CONTAINER (dialog->clipboard.self), 2); ugtk_setting_dialog_add (dialog, _("Clipboard"), dialog->clipboard.self); // ------------------------------------------------------------------------ // Bandwidth settings page ugtk_bandwidth_form_init (&dialog->bandwidth); gtk_container_set_border_width (GTK_CONTAINER (dialog->bandwidth.self), 2); ugtk_setting_dialog_add (dialog, _("Bandwidth"), dialog->bandwidth.self); // ------------------------------------------------------------------------ // Scheduler settings page ugtk_schedule_form_init (&dialog->scheduler); gtk_container_set_border_width (GTK_CONTAINER (dialog->scheduler.self), 2); ugtk_setting_dialog_add (dialog, _("Scheduler"), dialog->scheduler.self); // ------------------------------------------------------------------------ // Plugin settings page ugtk_plugin_form_init (&dialog->plugin); gtk_container_set_border_width (GTK_CONTAINER (dialog->plugin.self), 2); ugtk_setting_dialog_add (dialog, _("Plug-in"), dialog->plugin.self); // ------------------------------------------------------------------------ // Plugin Media & Media Website settings page ugtk_media_website_form_init (&dialog->media_website); gtk_container_set_border_width (GTK_CONTAINER (dialog->media_website.self), 2); ugtk_setting_dialog_add (dialog, _("Media website"), dialog->media_website.self); // ------------------------------------------------------------------------ // Others settings page vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); ugtk_setting_dialog_add (dialog, _("Others"), (GtkWidget*) vbox); ugtk_commandline_form_init (&dialog->commandline); gtk_box_pack_start (vbox, dialog->commandline.self, FALSE, FALSE, 4); gtk_box_pack_start (vbox, gtk_label_new (""), FALSE, FALSE, 0); ugtk_auto_save_form_init (&dialog->auto_save); gtk_box_pack_start (vbox, dialog->auto_save.self, FALSE, FALSE, 2); gtk_box_pack_start (vbox, gtk_label_new (""), FALSE, FALSE, 0); ugtk_completion_form_init (&dialog->completion); gtk_box_pack_start (vbox, dialog->completion.self, FALSE, FALSE, 2); gtk_widget_show_all ((GtkWidget*) hbox); // gtk_container_set_focus_child (GTK_CONTAINER (dialog->self), dialog->pattern_entry); // g_signal_connect (dialog->pattern_entry, "key-press-event", G_CALLBACK (on_key_press_event), dialog); return dialog; } void ugtk_setting_dialog_free (UgtkSettingDialog* dialog) { gtk_widget_destroy ((GtkWidget*) dialog->self); g_free (dialog); } void ugtk_setting_dialog_run (UgtkSettingDialog* dialog, UgtkApp* app) { dialog->app = app; g_signal_connect (dialog->self, "response", G_CALLBACK (on_response), dialog); gtk_widget_show ((GtkWidget*) dialog->self); } void ugtk_setting_dialog_set (UgtkSettingDialog* dialog, UgtkSetting* setting) { ugtk_schedule_form_set (&dialog->scheduler, setting); ugtk_clipboard_form_set (&dialog->clipboard, setting); ugtk_bandwidth_form_set (&dialog->bandwidth, setting); ugtk_user_interface_form_set (&dialog->ui, setting); ugtk_completion_form_set (&dialog->completion, setting); ugtk_auto_save_form_set (&dialog->auto_save, setting); ugtk_commandline_form_set (&dialog->commandline, setting); ugtk_plugin_form_set (&dialog->plugin, setting); ugtk_media_website_form_set (&dialog->media_website, setting); } void ugtk_setting_dialog_get (UgtkSettingDialog* dialog, UgtkSetting* setting) { ugtk_schedule_form_get (&dialog->scheduler, setting); ugtk_clipboard_form_get (&dialog->clipboard, setting); ugtk_bandwidth_form_get (&dialog->bandwidth, setting); ugtk_user_interface_form_get (&dialog->ui, setting); ugtk_completion_form_get (&dialog->completion, setting); ugtk_auto_save_form_get (&dialog->auto_save, setting); ugtk_commandline_form_get (&dialog->commandline, setting); ugtk_plugin_form_get (&dialog->plugin, setting); ugtk_media_website_form_get (&dialog->media_website, setting); } void ugtk_setting_dialog_add (UgtkSettingDialog* sdialog, const gchar* title, GtkWidget* page) { GtkTreeIter iter; gtk_list_store_append (sdialog->list_store, &iter); gtk_list_store_set (sdialog->list_store, &iter, 0, title, -1); gtk_notebook_append_page (sdialog->notebook, page, gtk_label_new (title)); } void ugtk_setting_dialog_set_page (UgtkSettingDialog* sdialog, int nth) { GtkTreePath* path; path = gtk_tree_path_new_from_indices (nth, -1); gtk_tree_view_set_cursor (sdialog->tree_view, path, NULL, FALSE); gtk_tree_path_free (path); gtk_notebook_set_current_page (sdialog->notebook, nth); } // ---------------------------------------------------------------------------- // Callback static void on_cursor_changed (GtkTreeView* view, UgtkSettingDialog* sdialog) { GtkTreePath* path; int nth; gtk_tree_view_get_cursor (view, &path, NULL); if (path == NULL) return; nth = *gtk_tree_path_get_indices (path); gtk_tree_path_free (path); gtk_notebook_set_current_page (sdialog->notebook, nth); } static void on_response (GtkDialog *dialog, gint response_id, UgtkSettingDialog* sdialog) { UgtkApp* app; app = sdialog->app; if (app) app->dialogs.setting = NULL; if (response_id == GTK_RESPONSE_OK) { ugtk_setting_dialog_get (sdialog, &app->setting); ugtk_app_set_ui_setting (app, &app->setting); ugtk_app_set_menu_setting (app, &app->setting); ugtk_app_set_other_setting (app, &app->setting); ugtk_app_set_plugin_setting (app, &app->setting); } ugtk_setting_dialog_free (sdialog); } uget-2.2.2/ui-gtk/Makefile.am0000664000175000017500000000337013470304403012641 00000000000000bin_PROGRAMS = uget-gtk uget_gtk_CPPFLAGS = \ -DUG_DATADIR='"$(datadir)"' \ -I$(top_srcdir)/ui-gtk \ -I$(top_srcdir)/uget \ -I$(top_srcdir)/uglib uget_gtk_CFLAGS = \ @PTHREAD_CFLAGS@ \ @LFS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBGCRYPT_CFLAGS@ \ @LIBCRYPTO_CFLAGS@ \ @GTK_CFLAGS@ \ @LIBNOTIFY_CFLAGS@ \ @APP_INDICATOR_CFLAGS@ \ @GSTREAMER_CFLAGS@ \ @LIBPWMD_CFLAGS@ uget_gtk_LDFLAGS = @LFS_LDFLAGS@ uget_gtk_LDADD = \ $(top_builddir)/uget/libuget.a \ $(top_builddir)/uglib/libuglib.a \ @PTHREAD_LIBS@ \ @CURL_LIBS@ \ @LIBGCRYPT_LIBS@ \ @LIBCRYPTO_LIBS@ \ @GTK_LIBS@ \ @LIBNOTIFY_LIBS@ \ @APP_INDICATOR_LIBS@ \ @GSTREAMER_LIBS@ \ @LIBPWMD_LIBS@ uget_gtk_SOURCES = \ UgtkUtil.c UgtkConfig.c UgtkSetting.c \ UgtkNodeList.c UgtkNodeTree.c UgtkNodeView.c \ UgtkTraveler.c UgtkSummary.c \ UgtkTrayIcon.c UgtkBanner.c \ UgtkSequence.c UgtkSelector.c \ UgtkProxyForm.c UgtkDownloadForm.c UgtkCategoryForm.c \ UgtkNodeDialog.c UgtkBatchDialog.c \ UgtkScheduleForm.c UgtkSettingForm.c UgtkSettingDialog.c \ UgtkConfirmDialog.c UgtkAboutDialog.c \ UgtkMenubar.c UgtkMenubar-ui.c \ UgtkApp.c UgtkApp-ui.c UgtkApp-callback.c \ UgtkApp-timeout.c UgtkApp-main.c noinst_HEADERS = \ UgtkUtil.h UgtkConfig.h UgtkSetting.h \ UgtkNodeList.h UgtkNodeTree.h UgtkNodeView.h \ UgtkTraveler.h UgtkSummary.h \ UgtkTrayIcon.h UgtkBanner.h \ UgtkSequence.h UgtkSelector.h \ UgtkProxyForm.h UgtkDownloadForm.h UgtkCategoryForm.h \ UgtkNodeDialog.h UgtkBatchDialog.h \ UgtkScheduleForm.h UgtkSettingForm.h UgtkSettingDialog.h \ UgtkConfirmDialog.h UgtkAboutDialog.h \ UgtkMenubar.h \ UgtkApp.h uget-2.2.2/ui-gtk/UgtkConfig.c0000664000175000017500000000654713470304403013022 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include // ---------------------------------------------------------------------------- // path #if defined _WIN32 || defined _WIN64 #include const char* ugtk_get_install_dir (void) { static gchar* install_dir = NULL; if (install_dir == NULL) { gchar* path; gunichar2* path_wcs; HMODULE hmod; hmod = GetModuleHandle (NULL); // UNICODE path_wcs = g_malloc (sizeof (wchar_t) * MAX_PATH); GetModuleFileNameW (hmod, path_wcs, MAX_PATH); path = g_utf16_to_utf8 (path_wcs, -1, NULL, NULL, NULL); g_free (path_wcs); install_dir = g_path_get_dirname (path); g_free (path); } return install_dir; } gboolean ugtk_is_portable_mode (void) { static int portable = -1; char* local_path; if (portable == -1) { local_path = g_build_filename (ugtk_get_install_dir(), "uget-portable-mode", NULL); portable = g_file_test (local_path, G_FILE_TEST_EXISTS); g_free (local_path); } return portable; } const char* ugtk_get_data_dir (void) { static gchar* data_dir = NULL; if (data_dir == NULL) data_dir = g_build_filename (ugtk_get_install_dir(), "..", "share", NULL); return data_dir; } const char* ugtk_get_config_dir (void) { static const gchar* config_dir = NULL; if (config_dir == NULL) { if (ugtk_is_portable_mode () == TRUE) config_dir = g_build_filename (ugtk_get_install_dir(), "..", "config", NULL); else config_dir = g_get_user_config_dir (); } return config_dir; } #else const char* ugtk_get_data_dir (void) { return UG_DATADIR; } const char* ugtk_get_config_dir (void) { return g_get_user_config_dir (); } #endif // _WIN32 || _WIN64 const char* ugtk_get_locale_dir (void) { static gchar* locale_dir = NULL; if (locale_dir == NULL) locale_dir = g_build_filename (ugtk_get_data_dir(), "locale", NULL); return locale_dir; } uget-2.2.2/ui-gtk/UgtkConfirmDialog.c0000664000175000017500000001603013470304403014316 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include // response static void on_confirm_to_exit_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog); static void on_confirm_to_delete_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog); static void on_confirm_to_delete_category_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog); UgtkConfirmDialog* ugtk_confirm_dialog_new (UgtkConfirmDialogMode mode, UgtkApp* app) { UgtkConfirmDialog* cdialog; GtkWidget* button; GtkBox* hbox; GtkBox* vbox; gchar* temp; const char* title; const char* label; cdialog = g_malloc (sizeof (UgtkConfirmDialog)); cdialog->app = app; // create confirmation dialog switch (mode) { case UGTK_CONFIRM_DIALOG_EXIT: title = _("Really Quit?"); label = _("Are you sure you want to quit?"); break; case UGTK_CONFIRM_DIALOG_DELETE: title = _("Really delete files?"); label = _("Are you sure you want to delete files?"); break; case UGTK_CONFIRM_DIALOG_DELETE_CATEGORY: title = _("Really delete category?"); label = _("Are you sure you want to delete category?"); break; default: title = NULL; label = NULL; break; } temp = g_strconcat (UGTK_APP_NAME " - ", title, NULL); cdialog->self = (GtkDialog*) gtk_dialog_new_with_buttons (temp, app->window.self, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_NO, GTK_RESPONSE_NO, GTK_STOCK_YES, GTK_RESPONSE_YES, NULL); g_free (temp); #if GTK_MAJOR_VERSION <= 3 && GTK_MINOR_VERSION < 14 gtk_window_set_has_resize_grip ((GtkWindow*) cdialog->self, FALSE); #endif gtk_container_set_border_width (GTK_CONTAINER (cdialog->self), 4); vbox = (GtkBox*) gtk_dialog_get_content_area (cdialog->self); // image and label hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (hbox, gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG), FALSE, FALSE, 8); gtk_box_pack_start (hbox, gtk_label_new (label), FALSE, FALSE, 4); gtk_box_pack_start (vbox, (GtkWidget*) hbox, FALSE, FALSE, 6); // check button hbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); button = gtk_check_button_new_with_label (_("Don't ask me again")); gtk_box_pack_end (hbox, button, TRUE, TRUE, 20); gtk_box_pack_end (vbox, (GtkWidget*) hbox, FALSE, FALSE, 10); cdialog->confirmation = (GtkToggleButton*) button; // gtk_widget_show_all ((GtkWidget*) vbox); switch (mode) { case UGTK_CONFIRM_DIALOG_EXIT: app->dialogs.exit_confirmation = (GtkWidget*) cdialog->self; g_signal_connect (cdialog->self, "response", G_CALLBACK (on_confirm_to_exit_response), cdialog); break; case UGTK_CONFIRM_DIALOG_DELETE: app->dialogs.delete_confirmation = (GtkWidget*) cdialog->self; g_signal_connect (cdialog->self, "response", G_CALLBACK (on_confirm_to_delete_response), cdialog); break; case UGTK_CONFIRM_DIALOG_DELETE_CATEGORY: app->dialogs.delete_category_confirmation = (GtkWidget*) cdialog->self; gtk_widget_hide ((GtkWidget*) cdialog->confirmation); g_signal_connect (cdialog->self, "response", G_CALLBACK (on_confirm_to_delete_category_response), cdialog); break; default: g_signal_connect (cdialog->self, "response", G_CALLBACK (gtk_widget_destroy), NULL); break; } return cdialog; } void ugtk_confirm_dialog_free (UgtkConfirmDialog* cdialog) { gtk_widget_destroy ((GtkWidget*) cdialog->self); g_free (cdialog); } void ugtk_confirm_dialog_run (UgtkConfirmDialog* cdialog) { UgtkApp* app; app = cdialog->app; gtk_widget_set_sensitive ((GtkWidget*) app->window.self, FALSE); gtk_widget_show ((GtkWidget*) cdialog->self); } static void on_confirm_to_exit_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog) { UgtkApp* app; app = cdialog->app; app->dialogs.exit_confirmation = NULL; if (response == GTK_RESPONSE_YES) { if (gtk_toggle_button_get_active (cdialog->confirmation) == FALSE) app->setting.ui.exit_confirmation = TRUE; else app->setting.ui.exit_confirmation = FALSE; ugtk_app_quit (app); } gtk_widget_set_sensitive ((GtkWidget*) app->window.self, TRUE); ugtk_confirm_dialog_free (cdialog); } static void on_confirm_to_delete_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog) { UgtkApp* app; app = cdialog->app; app->dialogs.delete_confirmation = NULL; if (response == GTK_RESPONSE_YES) { if (gtk_toggle_button_get_active (cdialog->confirmation) == FALSE) app->setting.ui.delete_confirmation = TRUE; else app->setting.ui.delete_confirmation = FALSE; ugtk_app_delete_download (app, TRUE); } gtk_widget_set_sensitive ((GtkWidget*) app->window.self, TRUE); ugtk_confirm_dialog_free (cdialog); } static void on_confirm_to_delete_category_response (GtkWidget* dialog, gint response, UgtkConfirmDialog* cdialog) { UgtkApp* app; app = cdialog->app; app->dialogs.delete_category_confirmation = NULL; if (response == GTK_RESPONSE_YES) { // if (gtk_toggle_button_get_active (cdialog->confirmation) == FALSE) // app->setting.ui.delete_category_confirmation = TRUE; // else // app->setting.ui.delete_category_confirmation = FALSE; ugtk_app_delete_category (app); } gtk_widget_set_sensitive ((GtkWidget*) app->window.self, TRUE); ugtk_confirm_dialog_free (cdialog); } uget-2.2.2/ui-gtk/UgtkCategoryForm.h0000664000175000017500000000472313470304403014215 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_CATEGORY_FORM_H #define UGTK_CATEGORY_FORM_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkCategoryForm UgtkCategoryForm; struct UgtkCategoryForm { GtkWidget* self; GtkWidget* name_label; GtkWidget* name_entry; GtkWidget* spin_active; GtkWidget* spin_finished; GtkWidget* spin_recycled; GtkWidget* hosts_label; GtkWidget* hosts_entry; GtkWidget* schemes_label; GtkWidget* schemes_entry; GtkWidget* types_label; GtkWidget* types_entry; }; void ugtk_category_form_init (UgtkCategoryForm* cform); void ugtk_category_form_get (UgtkCategoryForm* cform, UgInfo* cnode_info); void ugtk_category_form_set (UgtkCategoryForm* cform, UgInfo* cnode_info); void ugtk_category_form_set_multiple (UgtkCategoryForm* cform, gboolean multiple_mode); #ifdef __cplusplus } #endif #endif // End of UGTK_CATEGORY_FROM_H uget-2.2.2/ui-gtk/UgtkNodeDialog.c0000664000175000017500000005032713470304403013615 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // UI static void ugtk_node_dialog_init_ui (UgtkNodeDialog* ndialog, gboolean has_category_form); static void ugtk_node_dialog_init_list_ui (UgtkNodeDialog* ndialog, UgetNode* root); // Callback static void on_cursor_changed (GtkTreeView* view, UgtkNodeDialog* ndialog); static void after_uri_entry_changed (GtkEditable *editable, UgtkNodeDialog* ndialog); static void on_response_new_category (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog); static void on_response_new_download (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog); static void on_response_edit_category (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog); static void on_response_edit_download (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog); // Callback for Main Window operate static void on_category_row_changed (GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, UgtkNodeDialog* ndialog); static void on_category_row_deleted (GtkTreeModel* model, GtkTreePath* path, UgtkNodeDialog* ndialog); static void on_category_row_inserted (GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, UgtkNodeDialog* ndialog); // ---------------------------------------------------------------------------- // UgtkNodeDialog void ugtk_node_dialog_init (UgtkNodeDialog* ndialog, const char* title, UgtkApp* app, gboolean has_category_form) { GtkWindow* window; int sensitive; int width, height, temp; ugtk_node_dialog_init_ui (ndialog, has_category_form); ndialog->app = app; // decide width if (app->setting.window.category) { gtk_widget_get_size_request (ndialog->notebook, &width, &height); temp = gtk_paned_get_position (ndialog->app->window.hpaned); temp = temp * 5 / 3; // (temp * 1.666) if (width < temp) gtk_widget_set_size_request (ndialog->notebook, temp, height); } window = (GtkWindow*) ndialog->self; gtk_window_set_transient_for (window, app->window.self); gtk_window_set_destroy_with_parent (window, TRUE); if (title) gtk_window_set_title (window, title); #if GTK_MAJOR_VERSION <= 3 && GTK_MINOR_VERSION < 14 gtk_window_set_has_resize_grip (window, FALSE); #endif // decide sensitive by plug-in matching order switch (app->setting.plugin_order) { default: case UGTK_PLUGIN_ORDER_ARIA2: case UGTK_PLUGIN_ORDER_ARIA2_CURL: sensitive = FALSE; break; case UGTK_PLUGIN_ORDER_CURL: case UGTK_PLUGIN_ORDER_CURL_ARIA2: sensitive = TRUE; break; } gtk_widget_set_sensitive ((GtkWidget*) ndialog->download.cookie_label, sensitive); gtk_widget_set_sensitive ((GtkWidget*) ndialog->download.cookie_entry, sensitive); gtk_widget_set_sensitive ((GtkWidget*) ndialog->download.post_label, sensitive); gtk_widget_set_sensitive ((GtkWidget*) ndialog->download.post_entry, sensitive); } UgtkNodeDialog* ugtk_node_dialog_new (const char* title, UgtkApp* app, gboolean has_category_form) { UgtkNodeDialog* ndialog; ndialog = g_malloc0 (sizeof (UgtkNodeDialog)); ugtk_node_dialog_init (ndialog, title, app, has_category_form); // OK & cancel buttons gtk_dialog_add_button (ndialog->self, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button (ndialog->self, GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response (ndialog->self, GTK_RESPONSE_OK); return ndialog; } void ugtk_node_dialog_free (UgtkNodeDialog* ndialog) { ugtk_node_dialog_set_category (ndialog, NULL); gtk_widget_destroy (GTK_WIDGET (ndialog->self)); g_free (ndialog); } void ugtk_node_dialog_run (UgtkNodeDialog* ndialog, UgtkNodeDialogMode mode, UgetNode* node) { if (node) { ndialog->node = node; ndialog->node_info = node->info; ug_info_ref(node->info); } switch (mode) { case UGTK_NODE_DIALOG_NEW_DOWNLOAD: ugtk_node_dialog_apply_recent (ndialog, ndialog->app); g_signal_connect (ndialog->self, "response", G_CALLBACK (on_response_new_download), ndialog); break; case UGTK_NODE_DIALOG_NEW_CATEGORY: gtk_window_resize ((GtkWindow*) ndialog->self, 300, 380); g_signal_connect (ndialog->self, "response", G_CALLBACK (on_response_new_category), ndialog); break; case UGTK_NODE_DIALOG_EDIT_DOWNLOAD: g_signal_connect (ndialog->self, "response", G_CALLBACK (on_response_edit_download), ndialog); break; case UGTK_NODE_DIALOG_EDIT_CATEGORY: gtk_window_resize ((GtkWindow*) ndialog->self, 300, 380); g_signal_connect (ndialog->self, "response", G_CALLBACK (on_response_edit_category), ndialog); break; } ugtk_node_dialog_monitor_uri (ndialog); // gtk_dialog_run (ndialog->self); gtk_widget_show ((GtkWidget*) ndialog->self); // g_signal_connect (ndialog->button_back, "clicked", // G_CALLBACK (on_button_back), ndialog); // g_signal_connect (ndialog->button_forward, "clicked", // G_CALLBACK (on_button_forward), ndialog); } void ugtk_node_dialog_monitor_uri (UgtkNodeDialog* ndialog) { GtkEditable* editable; if (gtk_widget_get_sensitive (ndialog->download.uri_entry)) { gtk_dialog_set_response_sensitive (ndialog->self, GTK_RESPONSE_OK, ndialog->download.completed); editable = GTK_EDITABLE (ndialog->download.uri_entry); g_signal_connect_after (editable, "changed", G_CALLBACK (after_uri_entry_changed), ndialog); } } gboolean ugtk_node_dialog_confirm_existing (UgtkNodeDialog* ndialog, const char* uri) { GtkWidget* dialog; gboolean existing; int response; char* title; existing = uget_uri_hash_find (ndialog->app->uri_hash, uri); if (existing) { dialog = gtk_message_dialog_new ((GtkWindow*) ndialog->self, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("URI had existed")); gtk_message_dialog_format_secondary_text ((GtkMessageDialog*) dialog, "%s", _("This URI had existed, are you sure to continue?")); // title title = g_strconcat ("uGet - ", _("URI had existed"), NULL); gtk_window_set_title ((GtkWindow*) dialog, title); g_free (title); // run and get response response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (response == GTK_RESPONSE_NO) return FALSE; } return TRUE; } void ugtk_node_dialog_store_recent (UgtkNodeDialog* ndialog, UgtkApp* app) { GtkTreePath* path; int nth; app->recent.saved = TRUE; gtk_tree_view_get_cursor (ndialog->node_view, &path, NULL); if (path != NULL) { nth = *gtk_tree_path_get_indices (path); app->recent.category_index = nth; gtk_tree_path_free (path); } ugtk_download_form_get(&ndialog->download, app->recent.info); } void ugtk_node_dialog_apply_recent (UgtkNodeDialog* ndialog, UgtkApp* app) { GtkTreePath* path; if (app->recent.saved && app->setting.ui.apply_recent) { path = gtk_tree_path_new_from_indices (app->recent.category_index, -1); gtk_tree_view_set_cursor (ndialog->node_view, path, NULL, FALSE); gtk_tree_path_free (path); ndialog->download.changed.uri = TRUE; ugtk_download_form_set(&ndialog->download, app->recent.info, TRUE); } } void ugtk_node_dialog_set_category (UgtkNodeDialog* ndialog, UgetNode* cnode) { GtkTreeModel* model; GtkTreePath* path; int nth; if (cnode == NULL) { if (ndialog->node_tree == NULL) return; model = GTK_TREE_MODEL (ndialog->app->traveler.category.model); for (nth = 0; nth < 3; nth++) g_signal_handler_disconnect (model, ndialog->handler_id[nth]); return; } nth = uget_node_child_position (cnode->parent, cnode); ugtk_node_dialog_init_list_ui (ndialog, cnode->parent); g_signal_connect (ndialog->node_view, "cursor-changed", G_CALLBACK (on_cursor_changed), ndialog); path = gtk_tree_path_new_from_indices (nth, -1); gtk_tree_view_set_cursor (ndialog->node_view, path, NULL, FALSE); gtk_tree_path_free (path); // signal model = GTK_TREE_MODEL (ndialog->app->traveler.category.model); ndialog->handler_id[0] = g_signal_connect (model, "row-changed", G_CALLBACK (on_category_row_changed), ndialog); ndialog->handler_id[1] = g_signal_connect (model, "row-deleted", G_CALLBACK (on_category_row_deleted), ndialog); ndialog->handler_id[2] = g_signal_connect (model, "row-inserted", G_CALLBACK (on_category_row_inserted), ndialog); } int ugtk_node_dialog_get_category (UgtkNodeDialog* ndialog, UgetNode** cnode) { GtkTreePath* path; int nth; if (ndialog->node_tree == NULL) { *cnode = NULL; return -1; } gtk_tree_view_get_cursor (ndialog->node_view, &path, NULL); nth = *gtk_tree_path_get_indices (path); gtk_tree_path_free (path); *cnode = uget_node_nth_child (ndialog->node_tree->root, nth); return nth; } void ugtk_node_dialog_set (UgtkNodeDialog* ndialog, UgInfo* node_info) { ugtk_proxy_form_set(&ndialog->proxy, node_info, FALSE); ugtk_download_form_set(&ndialog->download, node_info, FALSE); if (ndialog->category.self) ugtk_category_form_set(&ndialog->category, node_info); } void ugtk_node_dialog_get (UgtkNodeDialog* ndialog, UgInfo* node_info) { ugtk_proxy_form_get(&ndialog->proxy, node_info); ugtk_download_form_get(&ndialog->download, node_info); if (ndialog->category.self) ugtk_category_form_get(&ndialog->category, node_info); } // ---------------------------------------------------------------------------- // UI static void ugtk_node_dialog_init_ui (UgtkNodeDialog* ndialog, gboolean has_category_form) { GtkNotebook* notebook; GtkWidget* widget; GtkBox* box; ndialog->self = (GtkDialog*) gtk_dialog_new (); // content box = (GtkBox*) gtk_dialog_get_content_area (ndialog->self); widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start (box, widget, TRUE, TRUE, 0); ndialog->hbox = (GtkBox*) widget; widget = gtk_notebook_new (); gtk_box_pack_end (ndialog->hbox, widget, TRUE, TRUE, 1); ndialog->notebook = widget; notebook = (GtkNotebook*) widget; gtk_widget_show_all (GTK_WIDGET (box)); // Download form (Page 1, 2) ugtk_proxy_form_init (&ndialog->proxy); ugtk_download_form_init (&ndialog->download, &ndialog->proxy, (GtkWindow*) ndialog->self); if (has_category_form == FALSE) { // UGTK_NODE_DIALOG_DOWNLOAD gtk_notebook_append_page (notebook, ndialog->download.page1, gtk_label_new (_("General"))); gtk_notebook_append_page (notebook, ndialog->download.page2, gtk_label_new (_("Advanced"))); // set focus widget gtk_window_set_focus (GTK_WINDOW (ndialog->self), ndialog->download.uri_entry); } else { // UGTK_NODE_DIALOG_CATEGORY ugtk_category_form_init (&ndialog->category); gtk_notebook_append_page (notebook, ndialog->category.self, gtk_label_new (_("Category settings"))); gtk_notebook_append_page (notebook, ndialog->download.page1, gtk_label_new (_("Default for new download 1"))); gtk_notebook_append_page (notebook, ndialog->download.page2, gtk_label_new (_("Default 2"))); // hide field URI, mirrors, and rename ugtk_download_form_set_multiple (&ndialog->download, TRUE); // set focus widget gtk_window_set_focus (GTK_WINDOW (ndialog->self), ndialog->category.name_entry); } // gtk_widget_show (GTK_WIDGET (notebook)); } static void ugtk_node_dialog_init_list_ui (UgtkNodeDialog* ndialog, UgetNode* root) { GtkTreeModel* model; GtkWidget* scrolled; GtkBox* vbox; int width; // decide width if (ndialog->app->setting.window.category) width = gtk_paned_get_position (ndialog->app->window.hpaned); else width = 165; ndialog->node_tree = ugtk_node_tree_new (root, TRUE); ndialog->node_view = (GtkTreeView*) ugtk_node_view_new_for_category (); model = GTK_TREE_MODEL (ndialog->node_tree); gtk_tree_view_set_model (ndialog->node_view, model); ugtk_node_view_use_large_icon (ndialog->node_view, ndialog->app->setting.ui.large_icon, ndialog->app->setting.download_column.width.state); scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (scrolled, width, 200); gtk_widget_show (scrolled); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (ndialog->node_view)); // pack vbox vbox = (GtkBox*) gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_box_pack_start (vbox, gtk_label_new (_("Category")), FALSE, FALSE, 0); gtk_box_pack_start (vbox, (GtkWidget*) scrolled, TRUE, TRUE, 0); gtk_box_pack_start (ndialog->hbox, (GtkWidget*) vbox, FALSE, FALSE, 1); gtk_widget_show_all ((GtkWidget*) vbox); } // ---------------------------------------------------------------------------- // Callback static void on_cursor_changed (GtkTreeView* view, UgtkNodeDialog* ndialog) { GtkTreeModel* model; GtkTreePath* path; GtkTreeIter iter; UgetNode* node; // apply settings model = gtk_tree_view_get_model (view); gtk_tree_view_get_cursor (view, &path, NULL); if (path == NULL) return; gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); node = iter.user_data; ugtk_proxy_form_set(&ndialog->proxy, node->info, TRUE); ugtk_download_form_set(&ndialog->download, node->info, TRUE); } static void after_uri_entry_changed (GtkEditable *editable, UgtkNodeDialog* ndialog) { gtk_dialog_set_response_sensitive (ndialog->self, GTK_RESPONSE_OK, ndialog->download.completed); } static void on_response_new_category (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog) { UgetNode* cnode; if (response_id == GTK_RESPONSE_OK) { cnode = uget_node_new (NULL); ugtk_node_dialog_get(ndialog, cnode->info); uget_app_add_category ((UgetApp*) ndialog->app, cnode, TRUE); ugtk_app_decide_category_sensitive (ndialog->app); ugtk_download_form_get_folders (&ndialog->download, &ndialog->app->setting); } if (ndialog->node_info) ug_info_unref(ndialog->node_info); ugtk_node_dialog_free (ndialog); } static void on_response_new_download (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog) { UgetNode* cnode; UgetNode* dnode; const char* uri; if (response_id == GTK_RESPONSE_OK) { ugtk_node_dialog_store_recent (ndialog, ndialog->app); dnode = uget_node_new (NULL); ugtk_node_dialog_get(ndialog, dnode->info); ugtk_node_dialog_get_category (ndialog, &cnode); uri = gtk_entry_get_text ((GtkEntry*) ndialog->download.uri_entry); if (ugtk_node_dialog_confirm_existing (ndialog, uri)) { uget_app_add_download ((UgetApp*) ndialog->app, dnode, cnode, FALSE); ugtk_download_form_get_folders (&ndialog->download, &ndialog->app->setting); } } if (ndialog->node_info) ug_info_unref(ndialog->node_info); ugtk_node_dialog_free (ndialog); } static void on_response_edit_category (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog) { UgtkApp* app; if (response_id == GTK_RESPONSE_OK && ndialog->node_info) { app = ndialog->app; ugtk_node_dialog_get(ndialog, ndialog->node_info); // if ndialog->node_info->ref_count == 1, ndialog->node is freed by App if (ndialog->node_info->ref_count > 1) ugtk_app_category_changed(app, ndialog->node); ug_info_unref(ndialog->node_info); ugtk_download_form_get_folders (&ndialog->download, &app->setting); } ugtk_node_dialog_free (ndialog); } static void on_response_edit_download (GtkDialog *dialog, gint response_id, UgtkNodeDialog* ndialog) { UgtkApp* app; if (response_id == GTK_RESPONSE_OK && ndialog->node_info) { app = ndialog->app; uget_uri_hash_remove_download(app->uri_hash, ndialog->node_info); ugtk_node_dialog_get(ndialog, ndialog->node_info); uget_uri_hash_add_download(app->uri_hash, ndialog->node_info); // if ndialog->node_info->ref_count == 1, ndialog->node is freed by App if (ndialog->node_info->ref_count > 1) { ugtk_traveler_reserve_selection (&app->traveler); uget_app_reset_download_name((UgetApp*) app, ndialog->node); ugtk_traveler_restore_selection (&app->traveler); } ug_info_unref(ndialog->node_info); ugtk_download_form_get_folders (&ndialog->download, &app->setting); } ugtk_node_dialog_free (ndialog); } // ---------------------------------------------------------------------------- // Callback for Main Window operate static void on_category_row_changed (GtkTreeModel* model, GtkTreePath* path_mw, GtkTreeIter* iter_mw, UgtkNodeDialog* ndialog) { GtkTreePath* path; GtkTreeIter* iter; path = gtk_tree_path_copy (path_mw); iter = gtk_tree_iter_copy (iter_mw); iter->stamp = ndialog->node_tree->stamp; gtk_tree_path_prev (path); gtk_tree_model_row_changed (GTK_TREE_MODEL (ndialog->node_tree), path, iter); gtk_tree_path_free (path); gtk_tree_iter_free (iter); } static void on_category_row_deleted (GtkTreeModel* model, GtkTreePath* path_mw, UgtkNodeDialog* ndialog) { GtkTreePath* path; path = gtk_tree_path_copy (path_mw); gtk_tree_path_prev (path); gtk_tree_model_row_deleted (GTK_TREE_MODEL (ndialog->node_tree), path); gtk_tree_path_free (path); } static void on_category_row_inserted (GtkTreeModel* model, GtkTreePath* path_mw, GtkTreeIter* iter_mw, UgtkNodeDialog* ndialog) { GtkTreePath* path; GtkTreeIter* iter; path = gtk_tree_path_copy (path_mw); iter = gtk_tree_iter_copy (iter_mw); iter->stamp = ndialog->node_tree->stamp; gtk_tree_path_prev (path); gtk_tree_model_row_inserted (GTK_TREE_MODEL (ndialog->node_tree), path, iter); gtk_tree_path_free (path); gtk_tree_iter_free (iter); } uget-2.2.2/ui-gtk/UgtkSequence.c0000664000175000017500000003757113470304403013366 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // ---------------------------------------------------------------------------- // UgtkSeqRange static void on_type_changed (GtkComboBox* widget, UgtkSeqRange* range); static void on_show (GtkWidget *widget, UgtkSeqRange* range); void ugtk_seq_range_init (UgtkSeqRange* range, UgtkSequence* seq, GtkSizeGroup* size_group) { GtkBox* box; GtkAdjustment* adjustment; range->self = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); box = (GtkBox*) range->self; g_signal_connect (range->self, "show", G_CALLBACK (on_show), range); // Type range->type = gtk_combo_box_text_new (); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (range->type), UGTK_SEQ_TYPE_NONE, _("None")); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (range->type), UGTK_SEQ_TYPE_NUMBER, _("Num")); gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT (range->type), UGTK_SEQ_TYPE_CHARACTER, _("Char")); gtk_box_pack_start (box, range->type, FALSE, FALSE, 2); g_signal_connect (range->type, "changed", G_CALLBACK (on_type_changed), range); g_signal_connect_swapped (range->type, "changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // SpinButton - From adjustment = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 99999.0, 1.0, 5.0, 0.0); range->spin_from = gtk_spin_button_new (adjustment, 1.0, 0); gtk_size_group_add_widget (size_group, range->spin_from); gtk_box_pack_start (box, range->spin_from, FALSE, FALSE, 2); g_signal_connect_swapped (range->spin_from, "value-changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // Entry - From range->entry_from = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (range->entry_from), "a"); gtk_entry_set_max_length (GTK_ENTRY (range->entry_from), 1); // gtk_entry_set_width_chars (GTK_ENTRY (range->entry_from), 2); gtk_size_group_add_widget (size_group, range->entry_from); gtk_box_pack_start (box, range->entry_from, FALSE, FALSE, 2); g_signal_connect_swapped (GTK_EDITABLE (range->entry_from), "changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // Label - To range->label_to = gtk_label_new (_("To:")); // range->label_to = gtk_label_new_with_mnemonic (_("To:")); gtk_box_pack_start (box, range->label_to, FALSE, FALSE, 2); // gtk_label_set_mnemonic_widget (GTK_LABEL (widget), range->spin_to); // SpinButton - To adjustment = (GtkAdjustment *) gtk_adjustment_new (10.0, 1.0, 99999.0, 1.0, 5.0, 0.0); range->spin_to = gtk_spin_button_new (adjustment, 1.0, 0); gtk_box_pack_start (box, range->spin_to, FALSE, FALSE, 2); gtk_size_group_add_widget (size_group, range->spin_to); g_signal_connect_swapped (range->spin_to, "value-changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // label - digits range->label_digits = gtk_label_new (_("digits:")); // range->label_digits = gtk_label_new_with_mnemonic (_("digits:")); gtk_box_pack_start (box, range->label_digits, FALSE, FALSE, 2); // gtk_label_set_mnemonic_widget (GTK_LABEL (range->label_digits), range->spin_digits); // SpinButton - digits adjustment = (GtkAdjustment *) gtk_adjustment_new (2.0, 1.0, 20.0, 1.0, 5.0, 0.0); range->spin_digits = gtk_spin_button_new (adjustment, 1.0, 0); gtk_box_pack_start (box, range->spin_digits, FALSE, FALSE, 2); g_signal_connect_swapped (range->spin_digits, "value-changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // Entry - To range->entry_to = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (range->entry_to), "z"); gtk_entry_set_max_length (GTK_ENTRY (range->entry_to), 1); // gtk_entry_set_width_chars (GTK_ENTRY (range->entry_to), 2); gtk_size_group_add_widget (size_group, range->entry_to); gtk_box_pack_start (box, range->entry_to, FALSE, FALSE, 2); g_signal_connect_swapped (GTK_EDITABLE (range->entry_to), "changed", G_CALLBACK(ugtk_sequence_show_preview), seq); // label - case-sensitive range->label_case = gtk_label_new (_("case-sensitive")); gtk_box_pack_start (box, range->label_case, FALSE, FALSE, 2); // gtk_widget_show_all (range->self); } void ugtk_seq_range_set_type (UgtkSeqRange* range, enum UgtkSeqType type) { gtk_combo_box_set_active ((GtkComboBox*) range->type, type); } enum UgtkSeqType ugtk_seq_range_get_type (UgtkSeqRange* range) { return gtk_combo_box_get_active ((GtkComboBox*) range->type); } // signal handler static void on_show (GtkWidget *widget, UgtkSeqRange* range) { ugtk_seq_range_set_type (range, UGTK_SEQ_TYPE_NONE); } // signal handler static void on_type_changed (GtkComboBox* widget, UgtkSeqRange* range) { gint type; type = gtk_combo_box_get_active (widget); switch (type) { case UGTK_SEQ_TYPE_NONE: gtk_widget_set_sensitive (range->label_to, FALSE); gtk_widget_set_sensitive (range->spin_from, FALSE); gtk_widget_set_sensitive (range->spin_to, FALSE); gtk_widget_set_sensitive (range->spin_digits, FALSE); gtk_widget_set_sensitive (range->label_digits, FALSE); gtk_widget_set_sensitive (range->entry_from, FALSE); gtk_widget_set_sensitive (range->entry_to, FALSE); gtk_widget_set_sensitive (range->label_case, FALSE); if (gtk_widget_get_visible (range->spin_from) == TRUE) { gtk_widget_set_visible (range->entry_from, FALSE); gtk_widget_set_visible (range->entry_to, FALSE); gtk_widget_set_visible (range->label_case, FALSE); } break; case UGTK_SEQ_TYPE_NUMBER: gtk_widget_set_sensitive (range->spin_from, TRUE); gtk_widget_set_sensitive (range->label_to, TRUE); gtk_widget_set_sensitive (range->spin_to, TRUE); gtk_widget_set_sensitive (range->spin_digits, TRUE); gtk_widget_set_sensitive (range->label_digits, TRUE); gtk_widget_set_visible (range->spin_from, TRUE); gtk_widget_set_visible (range->spin_to, TRUE); gtk_widget_set_visible (range->spin_digits, TRUE); gtk_widget_set_visible (range->label_digits, TRUE); gtk_widget_set_visible (range->entry_from, FALSE); gtk_widget_set_visible (range->entry_to, FALSE); gtk_widget_set_visible (range->label_case, FALSE); break; case UGTK_SEQ_TYPE_CHARACTER: gtk_widget_set_sensitive (range->entry_from, TRUE); gtk_widget_set_sensitive (range->label_to, TRUE); gtk_widget_set_sensitive (range->entry_to, TRUE); gtk_widget_set_sensitive (range->label_case, TRUE); gtk_widget_set_visible (range->spin_from, FALSE); gtk_widget_set_visible (range->spin_to, FALSE); gtk_widget_set_visible (range->spin_digits, FALSE); gtk_widget_set_visible (range->label_digits, FALSE); gtk_widget_set_visible (range->entry_from, TRUE); gtk_widget_set_visible (range->entry_to, TRUE); gtk_widget_set_visible (range->label_case, TRUE); break; } } // --------------------------------------------------------------------------- // UgtkSequence // static functions static void ugtk_sequence_add_range (UgtkSequence* seq, UgtkSeqRange* range); static void ugtk_sequence_preview_init (struct UgtkSequencePreview* preview); static void ugtk_sequence_preview_show (struct UgtkSequencePreview* preview, const gchar* message); // signal handlers static void on_realize (GtkWidget *widget, UgtkSequence* seq); static void on_destroy (GtkWidget *widget, UgtkSequence* seq); void ugtk_sequence_init (UgtkSequence* seq) { GtkGrid* grid; GtkWidget* label; GtkWidget* entry; GtkWidget* widget; GtkSizeGroup* size_group; // UgetSequence: call uget_sequence_final() in on_destroy() uget_sequence_init (&seq->sequence); // top widget seq->self = gtk_grid_new (); grid = (GtkGrid*) seq->self; gtk_grid_set_row_homogeneous (grid, FALSE); g_signal_connect (seq->self, "realize", G_CALLBACK (on_realize), seq); g_signal_connect (seq->self, "destroy", G_CALLBACK (on_destroy), seq); // URI entry entry = gtk_entry_new (); label = gtk_label_new_with_mnemonic (_("_URI:")); seq->entry = GTK_ENTRY (entry); gtk_label_set_mnemonic_widget(GTK_LABEL (label), entry); gtk_entry_set_activates_default (seq->entry, TRUE); g_object_set (label, "margin", 3, NULL); g_object_set (entry, "margin", 3, "hexpand", TRUE, NULL); gtk_grid_attach (grid, label, 0, 0, 1, 1); gtk_grid_attach (grid, entry, 1, 0, 1, 1); g_signal_connect_swapped (GTK_EDITABLE (entry), "changed", G_CALLBACK (ugtk_sequence_show_preview), seq); // e.g. label = gtk_label_new (_("e.g.")); g_object_set (label, "margin", 3, NULL); gtk_grid_attach (grid, label, 0, 1, 1, 1); label = gtk_label_new ("http://for.example/path/pre*.jpg"); g_object_set (label, "margin", 3, NULL); gtk_grid_attach (grid, label, 1, 1, 1, 1); // separator widget = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_grid_attach (grid, widget, 0, 2, 2, 1); // ------------------------------------------------ // UgtkSeqRange size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); ugtk_seq_range_init (&seq->range[0], seq, size_group); ugtk_seq_range_init (&seq->range[1], seq, size_group); ugtk_seq_range_init (&seq->range[2], seq, size_group); g_object_set (seq->range[0].self, "margin", 3, NULL); g_object_set (seq->range[1].self, "margin", 3, NULL); g_object_set (seq->range[2].self, "margin", 3, NULL); gtk_grid_attach (grid, seq->range[0].self, 0, 3, 2, 1); gtk_grid_attach (grid, seq->range[1].self, 0, 4, 2, 1); gtk_grid_attach (grid, seq->range[2].self, 0, 5, 2, 1); g_object_unref (size_group); // ------------------------------------------------ // preview ugtk_sequence_preview_init (&seq->preview); g_object_set (seq->preview.self, "margin", 3, "expand", TRUE, NULL); gtk_grid_attach (grid, seq->preview.self, 0, 6, 2, 1); ugtk_sequence_show_preview (seq); gtk_widget_show_all (seq->self); } void ugtk_sequence_show_preview (UgtkSequence* seq) { GtkTreeIter iter; UgList result; UgLink* link; const char* string; uget_sequence_clear (&seq->sequence); ugtk_sequence_add_range (seq, &seq->range[0]); ugtk_sequence_add_range (seq, &seq->range[1]); ugtk_sequence_add_range (seq, &seq->range[2]); string = gtk_entry_get_text (seq->entry); if (ug_uri_init (NULL, string) == 0) { ugtk_sequence_preview_show (&seq->preview, _("URI is not valid.")); // notify if (seq->notify.func) seq->notify.func (seq->notify.data, FALSE); return; } if (strpbrk (string, "*") == NULL) { ugtk_sequence_preview_show (&seq->preview, _("No wildcard(*) character in URI entry.")); // notify if (seq->notify.func) seq->notify.func (seq->notify.data, FALSE); return; } if (uget_sequence_count (&seq->sequence, string) == 0) { ugtk_sequence_preview_show (&seq->preview, _("No character in 'From' or 'To' entry.")); // notify if (seq->notify.func) seq->notify.func (seq->notify.data, FALSE); return; } ug_list_init (&result); uget_sequence_get_preview (&seq->sequence, string, &result); gtk_list_store_clear (seq->preview.store); for (link = result.head; link; link = link->next) { gtk_list_store_append (seq->preview.store, &iter); gtk_list_store_set (seq->preview.store, &iter, 0, link->data, -1); } uget_sequence_clear_result(&result); // notify if (seq->notify.func) seq->notify.func (seq->notify.data, TRUE); return; } int ugtk_sequence_get_list (UgtkSequence* seq, UgList* result) { const char* string; string = gtk_entry_get_text (seq->entry); return uget_sequence_get_list (&seq->sequence, string, result); } // ---------------------------------------------------------------------------- // static functions // static void ugtk_sequence_add_range (UgtkSequence* seq, UgtkSeqRange* range) { uint32_t first, last; int type, digits; type = ugtk_seq_range_get_type (range); switch (type) { case UGTK_SEQ_TYPE_NUMBER: first = gtk_spin_button_get_value_as_int ((GtkSpinButton*) range->spin_from); last = gtk_spin_button_get_value_as_int ((GtkSpinButton*) range->spin_to); digits = gtk_spin_button_get_value_as_int ((GtkSpinButton*) range->spin_digits); break; case UGTK_SEQ_TYPE_CHARACTER: first = *gtk_entry_get_text (GTK_ENTRY (range->entry_from)); last = *gtk_entry_get_text (GTK_ENTRY (range->entry_to)); digits = 0; break; default: return; } uget_sequence_add (&seq->sequence, first, last, digits); } static void ugtk_sequence_preview_init (struct UgtkSequencePreview* preview) { GtkScrolledWindow* scrolled; GtkCellRenderer* renderer; GtkTreeViewColumn* column; GtkTreeSelection* selection; PangoContext* context; PangoLayout* layout; int height; preview->view = (GtkTreeView*) gtk_tree_view_new (); preview->store = gtk_list_store_new (1, G_TYPE_STRING); gtk_tree_view_set_model (preview->view, (GtkTreeModel*) preview->store); // gtk_tree_view_set_fixed_height_mode (preview->view, TRUE); gtk_widget_set_size_request ((GtkWidget*) preview->view, 140, 140); selection = gtk_tree_view_get_selection (preview->view); gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE); // It will free UgtkSequence.preview_store when UgtkSequence.preview_view destroy. g_object_unref (preview->store); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ( _("Preview"), renderer, "text", 0, NULL); // gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column (preview->view, column); // calc text height context = gtk_widget_get_pango_context ((GtkWidget*)preview->view); layout = pango_layout_new (context); pango_layout_set_text (layout, "Xy", -1); pango_layout_get_pixel_size (layout, NULL, &height); g_object_unref (layout); height *= 10; if (height < 140) height = 140; preview->self = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (preview->self, 140, height); scrolled = GTK_SCROLLED_WINDOW (preview->self); gtk_scrolled_window_set_shadow_type (scrolled, GTK_SHADOW_IN); gtk_scrolled_window_set_policy (scrolled, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (preview->view)); } static void ugtk_sequence_preview_show (struct UgtkSequencePreview* preview, const gchar* message) { GtkTreeIter iter; gtk_list_store_clear (preview->store); // skip first row gtk_list_store_append (preview->store, &iter); // show message in second row gtk_list_store_append (preview->store, &iter); gtk_list_store_set (preview->store, &iter, 0, message, -1); } // ---------------------------------------------------------------------------- // signal handler static void on_realize (GtkWidget *widget, UgtkSequence* seq) { ugtk_seq_range_set_type (&seq->range[0], UGTK_SEQ_TYPE_NUMBER); } static void on_destroy (GtkWidget *widget, UgtkSequence* seq) { uget_sequence_final (&seq->sequence); } uget-2.2.2/ui-gtk/UgtkApp-callback.c0000664000175000017500000004721113470304403014060 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // static functions static void ugtk_window_init_callback (struct UgtkWindow* window, UgtkApp* app); static void ugtk_toolbar_init_callback (struct UgtkToolbar* toolbar, UgtkApp* app); // functions for UgetNode.notification static void node_inserted (UgetNode* node, UgetNode* sibling, UgetNode* child); static void node_removed (UgetNode* node, UgetNode* sibling, UgetNode* child); static void node_updated (UgetNode* child); void ugtk_app_init_callback (UgtkApp* app) { // gtk_accel_group_connect (app->accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, // g_cclosure_new_swap (G_CALLBACK (ugtk_app_quit), app, NULL)); // gtk_accel_group_connect (app->accel_group, GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, // g_cclosure_new_swap (G_CALLBACK (ugtk_app_save), app, NULL)); // gtk_accel_group_connect (app->accel_group, GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, // g_cclosure_new_swap (G_CALLBACK (on_summary_copy_selected), app, NULL)); ugtk_window_init_callback (&app->window, app); ugtk_menubar_init_callback (&app->menubar, app); ugtk_toolbar_init_callback (&app->toolbar, app); ugtk_trayicon_init_callback (&app->trayicon, app); // node notification uget_app_set_notification ((UgetApp*) app, app, node_inserted, node_removed, (UgNotifyFunc) node_updated); } // ---------------------------------------------------------------------------- // Toolbar static void on_create_download (GtkWidget* widget, UgtkApp* app) { ugtk_app_create_download (app, NULL, NULL); } static void on_set_download_runnable (GtkWidget* widget, UgtkApp* app) { ugtk_app_queue_download (app, TRUE); } // ---------------------------------------------------------------------------- // UgtkWindow // UgtkTraveler.download.view selection "changed" static void on_download_selection_changed (GtkTreeSelection* selection, UgtkApp* app) { gint n_selected; n_selected = gtk_tree_selection_count_selected_rows (selection); ugtk_statusbar_set_info (&app->statusbar, n_selected); ugtk_app_decide_download_sensitive (app); } // UgtkTraveler.download.view "cursor-changed" static void on_download_cursor_changed (GtkTreeView* view, UgtkApp* app) { GtkWidget* item; UgetNode* node; UgetRelation* relation; UgetPriority priority; node = app->traveler.download.cursor.node; if (node) node = node->base; ugtk_summary_show (&app->summary, node); // UgtkMenubar.download.priority if (node == NULL) priority = UGET_PRIORITY_NORMAL; else { relation = ug_info_get (node->info, UgetRelationInfo); if (relation) priority = relation->priority; else priority = UGET_PRIORITY_NORMAL; } // set item switch (priority) { case UGET_PRIORITY_HIGH: item = app->menubar.download.prioriy.high; break; case UGET_PRIORITY_LOW: item = app->menubar.download.prioriy.low; break; case UGET_PRIORITY_NORMAL: default: item = app->menubar.download.prioriy.normal; break; } gtk_check_menu_item_set_active ((GtkCheckMenuItem*) item, TRUE); } // UgtkTraveler.category.view "cursor-changed" // UgtkTraveler.state.view "cursor-changed" static void on_category_cursor_changed (GtkTreeView* view, UgtkApp* app) { UgtkTraveler* traveler; traveler = &app->traveler; if (traveler->state.cursor.pos != traveler->state.cursor.pos_last || traveler->category.cursor.pos != traveler->category.cursor.pos_last) { // set sorting column ugtk_traveler_set_sorting (traveler, TRUE, app->setting.download_column.sort.nth, app->setting.download_column.sort.type); } // show/hide download column and setup items in UgtkViewMenu if (traveler->state.cursor.pos != traveler->state.cursor.pos_last) { struct UgtkDownloadColumnSetting* setting; GtkTreeView* view; GtkTreeViewColumn* column; gboolean sensitive; view = traveler->download.view; setting = &app->setting.download_column; // Finished if (traveler->state.cursor.pos == 3) sensitive = FALSE; else sensitive = TRUE; gtk_widget_set_sensitive (app->menubar.view.columns.complete, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.percent, sensitive); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_COMPLETE); gtk_tree_view_column_set_visible (column, sensitive && setting->complete); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_PERCENT); gtk_tree_view_column_set_visible (column, sensitive && setting->percent); // Recycled if (traveler->state.cursor.pos == 4) sensitive = FALSE; else sensitive = TRUE; gtk_widget_set_sensitive (app->menubar.view.columns.elapsed, sensitive); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_ELAPSED); gtk_tree_view_column_set_visible (column, sensitive && setting->elapsed); // Finished & Recycled if (traveler->state.cursor.pos == 3 || traveler->state.cursor.pos == 4) sensitive = FALSE; else sensitive = TRUE; gtk_widget_set_sensitive (app->menubar.view.columns.left, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.speed, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.upload_speed, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.uploaded, sensitive); gtk_widget_set_sensitive (app->menubar.view.columns.ratio, sensitive); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_LEFT); gtk_tree_view_column_set_visible (column, sensitive && setting->left); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_SPEED); gtk_tree_view_column_set_visible (column, sensitive && setting->speed); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_UPLOAD_SPEED); gtk_tree_view_column_set_visible (column, sensitive && setting->upload_speed); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_UPLOADED); gtk_tree_view_column_set_visible (column, sensitive && setting->uploaded); column = gtk_tree_view_get_column (view, UGTK_NODE_COLUMN_RATIO); gtk_tree_view_column_set_visible (column, sensitive && setting->ratio); } if (view == app->traveler.category.view) { ugtk_app_decide_category_sensitive (app); // sync UgtkMenubar.download.move_to ugtk_menubar_sync_category (&app->menubar, app, FALSE); } } // button-press-event static gboolean on_button_press_event (GtkTreeView* view, GdkEventButton* event, UgtkApp* app) { GtkTreeSelection* selection; GtkTreePath* path; GtkMenu* menu; gboolean is_selected; // right button press // if (event->type != GDK_BUTTON_PRESS) // return FALSE; if (event->button != 3) // right mouse button return FALSE; // popup a menu if (view == app->traveler.category.view) menu = (GtkMenu*) app->menubar.category.self; else if (view == app->traveler.download.view) menu = (GtkMenu*) app->menubar.download.self; else if (view == app->summary.view) menu = app->summary.menu.self; else return FALSE; gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time()); if (gtk_tree_view_get_path_at_pos (view, (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL)) { selection = gtk_tree_view_get_selection (view); is_selected = gtk_tree_selection_path_is_selected (selection, path); gtk_tree_path_free (path); if (is_selected) return TRUE; } return FALSE; } // UgtkSummary.menu.copy signal handler static void on_summary_copy_selected (GtkWidget* widget, UgtkApp* app) { gchar* text; text = ugtk_summary_get_text_selected (&app->summary); ugtk_clipboard_set_text (&app->clipboard, text); } // UgtkSummary.menu.copy_all signal handler static void on_summary_copy_all (GtkWidget* widget, UgtkApp* app) { gchar* text; text = ugtk_summary_get_text_all (&app->summary); ugtk_clipboard_set_text (&app->clipboard, text); } // This function is used by on_window_key_press_event() static void menu_position_func (GtkMenu* menu, gint* x, gint* y, gboolean* push_in, gpointer user_data) { GtkRequisition menu_requisition; GtkAllocation allocation; GtkWidget* widget; gint max_x, max_y; widget = user_data; gdk_window_get_origin (gtk_widget_get_window (widget), x, y); gtk_widget_get_preferred_size (GTK_WIDGET (menu), &menu_requisition, NULL); gtk_widget_get_allocation (widget, &allocation); if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) *x += allocation.width - allocation.width / 3; else *x += allocation.width / 3; *y += allocation.height / 3; // if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) // *x += allocation.width - menu_requisition.width; // else // *x += allocation.x; // *y += allocation.y + allocation.height; // Make sure we are on the screen. max_x = MAX (0, gdk_screen_width () - menu_requisition.width); max_y = MAX (0, gdk_screen_height () - menu_requisition.height); *x = CLAMP (*x, 0, max_x); *y = CLAMP (*y, 0, max_y); } // key-press-event static gboolean on_window_key_press_event (GtkWidget* widget, GdkEventKey* event, UgtkApp* app) { GtkTreeView* focus; GtkMenu* menu; // g_print ("key-press : 0x%x\n", event->keyval); if (event->keyval != GDK_KEY_Menu) return FALSE; focus = (GtkTreeView*) gtk_window_get_focus (app->window.self); if (focus == app->traveler.category.view) { widget = (GtkWidget*) app->traveler.category.view; menu = (GtkMenu*) app->menubar.category.self; } else if (focus == app->traveler.download.view) { widget = (GtkWidget*) app->traveler.download.view; menu = (GtkMenu*) app->menubar.download.self; } else if (focus == app->summary.view) { widget = (GtkWidget*) app->summary.view; menu = (GtkMenu*) app->summary.menu.self; } else return FALSE; gtk_menu_popup (menu, NULL, NULL, menu_position_func, widget, 0, gtk_get_current_event_time()); return TRUE; } // UgtkWindow.self "delete-event" static gboolean on_window_delete_event (GtkWidget* widget, GdkEvent* event, UgtkApp* app) { if (app->setting.ui.close_to_tray == FALSE) ugtk_app_decide_to_quit (app); else { ugtk_tray_icon_set_visible (&app->trayicon, TRUE); gtk_widget_hide ((GtkWidget*) app->window.self); } return TRUE; } // UgtkTraveler.download.view "key-press-event" static gboolean on_traveler_key_press_event (GtkWidget* widget, GdkEventKey* event, UgtkApp* app) { /* // check shift key status GdkWindow* gdk_win; GdkDevice* dev_pointer; GdkModifierType mask; // check shift key status gdk_win = gtk_widget_get_parent_window ((GtkWidget*) app->cwidget.current.widget->view); dev_pointer = gdk_device_manager_get_client_pointer ( gdk_display_get_device_manager (gdk_window_get_display (gdk_win))); gdk_window_get_device_position (gdk_win, dev_pointer, NULL, NULL, &mask); if (app->cwidget.current.category) { switch (event->keyval) { case GDK_KEY_Delete: case GDK_KEY_KP_Delete: if (mask & GDK_SHIFT_MASK) ugtk_app_delete_download (app, TRUE); else ugtk_app_delete_download (app, FALSE); return TRUE; case GDK_KEY_Return: case GDK_KEY_KP_Enter: if (mask & GDK_SHIFT_MASK) on_open_download_folder (widget, app); else on_open_download_file (widget, app); return TRUE; } } */ switch (event->keyval) { case GDK_KEY_Delete: ugtk_app_delete_download (app, FALSE); return TRUE; case GDK_KEY_space: ugtk_app_switch_download_state (app); return TRUE; default: break; } return FALSE; } static void ugtk_window_init_callback (struct UgtkWindow* window, UgtkApp* app) { GtkTreeSelection* selection; // UgtkTraveler selection = gtk_tree_view_get_selection (app->traveler.download.view); g_signal_connect (selection, "changed", G_CALLBACK (on_download_selection_changed), app); g_signal_connect (app->traveler.download.view, "cursor-changed", G_CALLBACK (on_download_cursor_changed), app); g_signal_connect_after (app->traveler.category.view, "cursor-changed", G_CALLBACK (on_category_cursor_changed), app); g_signal_connect_after (app->traveler.state.view, "cursor-changed", G_CALLBACK (on_category_cursor_changed), app); // pop-up menu by mouse button g_signal_connect (app->traveler.category.view, "button-press-event", G_CALLBACK (on_button_press_event), app); g_signal_connect (app->traveler.download.view, "button-press-event", G_CALLBACK (on_button_press_event), app); g_signal_connect (app->summary.view, "button-press-event", G_CALLBACK (on_button_press_event), app); // UgtkSummary.menu signal handlers g_signal_connect (app->summary.menu.copy, "activate", G_CALLBACK (on_summary_copy_selected), app); g_signal_connect (app->summary.menu.copy_all, "activate", G_CALLBACK (on_summary_copy_all), app); // UgtkWindow.self signal handlers g_signal_connect (window->self, "key-press-event", G_CALLBACK (on_window_key_press_event), app); g_signal_connect (window->self, "delete-event", G_CALLBACK (on_window_delete_event), app); g_signal_connect_swapped (window->self, "destroy", G_CALLBACK (ugtk_app_quit), app); // UgtkTraveler signal handlers g_signal_connect (app->traveler.download.view, "key-press-event", G_CALLBACK (on_traveler_key_press_event), app); } // ---------------------------------------------------------------------------- // UgtkToolbar static void ugtk_toolbar_init_callback (struct UgtkToolbar* toolbar, UgtkApp* app) { // create new g_signal_connect (toolbar->create, "clicked", G_CALLBACK (on_create_download), app); g_signal_connect (toolbar->create_download, "activate", G_CALLBACK (on_create_download), app); g_signal_connect_swapped (toolbar->create_category, "activate", G_CALLBACK (ugtk_app_create_category), app); g_signal_connect_swapped (toolbar->create_sequence, "activate", G_CALLBACK (ugtk_app_sequence_batch), app); g_signal_connect_swapped (toolbar->create_clipboard, "activate", G_CALLBACK (ugtk_app_clipboard_batch), app); g_signal_connect_swapped (toolbar->create_torrent, "activate", G_CALLBACK (ugtk_app_create_torrent), app); g_signal_connect_swapped (toolbar->create_metalink, "activate", G_CALLBACK (ugtk_app_create_metalink), app); // save g_signal_connect_swapped (toolbar->save, "clicked", G_CALLBACK (ugtk_app_save), app); // change status g_signal_connect (toolbar->runnable, "clicked", G_CALLBACK (on_set_download_runnable), app); g_signal_connect_swapped (toolbar->pause, "clicked", G_CALLBACK (ugtk_app_pause_download), app); // change data g_signal_connect_swapped (toolbar->properties, "clicked", G_CALLBACK (ugtk_app_edit_download), app); // move g_signal_connect_swapped (toolbar->move_up, "clicked", G_CALLBACK (ugtk_app_move_download_up), app); g_signal_connect_swapped (toolbar->move_down, "clicked", G_CALLBACK (ugtk_app_move_download_down), app); g_signal_connect_swapped (toolbar->move_top, "clicked", G_CALLBACK (ugtk_app_move_download_top), app); g_signal_connect_swapped (toolbar->move_bottom, "clicked", G_CALLBACK (ugtk_app_move_download_bottom), app); } // ---------------------------------------------------------------------------- // functions for UgetNode.notification static void node_inserted (UgetNode* node, UgetNode* sibling, UgetNode* child) { GtkTreePath* path; GtkTreeIter iter; UgtkApp* app; app = node->control->notifier->data; if (node == (UgetNode*) app->traveler.category.model->root) { // category inserted path = gtk_tree_path_new_from_indices ( uget_node_child_position (node, child) +1, -1); iter.stamp = app->traveler.category.model->stamp; iter.user_data = child; gtk_tree_model_row_inserted ( GTK_TREE_MODEL (app->traveler.category.model), path, &iter); gtk_tree_path_free (path); // sync UgtkMenubar.download.move_to ugtk_menubar_sync_category (&app->menubar, app, TRUE); } else if (node == (UgetNode*) app->traveler.download.model->root) { // download inserted path = gtk_tree_path_new_from_indices ( uget_node_child_position (node, child), -1); iter.stamp = app->traveler.download.model->stamp; iter.user_data = child; gtk_tree_model_row_inserted ( GTK_TREE_MODEL (app->traveler.download.model), path, &iter); gtk_tree_path_free (path); } } static void node_removed (UgetNode* node, UgetNode* sibling, UgetNode* child) { GtkTreePath* path; UgtkApp* app; int pos; app = node->control->notifier->data; if (node == (UgetNode*) app->traveler.category.model->root) { // category removed if (sibling) pos = uget_node_child_position (node, sibling); else pos = app->traveler.category.model->root->n_children; // pos + "All Category" path = gtk_tree_path_new_from_indices (pos + 1, -1); gtk_tree_model_row_deleted ( GTK_TREE_MODEL (app->traveler.category.model), path); gtk_tree_path_free (path); // sync UgtkMenubar.download.move_to ugtk_menubar_sync_category (&app->menubar, app, TRUE); } else if (node == (UgetNode*) app->traveler.download.model->root) { // download removed if (sibling) pos = uget_node_child_position (node, sibling); else pos = app->traveler.download.model->root->n_children; path = gtk_tree_path_new_from_indices (pos, -1); gtk_tree_model_row_deleted ( GTK_TREE_MODEL (app->traveler.download.model), path); gtk_tree_path_free (path); } } static void node_updated (UgetNode* child) { GtkTreePath* path; GtkTreeIter iter; UgetNode* node; UgtkApp* app; node = child->parent; app = node->control->notifier->data; if (node == (UgetNode*) app->traveler.category.model->root) { // category changed path = gtk_tree_path_new_from_indices ( uget_node_child_position (node, child) +1, -1); iter.stamp = app->traveler.category.model->stamp; iter.user_data = child; gtk_tree_model_row_changed ( GTK_TREE_MODEL (app->traveler.category.model), path, &iter); gtk_tree_path_free (path); // sync UgtkMenubar.download.move_to ugtk_menubar_sync_category (&app->menubar, app, TRUE); } else if (node == (UgetNode*) app->traveler.download.model->root) { // download changed path = gtk_tree_path_new_from_indices ( uget_node_child_position (node, child), -1); iter.stamp = app->traveler.download.model->stamp; iter.user_data = child; gtk_tree_model_row_changed ( GTK_TREE_MODEL (app->traveler.download.model), path, &iter); gtk_tree_path_free (path); } } uget-2.2.2/ui-gtk/UgtkConfig.h0000664000175000017500000000537713470304471013034 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_CONFIG_H #define UGTK_CONFIG_H #ifdef HAVE_CONFIG_H # include #elif defined _WIN32 || defined _WIN64 //# define HAVE_GLIB 1 #endif #ifdef __cplusplus extern "C" { #endif #ifndef GETTEXT_PACKAGE #define GETTEXT_PACKAGE "uget" #endif #ifndef PACKAGE_VERSION #define PACKAGE_VERSION "2.2.2" #endif // ---------------------------------------------------------------------------- // path const char* ugtk_get_data_dir (void); const char* ugtk_get_config_dir (void); const char* ugtk_get_locale_dir (void); #if defined _WIN32 || defined _WIN64 const char* ugtk_get_install_dir (void); gboolean ugtk_is_portable (void); // Please undef UG_DATADIR and LOCALEDIR if you doesn't want to use fixed path // to load data and you use autoconf and automake to build uGet in MSYS2. #undef UG_DATADIR #undef LOCALEDIR #ifndef UG_DATADIR #define UG_DATADIR ugtk_get_data_dir() #endif #ifndef LOCALEDIR #define LOCALEDIR ugtk_get_locale_dir() #endif #else #ifndef UG_DATADIR #define UG_DATADIR "/usr/share" #endif #ifndef LOCALEDIR #define LOCALEDIR UG_DATADIR "/locale" #endif #endif // _WIN32 || _WIN64 #ifdef __cplusplus } #endif #endif // UGTK_CONFIG_H uget-2.2.2/ui-gtk/UgtkBatchDialog.c0000664000175000017500000002502313470304403013744 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // Callback static void ugtk_batch_dialog_set_completed (UgtkBatchDialog* bdialog, gboolean completed); static void on_response (GtkDialog *dialog, gint response_id, UgtkBatchDialog* bdialog); // ---------------------------------------------------------------------------- // UgtkBatchDialog UgtkBatchDialog* ugtk_batch_dialog_new (const char* title, UgtkApp* app) { UgtkBatchDialog* bdialog; bdialog = g_malloc0 (sizeof (UgtkBatchDialog)); ugtk_node_dialog_init ((UgtkNodeDialog*) bdialog, title, app, FALSE); ugtk_download_form_set_multiple (&bdialog->download, TRUE); #if GTK_MAJOR_VERSION <= 3 && GTK_MINOR_VERSION < 14 gtk_window_set_has_resize_grip ((GtkWindow*)bdialog->self, FALSE); #endif gtk_window_resize ((GtkWindow*)bdialog->self, 500, 350); // back button gtk_dialog_add_button (bdialog->self, GTK_STOCK_GO_BACK, GTK_RESPONSE_REJECT); // forward button gtk_dialog_add_button (bdialog->self, GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT); // OK & cancel buttons gtk_dialog_add_button (bdialog->self, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button (bdialog->self, GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response (bdialog->self, GTK_RESPONSE_OK); // set button sensitive gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_OK, FALSE); gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_ACCEPT, FALSE); // response handler g_signal_connect (bdialog->self, "response", G_CALLBACK (on_response), bdialog); return bdialog; } void ugtk_batch_dialog_free (UgtkBatchDialog* bdialog) { // selector if (bdialog->selector.self) ugtk_selector_finalize (&bdialog->selector); // dialog ugtk_node_dialog_free ((UgtkNodeDialog*) bdialog); } void ugtk_batch_dialog_use_selector (UgtkBatchDialog* bdialog) { GtkRequisition requisition; gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_REJECT, FALSE); // add Page 1 ugtk_selector_init (&bdialog->selector, (GtkWindow*) bdialog->self); gtk_widget_get_preferred_size (bdialog->notebook, &requisition, NULL); gtk_widget_set_size_request (bdialog->selector.self, requisition.width, requisition.height); gtk_box_pack_end (bdialog->hbox, bdialog->selector.self, TRUE, TRUE, 0); // hide Page 2 gtk_widget_hide (bdialog->notebook); // set focus gtk_window_set_focus (GTK_WINDOW (bdialog->self), GTK_WIDGET (bdialog->selector.notebook)); // set notify function & data bdialog->selector.notify.func = (void*) ugtk_batch_dialog_set_completed; bdialog->selector.notify.data = bdialog; } void ugtk_batch_dialog_use_sequencer (UgtkBatchDialog* bdialog) { GtkRequisition requisition; gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_REJECT, FALSE); // add Page 1 ugtk_sequence_init (&bdialog->sequencer); gtk_widget_get_preferred_size (bdialog->notebook, &requisition, NULL); gtk_widget_set_size_request (bdialog->sequencer.self, requisition.width, requisition.height); gtk_box_pack_end (bdialog->hbox, bdialog->sequencer.self, TRUE, TRUE, 0); // hide Page 2 gtk_widget_hide (bdialog->notebook); // set focus gtk_window_set_focus (GTK_WINDOW (bdialog->self), GTK_WIDGET (bdialog->sequencer.entry)); // set notify function & data bdialog->sequencer.notify.func = (void*) ugtk_batch_dialog_set_completed; bdialog->sequencer.notify.data = bdialog; } void ugtk_batch_dialog_disable_batch (UgtkBatchDialog* bdialog) { GtkWidget* widget; ugtk_download_form_set_multiple (&bdialog->download, FALSE); ugtk_node_dialog_monitor_uri ((UgtkNodeDialog*) bdialog); // forward to next page. gtk_dialog_response (bdialog->self, GTK_RESPONSE_ACCEPT); // disable forward and back button gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_REJECT, FALSE); gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_ACCEPT, FALSE); // hide forward and back button widget = gtk_dialog_get_widget_for_response (bdialog->self, GTK_RESPONSE_REJECT); gtk_widget_set_visible (widget, FALSE); widget = gtk_dialog_get_widget_for_response (bdialog->self, GTK_RESPONSE_ACCEPT); gtk_widget_set_visible (widget, FALSE); } void ugtk_batch_dialog_run (UgtkBatchDialog* bdialog) { ugtk_node_dialog_apply_recent ((UgtkNodeDialog*) bdialog, bdialog->app); // emit notify and call ugtk_batch_dialog_set_completed() if (bdialog->selector.self) ugtk_selector_count_marked (&bdialog->selector); // gtk_dialog_run (ndialog->self); gtk_widget_show ((GtkWidget*) bdialog->self); } // ---------------------------------------------------------------------------- // Callback static void ugtk_batch_dialog_set_completed (UgtkBatchDialog* bdialog, gboolean completed) { gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_OK, completed); gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_ACCEPT, completed); } static void on_no_batch_response (UgtkBatchDialog* bdialog) { UgtkApp* app; UgetNode* dnode; UgetNode* cnode; const char* uri; app = bdialog->app; ugtk_batch_dialog_get_category (bdialog, &cnode); ugtk_download_form_get_folders (&bdialog->download, &app->setting); uri = gtk_entry_get_text ((GtkEntry*)bdialog->download.uri_entry); if (ugtk_node_dialog_confirm_existing((UgtkNodeDialog*) bdialog, uri)) { dnode = uget_node_new (NULL); ugtk_node_dialog_get ((UgtkNodeDialog*) bdialog, dnode->info); uget_app_add_download ((UgetApp*) app, dnode, cnode, FALSE); } } static void on_sequencer_response (UgtkBatchDialog* bdialog) { UgtkApp* app; UgetNode* dnode; UgetNode* cnode; UgetCommon* common; UgList result; UgLink* link; app = bdialog->app; ugtk_batch_dialog_get_category (bdialog, &cnode); ugtk_download_form_get_folders (&bdialog->download, &app->setting); // sequencer batch ug_list_init (&result); ugtk_sequence_get_list (&bdialog->sequencer, &result); for (link = result.head; link; link = link->next) { dnode = uget_node_new (NULL); common = ug_info_realloc (dnode->info, UgetCommonInfo); ugtk_node_dialog_get ((UgtkNodeDialog*) bdialog, dnode->info); common->uri = ug_strdup (link->data); uget_app_add_download ((UgetApp*) app, dnode, cnode, FALSE); } uget_sequence_clear_result(&result); } static void on_selector_response (UgtkBatchDialog* bdialog) { UgtkApp* app; UgetNode* dnode; UgetNode* cnode; UgetCommon* common; GList* uri_list; GList* link; app = bdialog->app; ugtk_batch_dialog_get_category (bdialog, &cnode); ugtk_download_form_get_folders (&bdialog->download, &app->setting); // selector batch uri_list = ugtk_selector_get_marked_uris (&bdialog->selector); for (link = uri_list; link; link = link->next) { dnode = uget_node_new (NULL); common = ug_info_realloc (dnode->info, UgetCommonInfo); ugtk_node_dialog_get ((UgtkNodeDialog*) bdialog, dnode->info); #if 0 common->uri = link->data; link->data = NULL; #else common->uri = ug_strdup (link->data); g_free (link->data); #endif uget_app_add_download ((UgetApp*) app, dnode, cnode, FALSE); } g_list_free (uri_list); } static void on_response (GtkDialog *dialog, gint response_id, UgtkBatchDialog* bdialog) { switch (response_id) { case GTK_RESPONSE_REJECT: // back button gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_REJECT, FALSE); gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_ACCEPT, TRUE); // switch page gtk_widget_hide (bdialog->notebook); if (bdialog->selector.self) gtk_widget_show (bdialog->selector.self); else if (bdialog->sequencer.self) gtk_widget_show (bdialog->sequencer.self); break; case GTK_RESPONSE_ACCEPT: // forward button gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_REJECT, TRUE); gtk_dialog_set_response_sensitive (bdialog->self, GTK_RESPONSE_ACCEPT, FALSE); // switch page gtk_widget_show (bdialog->notebook); if (bdialog->selector.self) gtk_widget_hide (bdialog->selector.self); else if (bdialog->sequencer.self) gtk_widget_hide (bdialog->sequencer.self); break; case GTK_RESPONSE_CANCEL: default: ugtk_batch_dialog_free (bdialog); break; case GTK_RESPONSE_OK: ugtk_node_dialog_store_recent ((UgtkNodeDialog*) bdialog, bdialog->app); if (gtk_widget_get_sensitive (bdialog->download.uri_entry)) on_no_batch_response (bdialog); if (bdialog->sequencer.self) on_sequencer_response (bdialog); else if (bdialog->selector.self) on_selector_response (bdialog); ugtk_batch_dialog_free (bdialog); break; } } uget-2.2.2/ui-gtk/UgtkScheduleForm.h0000664000175000017500000000450613470304403014173 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SCHEDULE_FORM_H #define UGTK_SCHEDULE_FORM_H #include #include #ifdef __cplusplus extern "C" { #endif struct UgtkScheduleForm { GtkWidget* self; GtkWidget* enable; GtkWidget* drawing; guint drawing_offset; GtkWidget* caption; GtkLabel* time_tips; GtkSpinButton* spin_speed; int state[7][24]; // 1 week, 7 days, 24 hours UgtkScheduleState last_state; }; void ugtk_schedule_form_init (struct UgtkScheduleForm* sform); void ugtk_schedule_form_get (struct UgtkScheduleForm* sform, UgtkSetting* setting); void ugtk_schedule_form_set (struct UgtkScheduleForm* sform, UgtkSetting* setting); #ifdef __cplusplus } #endif #endif // End of UG_SCHEDULE_FORM_H uget-2.2.2/ui-gtk/UgtkSummary.h0000664000175000017500000000525213470304403013247 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UGTK_SUMMARY_H #define UGTK_SUMMARY_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgtkSummary UgtkSummary; enum UGTK_SUMMARY_COLUMN { UGTK_SUMMARY_COLUMN_ICON, UGTK_SUMMARY_COLUMN_NAME, UGTK_SUMMARY_COLUMN_VALUE, UGTK_SUMMARY_N_COLUMN }; struct UgtkSummary { GtkWidget* self; // (GtkScrolledWindow) container for view GtkTreeView* view; GtkListStore* store; struct { GtkMenu* self; // (GtkMenu) pop-up menu GtkWidget* copy; // GtkMenuItem GtkWidget* copy_all; // GtkMenuItem } menu; struct { gboolean name:1; gboolean folder:1; gboolean category:1; gboolean uri:1; gboolean message:1; } visible; }; void ugtk_summary_init (UgtkSummary* summary, GtkAccelGroup* accel_group); void ugtk_summary_show (UgtkSummary* summary, UgetNode* node); // call g_free() to free returned string. gchar* ugtk_summary_get_text_selected (UgtkSummary* summary); gchar* ugtk_summary_get_text_all (UgtkSummary* summary); #ifdef __cplusplus } #endif #endif // End of UGTK_SUMMARY_H uget-2.2.2/Windows/0000775000175000017500000000000013470305215011116 500000000000000uget-2.2.2/Windows/Makefile.in0000664000175000017500000003270213470305214013106 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = Windows ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ resources/uget.rc \ resources/uget-icon.ico \ msvc/msvc-config.txt \ msvc/stdint.h \ msvc/test-json.vcxproj \ msvc/test-jsonrpc.vcxproj \ msvc/test-plugin+app.vcxproj \ msvc/test-uget.vcxproj \ msvc/test-uglib.vcxproj \ msvc/uget.sln \ msvc/uget.vcxproj \ msvc/uglib.vcxproj \ msvc/ui-gtk.vcxproj \ CodeBlocks/mingw-config.txt \ CodeBlocks/test-json.cbp \ CodeBlocks/test-jsonrpc.cbp \ CodeBlocks/test-plugin+app.cbp \ CodeBlocks/test-uget.cbp \ CodeBlocks/test-uget-cxx.cbp \ CodeBlocks/test-uglib.cbp \ CodeBlocks/test-uglib-cxx.cbp \ CodeBlocks/uget.cbp \ CodeBlocks/uglib.cbp \ CodeBlocks/ui-gtk.cbp \ CodeBlocks/ui-gtk-1to2.cbp \ CodeBlocks/uget.workspace all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Windows/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Windows/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/Windows/CodeBlocks/0000775000175000017500000000000013470305215013126 500000000000000uget-2.2.2/Windows/CodeBlocks/ui-gtk-1to2.cbp0000664000175000017500000000663513470304401015525 00000000000000 uget-2.2.2/Windows/CodeBlocks/ui-gtk.cbp0000664000175000017500000001454413470304401014740 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-uglib-cxx.cbp0000664000175000017500000000307613470304401016415 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-uglib.cbp0000664000175000017500000000302613470304401015610 00000000000000 uget-2.2.2/Windows/CodeBlocks/uget.workspace0000664000175000017500000000117413470304401015731 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-json.cbp0000664000175000017500000000270213470304401015457 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-uget-cxx.cbp0000664000175000017500000000334213470304401016253 00000000000000 uget-2.2.2/Windows/CodeBlocks/uglib.cbp0000664000175000017500000001147513470304401014642 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-plugin+app.cbp0000664000175000017500000000327313470304401016564 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-jsonrpc.cbp0000664000175000017500000000330313470304401016162 00000000000000 uget-2.2.2/Windows/CodeBlocks/test-uget.cbp0000664000175000017500000000323013470304401015447 00000000000000 uget-2.2.2/Windows/CodeBlocks/uget.cbp0000664000175000017500000001117513470304401014501 00000000000000 uget-2.2.2/Windows/CodeBlocks/mingw-config.txt0000664000175000017500000000030213470304401016162 00000000000000--- include dir --- ../../uglib D:/msys64/mingw32/include/glib-2.0 D:/msys64/mingw32/lib/glib-2.0/include --- lib dir --- D:/msys64/mingw32/lib Debug Release --- lib --- uglib glib-2.0.dll uget-2.2.2/Windows/resources/0000775000175000017500000000000013470305215013130 500000000000000uget-2.2.2/Windows/resources/uget-icon.ico0000664000175000017500000010510513470304401015434 00000000000000 hV   F00 % ED(  ^4NW.S-S-S-S-S-S-S-S-S-S-S-S-W.^4N[2*F.N.N.N.N.N.N.N.N.N.N.N.N*F[2!]54R4R4R4R4R4R4R4R4R4R4R4R4R4R!]5&a::X:X:X:X/|F l+ q* r+ p* o* q*&s69V:X&a:*f>@^=Z-u@,t?o${% '%w2+v>x${%")2{B@^*f>/lCEc%j2k o!w$%+3:B]Ec%o2x$&,6BEc/lC4pHKh"f,l!-s<{%07CYKhKhFa n)%,9EKh4pH9uMQm#g.l!AWw&5{CJbQmQmJd6{I!y(:FQm9uM?zTWs%i.k E[p!'y,7{AWsWs5vEf t%;}FWs?zTDX]x/o<$i-J_g p&5x?]x]xMc=}N?PPf]xDXI]c~c~c~Ncbl#5u?c~c~;xJ`l#={Gc~I]Pciiibz` h"6s>ii>zMa&m*A|KiPcViooooVi-l52q;0o9&h0&g/)k35s?HUoVi\p}uuuuuuuuuuuu}\p_sҌʪʪʪʪʪʪʪʪʪʪʪʪ_sdwEaubvbvbvbvbvbvbvbvbvbvbvbvaudwE(0 +{{+4,yF:X>Z@\D_E`HbJeMfMfJeHbE`D_@\>Z:X,yF4 )xC/N0N1O3Q4R5R5R5R5R5R5R5R5R4R3Q1O0N/N)xC "1P4R8V=Z?\A]A];U5K7N7N7N7N7N2|F6MR!j)q"w${%}%"k(:U9X @^wJw}hmpr%\-^h$h)D|Osss[lObi!'k,B|N}lotuHVSd!f&C~Ouuu]oTc k&*k0E}Qnquvw9oDQ["X#NFDIS\$c(*b/E{QŸpsuvwwi~VeQ`Q`O^M]M\O^P_ScSc`uŸ |uuvvvvvvvvvvvvuu| x\ĤܙȨȩȩȩȩȩȩȩȩȩȩȩȩȩȩȨĤx\ ( @ ]_^<;< <;< ]_^AAA >|                        |>AAA 0:&L&N'P)Q+R-T.U0V1W2X3Y5Y6Z6Z5Y3Y2X1W0V.U-T+R)Q'P&N&L:0srrU&L&T$P%Q%Q%Q&R&R&R&R&R%Q%Q%Q%Q%Q%Q&R&R&R&R&R%Q%Q%Q$P&T&LUsrr:79\'Q&S&R'T(T(U)U*U*U*U*U*U*U*V*V*U*U*U*U*U*U)U(U(T'T&R&S'Q\:79@=?Z*R)V)V+V,W-X-X.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y-X-X,W+V)V)V*RZ@=??<>Y+U,Y,X-Z/[1\2\2\2\0X#<p.j(l(m(n(m(l(l(k(p-!y4$>.Y-Z,X,Y+UY?<>?<>X-W.[/[2\3]4_5_6_2Xa$hr"w${%{%v$q#t#w#w#v$u$p"k'/V/[.[-WX?<>?<>W/Y1_2]4_6a7b8c8cg(m w$|%&!(!~(s)-Lk!x${%|%& '!|($t32]1_/YW?<>?<>W2[3a5_,Mg*g)h)l)k!v${% '%,)/&q,5X;d(@k x$z%~&!('.(s,0Q3a2[W?<>?<>U3^6c1VYin!p"r"v$z% ~&'--3.y34P=h=h=h!p0n!y$|%#))/+z1/J6c3^U?<>><=T7`8e'@bq"r"p"r#y%}&$+,3064F@j@j@j@j<=><=T9c:h'@dq"j (<"v/u""~((.-~31z=AjBlBlBlBlBl7Yat"|%'-,x13O:h9cT><=><=Q=e<=><=Q?h>k)Bap"^Fp.Fj !x'#o(:XGqGqGqGqGqGqGqGqGq$t4n!%{++u06Q>k?hQ><=><=PCl@n+Dbo!\Js/Ghs"&y18S:TAbJsJsJsJsJs4P3M1Il!$y**s/7S@nClP><==<<ODlBo,Ean ZKu/Gdp!o"!m'&h+5KKuKuKuKuKuT[cn "w((q.7PBoDlO=<<=<<NHqEr-F`m!YNw1Han!q"#u))q.8MNwNwNwNwNwT!Y_c j%&e*6PErHqN=<<=<<MJrFs.G[gTPy2J^j m!!r')p.:OQzQzQzQzQz9T7P6Q7Q8R9UBhFsJrM=<<=<<LNuHv6T_) e+ _,R|3K[h k!!p')n.;PR|R|R|R|R|EiDgEgEfEfDfGpHvNuL=<<=<<JQyJxMyQ{R}S}T~4KXei n&'l,;OT~T~T~T~T~NOTX] Z$:UJxQyJ=<<=<<IT{LzP{S~UVWŀ9RVdhm$&i);PWŀWŀWŀWŀWŀV"^cg m%&g*=WLzT{I=<<<<<HW~N}RTŀVƀWƁXƃCdPbfk$#f(9PXƃXƃXƃXƃXƃV"]cg"m(&h,?ZN}W~H<<<<<<GYP~S~WǂXȂZȄ[ȄZƄ ^+Zdh" d%WRʁ\F<<<=<=E_ŜWȃXɅYɄ[Ɇ]ɇ]ʇ]ʇY:S.t?&g2'h3'g1#d/!c-!b-!b-!b-#d/'g3+k7/n:/j;EcŜ_E=<=766DaÇU΃WɄXʅZˆ[ˇ\ˇ\ˇ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ\ˇ\ˇ[ˇZˆXʅWɄU΃aÇD766onnBcÈU΃YʆYˆZˇ[ˈ[ˇ\ˇ\ˇ\ˈ\ˈ\ˈ\ˈ\ˈ\ˈ\ˈ\ˈ\ˈ\ˈ\ˇ\ˇ[ˇ[ˈZˇYˆYʆU΃cÈBonn&xʘaّXЇYщYщZщ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъ[ъZщYщYщXЇaّxʘ&755(A2huvx•x•x–x–y–y–y–y–y–y–y–y–y–y–y–y–y–y–x–x–x•x•vu(A2h755`]_QRR$$$$$$QRR`]_@(0` hhhdee                                    deehhhqqq(7====================================7(qqqCw                                      wC 8^.&L)Q*Q+R,S/U0V2W3X4Y5Y7[7[9\:^<`>`>`@a@a>`>`<`:^9\7[7[5Y4Y3X2W0V/U,S+R*Q)Q&L^.8 Y_0*Z%Q$P$P$P%R%R&R&R&R&S&S&S&S&S&S'S'S'S'S'S'S'S'S&S&S&S&S&S&S&R&R&R%R%Q%Q$P$P%Q*Z_0Yn%K%Q$O$O%O%P%P&P&P&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&P&P%P%P%P$O$O%Q%Kn_`` r&O&R&Q&Q&R'T'R'S(S(U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U(U(S'S'S&R&S&Q&Q&R&O r_``ijj p'Q'U'U'U(V)V*V+V+V+W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W+W+V+V*V)V(V'U'U'U'Q pijjhhh p(R)V*V*V+V,W,X-Y.X.Y.Z/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y/Y.Z.Y.X-Y,X,W+V*V*V)V(R phhhhhh o(S*W*W,W,Y-Y/Y/[0[1[1\1\2\2\2\0W'B%9%9%9%9%9%9%9%9%9%9%9%9%9$9$9'B-S/[/Z-Y,Y,W*W*W(S ohhhhhh n+U,Z,Z-Z/[0\2\2\3]3]3]4_3]2\'=t$t#w$x$z%{%{&v$q#u#y%y%x$x$x$y%{%{&x$v,+N0\/[-Z,Z,Z+U nhhhhhh m,U/\/[0\1\2\3^4_5_6`6`6`5^#4s#t#w$y%{%}& ~&z%dUe w#z%y%y%y%z%|%~& '|&i#+M1\0\/[/\,U mhhhhhh m-X0^0\2]2^4_5`7b7b8b8c8c'<r"s"u#x${%}%&}%k G@1Tm%w#y$x$y$z${%~%& '!y&^$/V2]0\0^-X mhhhhhh l.W2_1]3_4_6a5\1U1U1V2V2Ss$s"u#w$z%}& ' ' t%T4.O9d.Om!w$x$x$y${%}&&")$+!i'%t:3_1]2_.W lhhhhhh k/X2`3^5`6a(>p#o"o"p"p"q"r#t#w$z%}& '$+%{, `%>(t>;d;d;d(?o"v$w$x$z%}& '#*(/&r+ P&5`3^2`/X khhhhhh j0Z4b5`5b)An!n!o!o!p!q"r"t#w#y$|% &%+).&k+ J#$Z1=f=g=g=gZq"x${%!}'&,(z.'b+%G'4~KBkBkBkBkBkBkBkBkBk+Ais"v#z$"~((.)s.%O'5[9e8f8a hhhhhhh f;c:h;h4Wj k m!Z 2DmCm'8w$z%"})%y,%f)!I$,`:DmDmDmDmDmDmDmDmDmDmCl"p0j s#w${&&-(q.$N'8\;h:h;c fhhhhhh e=e;iaFqFqFqFqFqFqFqFqFqFqFqFqFq:\j!t#x$&},(o-%N':^=j=j?h  ehhhhhh  dAi>k?k8Zi j l!Z 2HqHr(9s#u$n#a!7PIqIqIqIqIqIqIqIqIqIqIqIqIqIqHr0Hq#v$$z+&m,$L&<`?k>kAi  dhhhhhh  dDl?nBm8Zij l Y 1JsJs(8q"s"r"!t(2E4G4H2xDCgJsJsJsJsJsJsJs?`+?,?,@-Ar#t##y)&l+#K&=`Bm?nDl  dhhhhhh  bFn@nCo:]h i k!X 1KtKu(8n"p"r#t$!v'&x,'l,"K%@`KuKuKuKuKuKuKu8Udegj n!r##w)&j+#J&>cCo@nFn  bhhhhhh  `IpBoEq;]hij X 0LwMw'8l n!p!r" t%$w*&k+"K%@bLwLwLwLwLwLwLw8U\]`cfi n%#b( F#?cEqBoIp  `hhhhhh  `KrCpEr;^gh i V /NwNw(~8i k!m!o"r%$u*&j+"J%CcOxOxOxOxOxOxOx8T@ACEGJOJ < ?dErCpKr  `hhhhhh  `MtEqGs=^`aaP - PyPy(~8hil n!p##t)&i*"J%DdPyPyPyPyPyPyPyAb&g8'g8'g8'i8'i8&k8*m<,n?-k?GpGsEqMt  `hhhhhh  ^PwEsIu<^EEE9 $ Q{Q{)}9fhj l o#"s(&h*"J%EeQ{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{Q{QzPyLwKwJvIuEsPw  ^hhhhhh  ^SxGuJwEm%d7&d8&d8&c8)g_acfh l%"a'E!HiWŁWŁWŁWŁWŁWŁWŁ?\[]_bfi "m'$b' D#GkN{KzZ~ [hhhhhh Y\L|P}R}R~SŀVƀWƁXƂXƃXƃ8P]`cegk$!`&CIjXƃXƃXƃXƃXƃXƃXƃ@][]`cfi#$n)&c*"F%IlP}L|\ YhhhhhhY^M}Q}R~TƀVƁWǁXǂYǃYǃYDŽOuT^bdfi#b%M JkYDŽYDŽYDŽYDŽYDŽYDŽYDŽA^\^`cfj%&n+&c+#E&ImQ}M}^YhhhhhhX`N}R~RVȀWȀXǂYɃZɄ[Ʉ\Ʌ\Ʌ2}FT`ceh" h% a%Ji[Ʌ[Ʌ[Ʌ[Ʌ[Ʌ[Ʌ[ɅC_\_adg""k''o,'b+#E%InR~N}`XhhhhhhWbPʀSTȁVɁXȃYɅYɄZɄ\Ʌ\Ʌ\Ɇ\Dž&e4MV[` b#c$c$` ^\ZYXVVXY\^b##e('h,(],#C%JpSPʀbWhhhhhhWdQʀTǁUɁVɂXɅYɅZɄ[Ʌ\Ɇ]Ɇ]Ɇ]Ɇ[Ń1uE;@EGIIFDBA@@??@ACGK N#$Q&$K&!:#KpTǁQʀdWhhhhhhVg‰R̂VɃVɂXɅXʅZʆZʅ[ʆ]ʇ]ʇ]ʈ]ʈ]ʈ]ʈV~@\2rG/jA0kB0kB/jA.i@,h>+f=+f=+f=+f=+f=+f=,h>.i@1lC2nD3oE5qH5pH5mHR{VɃR̂g‰VhhhgggThÌS̓WɄVʄXʅX˄YˆZˇ[ˆ\ˆ\ˇ\ˇ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ]ˈ\ˇ\ˇ\ˆ[ˆZˇYˆXʅXʅVʄWɄS̓hÌTgggnnnTjčT΃XʅX˄X˄X˄ZˆZˇ\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇\̇ZˇZˆX˄X˄X˄XʅT΃jčTnnn MmĐVφYˆY̆Y̆ŻŻ[̈\̉\̉\͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉]͉\͉\̉\̉[̈ŻŻY̆Y̆YˆVφmĐ M ;|ǙXφV˄X̆X̆X̆ẊẎẎẎŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻẎẎẎẊX̆X̆X̆V˄Xφ|Ǚ;EEEizڳcЎ`ҍ`ҍaҎaҎaҎaҎaҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎbҎaҎaҎaҎaҎaҎ`ҍ`ҍcЎڳizEEE i{ȥ˨ͪͪͪͪͪͪͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͫͪͪͪͪͪͪ˨ȥi{ ?>>?>>srrmmmnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnmmmmmsrr PNG  IHDR\rf IDATx}yuov4%QdQ %ٵl9%˒Mn/|qiڦI&i%M8/i5q:vk59b,Y%˒N||${?\ ` ?Ύ393rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G 2:5^ʑ|e.sgM\Zȱ`0fUQV @P|Aa1W)TdU%8j@9,8 o@!#PE@p$s!G=X @("~Hȑ#G<83Bu x/-U'vY]˄hdiFm-olZZ<>|s/"ZJ=;,2/;t_g~ozn[Gp|6df{PJ{KgN=zBph2S@ W_Us[2ƳLM\(5_;/Dur٤=X?ShUm\9qoN$dəAB۪cb74ͼ8~ x TބÐ숯%\kӏ?^[ZGqx)t$+26YS4ݳ vM] qGϾ?]پ `þ7{!dlE_"~_;`h84 .tjBT1侍9[  h孞KK#k$pu'&](pf KL=S#I''ͅd'!w2F25Wv%]|]o~j3p{.X5 ܸgm Q4q&gHs LC{q{ۙ_zIccAtct84Kc ;W^nFNkwV aNAlO­4; [Ʊs RBϞyX-0嗚k,GXYvNiwoEd'f$0Wu e3^{*>䄪T=.(Aм!y Ӟ߻uɸK2w*r~Eo>r ;>F\H~w?BBur cxUvH9* mM,ek/blI3S;Xe움X4aۼ2IǮ*ʴI/Yt`sfrGP#@TgѣЇ~dLLDUZLu_a L%BcxU~ ^ԑx;EŇ$Uj򖳙rt1v찡a㇓F'A5Pphs ,c/ \D @;>@h~2|)F: u򲛗FPKrL $5M*4Aτf00 k@pV*4w O"s-"[ύ]d+ mY0BI (r*1^3:i2Q:e\g~҈TU@*ޱ 緘pcyH־f=#@.<y|y8~_FbDNCsZ3}$Hg& ^[X[%%znD1 `!֗ȟyŢ~ʌ\< $体JjU b3IUE}=8gq c᱉_P{3,=d(^[1a2 E%>} u~W7K<OCpW7@l cL,\~U?\diG@[Ϻ)"= PEK1|Yk%D/Su(lqjfe ^ңh?Z"")rL1˦qg^];] J95Z?|1Uϟ#?"H6sK6lb@:&YL4HSKN(yT@霶c&&zY?!e~iLo Zhcr(`;BMo_ߊ|) ALx42<=N蔓7=LJ `E}_sgw}q?N6elgic~Z WB{Dvg64aPiW(}F! )8Dg?p' ~ q&Ac}ܮHidpBLI0[$H#=HФmU<Pg?6`?EVϑC-DoAh0yµ~&6 eABzc4(-| 4?RZL:s-ȼe'>Tg(+3 q 6LsC\-)hDq[+~9 y 6 87 ] .3-&UvD@two)96ޏxi~ݧKJGyM7"**U,0Vo|?9 wD4­72A E4`փ~ئ,E Y|RPF٣hw<hoqMl@Ճ6 toK; Pij0L: he Z@J,`\.xӃ~|L^;rge`TT]Xe4N=WCrܶ _$q8(@f4.(>(3H,MAF.qL0'?SU;YâIꙭ_f7 2Jgx%,i¢ە-p*0I/5G"B8(&`'Xy A%#i$I]IՉ-gء!!{\ެbLӿԧ} |fWTPdwE?^ WxDϖ%^*"᥵ M@Vxܜ3rroAhX3{8oNB[s(Aa~ï e=G CkPHLFQtgX!fqfe/#.1z5l^! a^0\oW!@(u`~sifDvX̟=uB?מ({wv3)D,q/VAy`͈iP$R{`>4b$8&ׄiݼ.Oء""/5F4tќg /{Q(ݳ/<| kc73!ql0'|vڈ؏gWG0&k]LWG?#wǭ@B@-AǕ0;煮H1b"2, $5e%=T/X6 s~a'=2=hO +ݟwWXS l.WXP /I@ طlal"wlįy(Rliaͺ.J\:w|T $%.ƘkF@Fut^RI58Vt ! l}(3D1+Ľ}/&1Rts;Y5AakvK,}96Q[(0A8?iLƙ>i]VVJb)O#l@l8`} cwlg=,3HgB X_e1`Pбߔ/o'zԫNSeRJqRѓC(=rR$fF~S@pO%rsmh?vRZFZLW]|>C[?. ԗN&Vg =h0(l rbhrҝyDх69~>=,== V?KkA6 Q@(njz4ј#.8aN `^\ݖri|p0^C\-qUgI#<"Z.fu_1LLGc\p"%^Cgi*sy}0N’LD"$=)(-Q{5 J)@ƭ׳D'"6io0TA_&R: w ȩFEM%I@Mt$m~c l.-}hXC+3fi*/7]?o|+(㳯r#& 8:"R5Giz<:+2`fړa Q"?G9өc@J(<05XWNl/u#+̾g4yos>e;q09x7 r9M}¯K@ 01X=Ϣzy D Γ&5u iR4x3BA)F@0#uTwBm}s0$ދآ6r[$)6,TxT(y'1c@Nڈ^a"6 SY9. OCGֲiPQA!a\ߏD!'I'7M*iMfE;JdOa$xV BI$!:GqYRdjg\?iːhLMᣰ([lWIPP^Q]҅ԁ#abN;zHuBهAL=K?B1M ڔ'H ܃ze)'+ aU1FfTy'R{*?&x- Fm!ʂÂܚR++ vb4 FإVy#L9Ra? jؿ7(pC㣖"lE]7ƕqT+ԧ,2pdPuzp\%2Ma`YeEOD)C X^-P`ToA}._: :je4ƙ@P~u. ¤WfHe{*w={OɊs`:JDn -jhn>rD5 @AY M*@ (.#,(JU, P00,:d? R0"@g2m7ߞ(#/Č8X ϱߕTsg@??kL"_]e6Tͦ3)"5R~4pi!*0Ũ3eB+{pKٳ-Dv+w_m%G# 110709F@ Qqx9@\A K!`7(t]S 6|` EE}"~xz@l FQ8]1%.!UosjPhE'UEFB6t%%F(&!(0eㇷVIvMѸ@qRBA28NC_-FlzY.YVH {E%] 0&griV8_V@ bZ/@cTu9p>=Nga@ʎ pGHŔ4ԟ\G07`sVB:C @YaWq.r/A_yJ٠Xӭ2ٞEfm%~:TZgxm@[`YllS]Hڟ-f,eNP *TIH ,Vwvk8>;5\t v +xe=.w%_} Dņrx߹3F 8j_Z6CA~01S‰?o{ v IDAT2c9b`zG@9vRG]Ɠ_;́+` @<%+:tS x3H`ևGgP_A>[sۂSf(?zbV4Lέ\] +0g4<#=yc?ۇ[-G! ?r 4r@ Pʛ *pV IO#By5)LF0 (s gpⰛ44t[>6 "g?  >h%I_$e>U@u:x4Dm[La[PfThWNx1fqCUu^\Ao/8 |.j{Dˢ}}9Y5xǞZ# :;+p0Ȟwx|xGK' rz0u$y {q԰30޿y[ru#6c0u|"w~.^@{KJ AJ}$ݰQ씂s?>>yooW:7zjt=1pZJEQuk`I}kL_Rv Ήkkh5Ld,N/(6]I)@1)]anRP b > PSLx+Q HLzA5h`#~+Qڒ#et↟h ?w:cgoENeq5mFL8ݳnJ&8*=dmd. H{RKfhp}gqF([fܭxs0%Gs=rZxihQTP!s@C~M'_™MbH~0UӸ0.=ߏ[QƵy ϤM&JSȎAHTo*,Y˼1u֛o0X]zQK+gN~ UQ%g,U@sEgi>23kͳuNl)7Uj+ڦ\/cug:Ϗ?}"r0akKэ{TDcQ4v`祓8V?{Z%d?!BNdd z N>2^љt~8I[abK} ѤhP(N[swe!‹fޕ5h~Ct-oßz큞v.^=<7@i !#*ٟD#y%FsN,(Eabu{0[.=ﭡ׈80T;l UQB:A{w &^QG9^H3.vzZtʰW(kx?ہo_ÁoA{Dik-g(LPԠ5Ň2_UR$_1cfJ:W0p 0 9hI?01J5/m/mԠX>¹#M| kg ]ǃNZ Ҋ"Vӡ5hU)Ш8Ә^*ޡ, l{E3xo@uwP?Tj@@ĝ0\stUv2@n@e.Zh,u(((6kC>>".?{y~O޹2Rįm_Vµ3Fkq`:KN0I!LpF=-NXXG2rOcۻ@c$CMDh9<#.Vyƃ;mSu4K<"?T_9J͒ZZci9=n}<@eG &q#iq7Nş% whlf6gRA{],\8_5-&`L+XeoùW;&.B>zD%xri;7L\^j܋vϛhN57DHsM&1ϝc}&IBdY&ig{M[b}EJ(Gp` wn}NL{"dU%{Ld${̳/x; `KokJu,'?wC{HhM`3yy W38S^>N>n{GDs"i O/+ .x4|$c 3L`\U5ts.ũ/{N"}C%tPQҭLqTTȫZf78h-vZ&2\N\8SsUkKkFPӸ<"X& .5 . F%f/ aOodRG1FxM̓M,~v\rˬ'(Ot4 I_3 eҲp nx0>LPV~w7-,߳2oBs;}D({PF`"'%Uk^57n^|t'نiP: u (kЫA:i! m{.zzsH0I_?m?je? iwRD@x"C)%DJa2!̾:vjAs@w@aCVNDwÄiIF)FU!$8 D'% ̒F^)Ԥ0;bfѶnv)hRЖ mX70A{=P!/1=5L6靥Kܼ?\/^jۏ|1 ň%@A|ɘӞ~Oe$Pq.)K@vWPu>uU)R Ҁtv8W WR$k0I2$8 0N~ 09$0|I0zKJ98<"@O"* XGKt8Ҫʨ搆욆pQɥzOD  aG GR#&*o E%~P`2 k0H|dM""BT#Pj@X>pj ($O`.|j g^ emþtR>zHdSǫ 8ٚd,&T0۾s3BY_j9l?Sa,'ijPw_%AgK~4?f'Tt6UL) fjU3 *!.OU6 (,#&R17!܇`( _L)Ep0q,kC9{< mMQ`BF@@h:Äˎ]>.n83AC-8tHm(t !>ęRեq!qBVK!mf^XӋ8J|*6bՀWrDC d%K8i-Ott*dXknl,3u'#=)MO_rytmTfb+OZ?} 8u@ 6"4/ OZL`he&wIK?j,1?Yћ b1wµKuC.ۯKXvh0!_?x)v^ 鬺iQ&I.}v,ba3r n~iE&`*fBF//9SL6 s=$is0W k'kK/M*V~(PJ-@S%p9^IDATl7l+WvsA;C4^:?l ޲9m,;,ඛWY8z dG8ˁ'W k`5X tiX}}[:[OWg$<:ދxyaQ/ SD%$n`^E٪rr&,"?eG5v`Ѯ pm|Cܗ=Sy+&fнˋ Go\x^xq/߮tIO#OS`yC,w 78!d*, `1.2:;`p^/ifމ *\Rh-\q^$Hټ7^p=i@Bz'?pPzKMjZfolr8﬜n7z1=}߃%82@ !U\f \]L9  J9rGax-p߂k1B5vaq)XL`.ȑE!@ K2pC`"w!ƚ}40בKw~5;mNC쌔# k&o H+t~GSYj::a;O](Zwʨb%_&c֓#GKr>nAf ߁0q5;",&,+Ò`s5 G (Y} ֌/ò8i.+^# !jp8@'%%2rf|tGwa g/iQP5jpgwXj@ B#y.,o"0mD} XLs@ @az~ta]N\"da ȑ|%dM3(]ˑ#G8e}?@a:\:ȑl@^#G9ri RIENDB`uget-2.2.2/Windows/resources/uget.rc0000664000175000017500000000115613470304401014341 00000000000000MAINICON ICON DISCARDABLE "uget-icon.ico" 1 VERSIONINFO FILEVERSION 2,2,1,0 PRODUCTVERSION 2,2,1,0 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "uget.ugetdm.com" VALUE "FileDescription", "uGet download manager" VALUE "FileVersion", "2.2.1" VALUE "InternalName", "uGet" VALUE "LegalCopyright", "Copyright (C) 2005-2019 by C.H. Huang" VALUE "OriginalFilename", "uget.exe" VALUE "ProductName", "uGet" VALUE "ProductVersion", "2.2.1" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END uget-2.2.2/Windows/Makefile.am0000664000175000017500000000145213470304773013104 00000000000000EXTRA_DIST = \ resources/uget.rc \ resources/uget-icon.ico \ msvc/msvc-config.txt \ msvc/stdint.h \ msvc/test-json.vcxproj \ msvc/test-jsonrpc.vcxproj \ msvc/test-plugin+app.vcxproj \ msvc/test-uget.vcxproj \ msvc/test-uglib.vcxproj \ msvc/uget.sln \ msvc/uget.vcxproj \ msvc/uglib.vcxproj \ msvc/ui-gtk.vcxproj \ CodeBlocks/mingw-config.txt \ CodeBlocks/test-json.cbp \ CodeBlocks/test-jsonrpc.cbp \ CodeBlocks/test-plugin+app.cbp \ CodeBlocks/test-uget.cbp \ CodeBlocks/test-uget-cxx.cbp \ CodeBlocks/test-uglib.cbp \ CodeBlocks/test-uglib-cxx.cbp \ CodeBlocks/uget.cbp \ CodeBlocks/uglib.cbp \ CodeBlocks/ui-gtk.cbp \ CodeBlocks/ui-gtk-1to2.cbp \ CodeBlocks/uget.workspace uget-2.2.2/Windows/msvc/0000775000175000017500000000000013470305215012066 500000000000000uget-2.2.2/Windows/msvc/uget.sln0000664000175000017500000001151313470304401013465 00000000000000 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual C++ Express 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uglib", "uglib.vcxproj", "{8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-json", "test-json.vcxproj", "{D0C49F36-9ECC-4B87-9360-A7EE570DA73C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uget", "uget.vcxproj", "{A98D36E8-7119-4AC4-8820-65B902C6B69E}" ProjectSection(ProjectDependencies) = postProject {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} = {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-plugin+app", "test-plugin+app.vcxproj", "{CAD0E048-8211-4F6B-9975-215A526AC645}" ProjectSection(ProjectDependencies) = postProject {A98D36E8-7119-4AC4-8820-65B902C6B69E} = {A98D36E8-7119-4AC4-8820-65B902C6B69E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui-gtk", "ui-gtk.vcxproj", "{9D164547-3F37-4C14-BCCE-91EB2F3DC317}" ProjectSection(ProjectDependencies) = postProject {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} = {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} {A98D36E8-7119-4AC4-8820-65B902C6B69E} = {A98D36E8-7119-4AC4-8820-65B902C6B69E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-jsonrpc", "test-jsonrpc.vcxproj", "{BE2BF360-69F6-406F-A89D-77B0F9A92C04}" ProjectSection(ProjectDependencies) = postProject {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} = {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} {A98D36E8-7119-4AC4-8820-65B902C6B69E} = {A98D36E8-7119-4AC4-8820-65B902C6B69E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-uglib", "test-uglib.vcxproj", "{A5591A27-B27A-4FF2-88E6-E6C534C96E02}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-uget", "test-uget.vcxproj", "{FFAC27EA-E43A-4A78-924D-41E868A4F27F}" ProjectSection(ProjectDependencies) = postProject {A98D36E8-7119-4AC4-8820-65B902C6B69E} = {A98D36E8-7119-4AC4-8820-65B902C6B69E} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA}.Debug|Win32.ActiveCfg = Debug|Win32 {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA}.Debug|Win32.Build.0 = Debug|Win32 {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA}.Release|Win32.ActiveCfg = Release|Win32 {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA}.Release|Win32.Build.0 = Release|Win32 {D0C49F36-9ECC-4B87-9360-A7EE570DA73C}.Debug|Win32.ActiveCfg = Debug|Win32 {D0C49F36-9ECC-4B87-9360-A7EE570DA73C}.Debug|Win32.Build.0 = Debug|Win32 {D0C49F36-9ECC-4B87-9360-A7EE570DA73C}.Release|Win32.ActiveCfg = Release|Win32 {D0C49F36-9ECC-4B87-9360-A7EE570DA73C}.Release|Win32.Build.0 = Release|Win32 {A98D36E8-7119-4AC4-8820-65B902C6B69E}.Debug|Win32.ActiveCfg = Debug|Win32 {A98D36E8-7119-4AC4-8820-65B902C6B69E}.Debug|Win32.Build.0 = Debug|Win32 {A98D36E8-7119-4AC4-8820-65B902C6B69E}.Release|Win32.ActiveCfg = Release|Win32 {A98D36E8-7119-4AC4-8820-65B902C6B69E}.Release|Win32.Build.0 = Release|Win32 {CAD0E048-8211-4F6B-9975-215A526AC645}.Debug|Win32.ActiveCfg = Debug|Win32 {CAD0E048-8211-4F6B-9975-215A526AC645}.Debug|Win32.Build.0 = Debug|Win32 {CAD0E048-8211-4F6B-9975-215A526AC645}.Release|Win32.ActiveCfg = Release|Win32 {CAD0E048-8211-4F6B-9975-215A526AC645}.Release|Win32.Build.0 = Release|Win32 {9D164547-3F37-4C14-BCCE-91EB2F3DC317}.Debug|Win32.ActiveCfg = Debug|Win32 {9D164547-3F37-4C14-BCCE-91EB2F3DC317}.Debug|Win32.Build.0 = Debug|Win32 {9D164547-3F37-4C14-BCCE-91EB2F3DC317}.Release|Win32.ActiveCfg = Release|Win32 {9D164547-3F37-4C14-BCCE-91EB2F3DC317}.Release|Win32.Build.0 = Release|Win32 {BE2BF360-69F6-406F-A89D-77B0F9A92C04}.Debug|Win32.ActiveCfg = Debug|Win32 {BE2BF360-69F6-406F-A89D-77B0F9A92C04}.Debug|Win32.Build.0 = Debug|Win32 {BE2BF360-69F6-406F-A89D-77B0F9A92C04}.Release|Win32.ActiveCfg = Release|Win32 {BE2BF360-69F6-406F-A89D-77B0F9A92C04}.Release|Win32.Build.0 = Release|Win32 {A5591A27-B27A-4FF2-88E6-E6C534C96E02}.Debug|Win32.ActiveCfg = Debug|Win32 {A5591A27-B27A-4FF2-88E6-E6C534C96E02}.Debug|Win32.Build.0 = Debug|Win32 {A5591A27-B27A-4FF2-88E6-E6C534C96E02}.Release|Win32.ActiveCfg = Release|Win32 {A5591A27-B27A-4FF2-88E6-E6C534C96E02}.Release|Win32.Build.0 = Release|Win32 {FFAC27EA-E43A-4A78-924D-41E868A4F27F}.Debug|Win32.ActiveCfg = Debug|Win32 {FFAC27EA-E43A-4A78-924D-41E868A4F27F}.Debug|Win32.Build.0 = Debug|Win32 {FFAC27EA-E43A-4A78-924D-41E868A4F27F}.Release|Win32.ActiveCfg = Release|Win32 {FFAC27EA-E43A-4A78-924D-41E868A4F27F}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal uget-2.2.2/Windows/msvc/ui-gtk.vcxproj0000664000175000017500000002334513470304401014626 00000000000000 Debug Win32 Release Win32 ui-gtk {9D164547-3F37-4C14-BCCE-91EB2F3DC317} ugetgtk Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ true $(SolutionDir)$(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ false Disabled ..\..\uglib;..\..\uget;..\..\ui-gtk;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\lib\gtk-3.0\include;D:\devpack\gtk3-msvc\include\gtk-3.0;D:\devpack\gtk3-msvc\include\gdk-pixbuf-2.0;D:\devpack\gtk3-msvc\include\pango-1.0;D:\devpack\gtk3-msvc\include\atk-1.0;D:\devpack\gtk3-msvc\include\cairo;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_CONSOLE;DATADIR_WIN_PROG;HAVE_PLUGIN_ARIA2;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue glib-2.0.lib;gthread-2.0.lib;gmodule-2.0.lib;gobject-2.0.lib;gio-2.0.lib;gtk-win32-3.0.lib;gdk-win32-3.0.lib;gdk_pixbuf-2.0.lib;pango-1.0.lib;pangocairo-1.0.lib;pangowin32-1.0.lib;atk-1.0.lib;intl.lib;cairo.lib;libcurl.lib;Ws2_32.lib;winmm.lib;uget.lib;uglib.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;D:\devpack\curl-msvc;Debug;%(AdditionalLibraryDirectories) true Console MachineX86 MaxSpeed true ..\..\uglib;..\..\uget;..\..\ui-gtk;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\lib\gtk-3.0\include;D:\devpack\gtk3-msvc\include\gtk-3.0;D:\devpack\gtk3-msvc\include\gdk-pixbuf-2.0;D:\devpack\gtk3-msvc\include\pango-1.0;D:\devpack\gtk3-msvc\include\atk-1.0;D:\devpack\gtk3-msvc\include\cairo;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_WINDOWS;DATADIR_WIN_PROG;HAVE_PLUGIN_ARIA2;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase glib-2.0.lib;gthread-2.0.lib;gmodule-2.0.lib;gobject-2.0.lib;gio-2.0.lib;gtk-win32-3.0.lib;gdk-win32-3.0.lib;gdk_pixbuf-2.0.lib;pango-1.0.lib;pangocairo-1.0.lib;pangowin32-1.0.lib;atk-1.0.lib;cairo.lib;intl.lib;libcurl.lib;Ws2_32.lib;winmm.lib;uget.lib;uglib.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;D:\devpack\curl-msvc\;Release;%(AdditionalLibraryDirectories) true Windows true true MachineX86 uget-2.2.2/Windows/msvc/test-plugin+app.vcxproj0000664000175000017500000001367213470304401016457 00000000000000 Debug Win32 Release Win32 {CAD0E048-8211-4F6B-9975-215A526AC645} testjson Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ true $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ false Disabled ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) D:\devpack\curl-msvc\lib\Debug;D:\devpack\gtk3-msvc\lib;Debug;%(AdditionalLibraryDirectories) true Console MachineX86 MaxSpeed true ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) D:\devpack\curl-msvc\lib\Release;D:\devpack\gtk3-msvc\lib;Release;%(AdditionalLibraryDirectories) true Console true true MachineX86 {8e8a46b4-6b62-4bd0-bcaf-ba9cf1090dea} false uget-2.2.2/Windows/msvc/stdint.h0000664000175000017500000001706013470304401013464 00000000000000// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2008 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_STDINT_H_ ] uget-2.2.2/Windows/msvc/test-uget.vcxproj0000664000175000017500000001366313470304401015351 00000000000000 Debug Win32 Release Win32 {FFAC27EA-E43A-4A78-924D-41E868A4F27F} testuget Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ true $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ false Disabled ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) D:\devpack\curl-msvc\lib\Debug;D:\devpack\gtk3-msvc\lib;Debug;%(AdditionalLibraryDirectories) true Console MachineX86 MaxSpeed true ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) D:\devpack\curl-msvc\lib\Release;D:\devpack\gtk3-msvc\lib;Release;%(AdditionalLibraryDirectories) true Console true true MachineX86 {8e8a46b4-6b62-4bd0-bcaf-ba9cf1090dea} false uget-2.2.2/Windows/msvc/uget.vcxproj0000664000175000017500000001534313470304401014371 00000000000000 Debug Win32 Release Win32 {A98D36E8-7119-4AC4-8820-65B902C6B69E} uget Win32Proj StaticLibrary Unicode true StaticLibrary Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ Disabled ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\include;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\include;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase uget-2.2.2/Windows/msvc/msvc-config.txt0000664000175000017500000000400613470304401014756 00000000000000--- include dir --- (C/C++ - General - Additional Include Directories) ..\..\uglib;..\..\uget;..\..\ui-gtk;D:\devpack\gtk3\lib\glib-2.0\include;D:\devpack\gtk3\include\glib-2.0; ..\..\uglib;..\..\uget;..\..\ui-gtk;D:\devpack\curl-msvc\include;D:\devpack\gtk3\include;D:\devpack\gtk3\lib\glib-2.0\include;D:\devpack\gtk3\include\glib-2.0;D:\devpack\gtk3\lib\gtk-3.0\include;D:\devpack\gtk3\include\gtk-3.0;D:\devpack\gtk3\include\gdk-pixbuf-2.0;D:\devpack\gtk3\include\pango-1.0;D:\devpack\gtk3\include\atk-1.0;D:\devpack\gtk3\include\cairo; --- lib dir --- (Linker - General - Additional Library Directories) D:\devpack\gtk3\lib;D:\devpack\curl-msvc; --- lib --- (Linker - Input - Additional Dependencies) glib-2.0.lib;gthread-2.0.lib;gmodule-2.0.lib;gobject-2.0.lib;gtk-win32-3.0.lib;gdk-win32-3.0.lib;gdk_pixbuf-2.0.lib;pango-1.0.lib;pangocairo-1.0.lib;pangowin32-1.0.lib;atk-1.0.lib;intl.lib;cairo.lib;libcurl.lib;Ws2_32.lib;winmm.lib;uget.lib;uglib.lib; --- project (solution) --- 1. Caeate Name : ProjectName Location : path\ProjectDir Don't "Create directory for solution" 2. Rename path\ProjectDir\ProjectName to path\ProjectDir\msvc 3. Commit follow file only *.sln *.vcxproj (old vc is *.vcproj) --- project type --- 1. Windows Console (Linker - System - SubSystem) - Select "Console" (C/C++ - Preprocessor - Preprocessor Definitions) - add "_CONSOLE", remove "_WINDOWS" 2. Windows GUI (Linker - System - SubSystem) - Select "Windows" (C/C++ - Preprocessor - Preprocessor Definitions) - add "_WINDOWS", remove "_CONSOLE" 3. Windows Dynamic Library (DLL) (General - Configuration Type) - Select "Dynamic Library (.dll)" (C/C++ - Preprocessor - Preprocessor Definitions) - add "_USRDLL" 4. Windows Static Library (LIB) (General - Configuration Type) - Select "Static Library (.lib)" (C/C++ - Preprocessor - Preprocessor Definitions) - add "_LIB" --- debug --- (Debug - Environment) - add "PATH=C:\Program Files\Common Files\GTK\2.0\bin" or add "PATH=D:\devpack\gtk2\bin" uget-2.2.2/Windows/msvc/uglib.vcxproj0000664000175000017500000001577713470304401014542 00000000000000 Debug Win32 Release Win32 {8E8A46B4-6B62-4BD0-BCAF-BA9CF1090DEA} uglib Win32Proj StaticLibrary Unicode true StaticLibrary Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ Disabled ..\..\uglib;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\lib\glib-2.0\include;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue ..\..\uglib;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\include\glib-2.0;D:\devpack\gtk3-msvc\lib\glib-2.0\include;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase uget-2.2.2/Windows/msvc/test-jsonrpc.vcxproj0000664000175000017500000001161113470304401016052 00000000000000 Debug Win32 Release Win32 {BE2BF360-69F6-406F-A89D-77B0F9A92C04} Win32Proj testjsonrpc Application true Unicode Application false Unicode true false ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) Level3 Disabled WIN32;HAVE_GLIB;inline=__inline;_DEBUG;%(PreprocessorDefinitions) uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;D:\devpack\curl-msvc\lib\Debug;Debug;%(AdditionalLibraryDirectories) true uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) Console ..\..\uglib;..\..\uget;D:\devpack\curl-msvc\include;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) Level3 WIN32;HAVE_GLIB;inline=__inline;NDEBUG;%(PreprocessorDefinitions) uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;D:\devpack\curl-msvc\lib\Release;Release;%(AdditionalLibraryDirectories) true uglib.lib;uget.lib;Ws2_32.lib;curllib.lib;glib-2.0.lib;intl.lib;%(AdditionalDependencies) Console uget-2.2.2/Windows/msvc/test-json.vcxproj0000664000175000017500000001332213470304401015346 00000000000000 Debug Win32 Release Win32 {D0C49F36-9ECC-4B87-9360-A7EE570DA73C} testjson Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ true $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ false Disabled ..\..\uglib;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;Debug;%(AdditionalLibraryDirectories) true Console MachineX86 MaxSpeed true ..\..\uglib;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;Release;%(AdditionalLibraryDirectories) true Console true true MachineX86 {8e8a46b4-6b62-4bd0-bcaf-ba9cf1090dea} false uget-2.2.2/Windows/msvc/test-uglib.vcxproj0000664000175000017500000001332413470304401015501 00000000000000 Debug Win32 Release Win32 {A5591A27-B27A-4FF2-88E6-E6C534C96E02} testuglib Win32Proj Application Unicode true Application Unicode <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ true $(SolutionDir)$(Configuration)\ $(Configuration)\$(ProjectName)\ false Disabled ..\..\uglib;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;_DEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;Debug;%(AdditionalLibraryDirectories) true Console MachineX86 MaxSpeed true ..\..\uglib;D:\devpack\gtk3-msvc\lib\glib-2.0\include;D:\devpack\gtk3-msvc\include\glib-2.0;%(AdditionalIncludeDirectories) WIN32;HAVE_GLIB;inline=__inline;NDEBUG;_CONSOLE;HAVE_GLIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase uglib.lib;glib-2.0.lib;%(AdditionalDependencies) D:\devpack\gtk3-msvc\lib;Release;%(AdditionalLibraryDirectories) true Console true true MachineX86 {8e8a46b4-6b62-4bd0-bcaf-ba9cf1090dea} false uget-2.2.2/AUTHORS0000664000175000017500000000057213470304401010454 00000000000000uGet - A download manager with GUI. ============================================= Active Developer: ------------------ C.H. Huang (plushuang.tw@gmail.com) - Maintainer Project Manager: ------------------ Michael Tunnell (visuex.com) Artists: -------- Michael Tunnell - Logo Designer saf1 (linuxac.org) - Former Logo Designer Skeleton_Eel (linuxac.org) - Former Logo improver uget-2.2.2/doc/0000775000175000017500000000000013470305213010227 500000000000000uget-2.2.2/doc/uget.txt0000664000175000017500000000447413470304401011663 00000000000000 UgNode | `-- UgetNode (Root, Category, Download, File) ------------------------------------------------------------------------------- UgetNode Tree chart: Root --+-- Category1 --+-- Download1 (URI) | | | | | | | `-- Download2 (URI) | (torrent path) | | `-- Category2 --+-- Download3 (URI) | (metalink path) | | `-- Download4 (URI) ------------------------------------------------------------------------------- UgetNode Tree chart for "All Category" Real node and Fake node: Real Fake L1 Fake L2 Category0 --+ Category1 --+--> all ------+--> all active Category2 --+ +--> all queuing +--> all finished `--> all recycled ------------------------------------------------------------------------------- UgetNode Tree chart for "All Status" Real node and Fake node: Real Fake Category --+--> active +--> queuing +--> finished +--> recycled | `--> sorted ------------------------------------------------------------------------------- 1 category has 1 json file. Below is sample file. Category-Home.json { "info": { "category": {}, "common": { "name": "Home" }, "proxy": {}, "http": {}, "ftp": {} }, "children": [ { "info": { "common": { "name": "download-file1", "file": "download-file1.torrent" }, "files": { "collection" : [ { "name": "download-file1.zip", "type": 0 } ] } "proxy": {}, "http": {}, "ftp": {} }, "children": [ ] }, { "info": { "common": { "name": "download-file3", "file": "download-file3.7z" }, "proxy": {}, "http": {}, "ftp": {} }, "children": [ ] } ] } uget-2.2.2/doc/Makefile.in0000664000175000017500000003136213470304626012230 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ uget.txt \ folders.txt \ JSON-RPC_interface.txt \ To_build_uGet_in_MinGW.txt all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/doc/folders.txt0000664000175000017500000000173713470304401012354 00000000000000Source code folders: uglib (LGPL) This is low-level library for uget. It based on Standard C library, POSIX/Windows threads, Socket API, and libcurl. This folder has Android.mk, user can use it to build static library in Android. Add definition HAVE_GLIB if your program works with glib. uget (LGPL) This is is application core logic. (see functions defined in UgetApp.h) It contains curl and aria2 plug-in, download control, command line, and Queuing. This folder has Android.mk, user can use it to build static library in Android. Add definition HAVE_GLIB if your program works with glib. Add definition NDEBUG to disable debug code & message in plug-in. Add definition NO_RETRY_IF_CONNECT_FAILED to disable retry if connection failed. Add definition NO_URI_HASH to disable URI Hash Table (UgetHash). ui-gtk (LGPL) This is GTK+ user interface for uget. Some platform (or library) dependent code place here. ui-gtk-1to2 (LGPL) It can convert uGet for GTK+ data file from 1.10.x to 2.x uget-2.2.2/doc/To_build_uGet_in_MinGW.txt0000664000175000017500000000071713470304401015167 00000000000000To build uGet in MinGW environment # ------------ Install packages -------------- # toolchain pacman -S mingw-w64-i686-binutils mingw-w64-i686-gcc mingw-w64-i686-gdb # make and Autotools pacman -S make pkgconfig autoconf automake libtool intltool # gtk familiy pacman -S mingw-w64-i686-gtk3 # curl pacman -S mingw-w64-i686-curl # ------------ Build uGet -------------- . autogen.sh ./configure --disable-notify --disable-gstreamer _WINDOWS=1 NDEBUG=1 make uget-2.2.2/doc/Makefile.am0000664000175000017500000000014613470304401012202 00000000000000EXTRA_DIST = \ uget.txt \ folders.txt \ JSON-RPC_interface.txt \ To_build_uGet_in_MinGW.txt uget-2.2.2/doc/JSON-RPC_interface.txt0000664000175000017500000000124513470304401014123 00000000000000uGet JSON-RPC interface uGet provides JSON-RPC over TCP (localhost:14777). --------------------------------------- Method: uget.sendCommand This method send command-line arguments to uGet. Request sample { "jsonrpc": "2.0", "method": "uget.sendCommand", "params": [ "--user=foo", "--password=bar", "http://foo.bar.idv/test.mp4" ], "id": 1 } Response sample { "jsonrpc": "2.0", "result": true, "id": 1 } --------------------------------------- Method: uget.present This method can present uGet main window in screen. Request sample { "jsonrpc": "2.0", "method": "uget.present", "id": 1 } Response sample { "jsonrpc": "2.0", "result": true, "id": 1 } uget-2.2.2/.snapcraft.yaml0000664000175000017500000000244613470304401012331 00000000000000name: uget version: git summary: easy-to-use download manager description: | Uget (formerly urlgfe) is a simple, lightweight and easy-to-use download manager. It provides the following features: * Resume downloads. * Queue downloads. * Classify downloads in categories. * Mozilla Firefox integration (through Flashgot plugin). * Clipboard monitoring. * Import downloads import from HTML files. * Batch download. grade: stable confinement: strict parts: uget: source: . plugin: autotools configflags: - --prefix=/usr after: - desktop-gtk3 prepare: | sed -i 's|Icon=uget-icon|Icon=/usr/share/icons/hicolor/64x64/apps/uget-icon\.png|' uget-gtk.desktop build-packages: - intltool - libappindicator3-dev - libcurl4-openssl-dev - libgstreamer1.0-dev - libnotify-dev - libssl-dev stage-packages: - aria2 - libappindicator3-1 - libcairo2 - libcurl3 - libgstreamer1.0-0 - libnotify4 - libpango-1.0-0 - libpangocairo-1.0-0 apps: uget: command: bin/desktop-launch ${SNAP}/usr/bin/uget-gtk desktop: usr/share/applications/uget-gtk.desktop plugs: - home - gsettings - network - network-bind - unity7 - x11 aliases: [uget-gtk] uget-2.2.2/ar-lib0000755000175000017500000001330313245070103010471 00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2018 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <= 3.4) ## ---------------- ## glib (add HAVE_GLIB definition to config.h) PKG_CHECK_EXISTS([glib-2.0], [have_glib="yes"], [have_glib="no"]) if test x$have_glib = xyes ; then PKG_CHECK_MODULES(GLIB, glib-2.0) AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) AC_DEFINE(HAVE_GLIB, 1, [Define to 1 if glib support is required.]) fi ## ---------------- ## pthread AC_CHECK_LIB(pthread, pthread_create,, [AC_MSG_ERROR([required library pthread missing])]) PTHREAD_CFLAGS="-pthread" PTHREAD_LIBS="-pthread" AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_LIBS) ## ---------------- ## LFS AC_PATH_PROG(GETCONF, getconf) if test "x$GETCONF" != "x" ; then LFS_CFLAGS=`$GETCONF LFS_CFLAGS` LFS_LDFLAGS=`$GETCONF LFS_LDFLAGS` fi AC_SUBST(LFS_CFLAGS) AC_SUBST(LFS_LDFLAGS) ## ---------------- ## cURL AC_PATH_PROG(CURL_CONFIG, curl-config) if test "x$CURL_CONFIG" = "x" ; then AC_MSG_ERROR(Unable to find curl-config, please install libcurl) fi CURL_CFLAGS=`$CURL_CONFIG --cflags` CURL_LIBS=`$CURL_CONFIG --libs` let CURL_VERNUM=0x0`$CURL_CONFIG --vernum` let CURL_VERMIN=0x071301 # 7.19.1 if test $CURL_VERNUM -lt $CURL_VERMIN; then AC_MSG_ERROR(Requires libcurl version >= 7.19.1) fi AC_SUBST(CURL_CFLAGS) AC_SUBST(CURL_LIBS) ## ---------------- ## GnuTLS AC_ARG_WITH( [gnutls], AC_HELP_STRING([--with-gnutls[=@<:@no/auto/yes@:>@]], [Enable GnuTLS support. (default is auto)]), [with_gnutls="$withval"], [with_gnutls="no"] ) if test "x$with_gnutls" != "xno"; then # AC_CHECK_HEADER(gcrypt.h, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_CFLAGS="" # AC_SUBST(LIBGCRYPT_CFLAGS) # fi # AC_CHECK_HEADER(gcrypt/gcrypt.h, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_CFLAGS="" # AC_SUBST(LIBGCRYPT_CFLAGS, [""]) # fi # AC_CHECK_LIB(gcrypt, gcry_control, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_LIBS="-lgcrypt" # AC_SUBST(LIBGCRYPT_LIBS, ["-lgcrypt"]) # fi AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config) if test "x$LIBGCRYPT_CONFIG" = "x" ; then if test "x$with_gnutls" = "xyes"; then AC_MSG_ERROR(Unable to find libgcrypt-config, please install libgcrypt) fi else LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` AC_SUBST(LIBGCRYPT_CFLAGS) AC_SUBST(LIBGCRYPT_LIBS) AC_DEFINE(USE_GNUTLS, 1, [Define to 1 if gnutls support is required.]) fi fi ## ---------------- ## OpenSSL AC_ARG_WITH( [openssl], AC_HELP_STRING([--with-openssl[=@<:@no/yes@:>@]], [Enable OpenSSL support.]), [with_openssl="$withval"], [with_openssl="yes"] ) if test "x$LIBGCRYPT_CONFIG" = "x" ; then if test "x$with_openssl" = "xyes"; then PKG_CHECK_MODULES(LIBCRYPTO, libcrypto) AC_SUBST(LIBCRYPTO_CFLAGS) AC_SUBST(LIBCRYPTO_LIBS) AC_DEFINE(USE_OPENSSL, 1, [Define to 1 if openssl support is required.]) fi fi ## ---------------- ## libnotify AC_ARG_ENABLE( [notify], AC_HELP_STRING([--disable-notify], [Disable libnotify support.]), [enable_notify="$enableval"], [enable_notify="yes"] ) if test "x$enable_notify" = "xyes"; then PKG_CHECK_MODULES(LIBNOTIFY, libnotify) AC_DEFINE(HAVE_LIBNOTIFY, 1, [Define to 1 if libnotify support is required.]) # for ArchLinux AC_SUBST(LIBNOTIFY_CFLAGS) AC_SUBST(LIBNOTIFY_LIBS) fi ## ---------------- ## appindicator AC_ARG_ENABLE( [appindicator], AS_HELP_STRING([--enable-appindicator[=@<:@no/auto/yes@:>@]],[Build support for application indicators.]), [enable_appindicator=$enableval], [enable_appindicator="auto"] ) if test x$enable_appindicator = xauto ; then PKG_CHECK_EXISTS([appindicator3-0.1], [enable_appindicator="yes"], [enable_appindicator="no"]) fi if test x$enable_appindicator = xyes ; then PKG_CHECK_MODULES(APP_INDICATOR, appindicator3-0.1) AC_SUBST(APP_INDICATOR_CFLAGS) AC_SUBST(APP_INDICATOR_LIBS) AC_DEFINE(HAVE_APP_INDICATOR, 1, [Have AppIndicator]) fi ## ---------------- ## gstreamer AC_ARG_ENABLE( [gstreamer], AC_HELP_STRING([--disable-gstreamer], [Disable GStreamer audio support.]), [enable_gstreamer="$enableval"], [enable_gstreamer="yes"] ) if test "x$enable_gstreamer" = "xyes"; then PKG_CHECK_EXISTS([gstreamer-1.0], [enable_gstreamer1="yes"], [enable_gstreamer1="no"]) fi if test "x$enable_gstreamer1" = "xyes"; then PKG_CHECK_MODULES(GSTREAMER, gstreamer-1.0) AC_DEFINE(HAVE_GSTREAMER, 1, [Define to 1 if gstreamer support is required.]) # for ArchLinux AC_SUBST(GSTREAMER_CFLAGS) AC_SUBST(GSTREAMER_LIBS) elif test "x$enable_gstreamer" = "xyes"; then PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10) AC_DEFINE(HAVE_GSTREAMER, 1, [Define to 1 if gstreamer support is required.]) # for ArchLinux AC_SUBST(GSTREAMER_CFLAGS) AC_SUBST(GSTREAMER_LIBS) fi ## ----------------- ## libpwmd AC_ARG_ENABLE( [pwmd], AC_HELP_STRING([--enable-pwmd], [Enable pwmd support.]), [enable_pwmd="$enableval"], [enable_pwmd="no"] ) if test "x$enable_pwmd" = "xyes"; then PKG_CHECK_MODULES(LIBPWMD, [libpwmd-8.0 >= 8.3.0]) AC_DEFINE(HAVE_LIBPWMD, 1, [Define to 1 if libpwmd support is required.]) fi AM_CONDITIONAL([WITH_LIBPWMD], [test "x$enable_pwmd" = "xyes"]) ## ----------------- ## RSS Notify AC_ARG_ENABLE( [rss-notify], AC_HELP_STRING([--disable-rss-notify], [Disable RSS Notify.]), [enable_rss_notify="$enableval"], [enable_rss_notify="yes"] ) if test "x$enable_rss_notify" = "xyes"; then AC_DEFINE(HAVE_RSS_NOTIFY, 1, [Define to 1 to enable RSS Notify.]) fi ## ----------------- ## UNIX Domain Socket AC_ARG_ENABLE( [unix-socket], AC_HELP_STRING([--enable-unix-socket], [Enable UNIX Domain Socket.]), [enable_unix_socket="$enableval"], [enable_unix_socket="no"] ) if test "x$enable_unix_socket" = "xyes"; then AC_DEFINE(USE_UNIX_DOMAIN_SOCKET, 1, [Define to 1 to use UNIX Domain Socket.]) fi ## ---------------------------------------------- ## output AC_CONFIG_FILES([ Makefile doc/Makefile tests/Makefile uget/Makefile uglib/Makefile ui-gtk/Makefile ui-gtk-1to2/Makefile pixmaps/Makefile sounds/Makefile po/Makefile.in Windows/Makefile ]) AC_OUTPUT uget-2.2.2/install-sh0000755000175000017500000003601013251316473011413 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: uget-2.2.2/sounds/0000775000175000017500000000000013470305211010773 500000000000000uget-2.2.2/sounds/Makefile.in0000664000175000017500000003564213470304626013003 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = sounds ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(soundsdir)" DATA = $(sounds_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ soundsdir = $(datadir)/sounds/uget sounds_DATA = notification.wav EXTRA_DIST = $(sounds_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sounds/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sounds/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-soundsDATA: $(sounds_DATA) @$(NORMAL_INSTALL) @list='$(sounds_DATA)'; test -n "$(soundsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(soundsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(soundsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(soundsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(soundsdir)" || exit $$?; \ done uninstall-soundsDATA: @$(NORMAL_UNINSTALL) @list='$(sounds_DATA)'; test -n "$(soundsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(soundsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(soundsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-soundsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-soundsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-soundsDATA install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-soundsDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/sounds/notification.wav0000664000175000017500000002540013470304402014122 00000000000000RIFF*WAVEfmt DXdata*EQJKF&0^$rA=W*{ u(0;7Vl=aZ>j|%@g!wou:_G.i;STe=_9J@358. 'cS?#u4DUK/I?u&Auv&3Yq@5tK>+02r2{/s*h9 ^2wZY)*^.GCWP3]b_`P]Q2yend8,)O?7+k(o<0dNX`Gy<;8F*KLT;(Dx(Z]~XW]*k}HfjI 107dqQOZ<ZB>p|fXGt2;L+p7yb.N|[!F uKh3 T dM>Uux_& H zyO?#jZS& .@hLK8n\jBG5 V1XF 3xb(Z|6%S6$[sr%Q]+ ` y[eN-W2v/L &?VHELL\0%qz\^ ,9)|$nSXC4ko !J"4E.kCF5UxUdpI B "Q( ] e@ +V9<2q}b@{ 7uEgI{ +Xp&x 0&aZ 2=[#N 9N\mi K,/a'Y z/dV/)oz5-#h+:) j Ob>eq[I} _ zY 2 qG8` J? 7gJ . zo  d Yr'uY -Zk h\  +iKYo7OEI# 'e9 EV{ +.n$ϓ> [S *WMYX^ C9.k B$|oLKۅ*6ZF [ !bVٹu_Iݵ ,F˔) ' Iĉ3/` ' d-9+2X_?VRZxd3C#8 ')l%K/&3?>'-#Ԥah2M'4AC=_#AAG])"w1<<=B_ mlKqۯD78q{B2/S0GC'`ߒ&M$8oY@V$a>Ph-ݳ$43:*c4! 6֜>!L7$K!$&.?PO@S@,-( : Yfb. K<4۷8P(7 ?B_(t5\) !>A?WK QUlI5փ(6<ZYϧ,☦o 2`*Җ76 C x!cy7ϝ+)`$ _ ;.t}h Ԍ[ɨ xHMI3!cܶFŝ P L5B#>/:!V*6 [/Y&޽q )i[<`ߊ gJIGO.%c,%_2!UD#4)c"8% Ej}\Jd+X9%J $s'! TY E )H) NԼ G #iPߠҙ*/3RŗCU HT?< EJ* 0aJT,Hӛ΄4h9jz[8hԴ޶naA07= On0GBG70&)&\=INE8:ImD04>:X ~[[ ;"lӥZ8+ȼōʸ /$3Gp#P#GἹdI| 0 = -%~X),) oYħx%*Е ܍ާǼ PB=? ':q= D- $=)4>599(/"CfF ',37Kl5!!&7XEB:P38b:&"?a ?EԼ?,U$@8  * Lh&*R*g?>DNOLK!TO=;#BXPA=9?;gAMjPKGB;];J5!U3Z.6 , v t:hK*zj,-z 2,& ~/QCH9L6,B::t..7|OYGG?PFKQU?\-87?#7s D'-6+ j&  Xί%`wp-7s0< * 6b)hn-2%Vl(UU|-y+kBH7# 184! Pg!  Te.p ۍe7 (Ґ`QfXv mj<O  _ m 1d+0J-\$#)r(QPQ+* +  nkwj#:ӱL%FNt&pk\* M "HK O|U pq2\iߕQݷ*ކ=ǚEΓէqvnҰߑ*AaUg$7\ }  7LL 4 ]o rF-mפO݀pطU)԰ '}!X1  \S z 9 ; b  {f{`E{g(8gٚB֣oޣݐOո)?OY?@ n p _##!0W1]ffS+7'UgD>XY tir 'Fbd_$!!!L M D @nz+/' 'ON/fߑ |.R.1 " 5 O a#!!%"s5; ' 9  "4=3c-y.vC[=T] 9KcyI'?e ='0  /H 4@\qib = 2 { `)7?axd, = 7kG m HW+  " h]H1eB]G@ L | 8z4tLpE#9OARSi^ & B $8(1 r|Du d[Jp_OQ~d$V[ ~r="zD N s qJQ>$4k|S6vE"p"6 r c "j \ |6sMj j]c^I1{L5O}k?YjnT ouf  i - W<;n`Zpd _D@W{IxeUoG2  5 b S j5o x C j !Ac\';Qa {C 6g y- S +V *  4  : _ , y&9/[W8X:*mUD/ )1< v Y m+],dQ Q_C!n=> (Jr$3UkrZ)  " 5v_zi4/i[vIE (iI\ sd 7   S 2 Q Co'LGD)@|$G+p)@\V0M-^5(-+:>+Z`|SY8bi{G+'UN<>G"M6-pmV d>!vQf; "Lh';.-Dbj~zB#z`$c Q  W/q' B84A#jofP=+R0 ?:<[ jWb3eK6.9PkD7u ^r\{5]4It'k*3%gt^P4hhb= >W~5B>g :d 8 ~\/PV(ZB2bSseK F]j}piXIc ] xUu}8}NOw% .'hKjmd]4`'D,b3;iFJ(o$=c8ZYL|W ;:0o;U`Le.iDB<V2Dk5 z3kV:JEj`A(-k5O  |7O#"X-L>xw9C .Ot5Zjro#tK@Jm@?]BKQMXC#5^nYM9Y,7mo8-rIs,~j@bZ2}6 { KUDqIiE\dLry.R&N&S78(}w <~B$'PFo)E}Bcpvqw| 9saX|>8h\w( X2Nie@.4R>]Ffhc[qs;  J-6$ 0yIVyub>JMSe"(Qz 9;Oxx,B2ec:3pE^}$eq I(21Gp\nZ[P6T[JA6!@1NcF[yunk=36%O9 7} hT ,`ksy<%?mb@ZR\>npS\fsw`C8 YW}@u}yuI@2rjb| 6+*PsH,#(<O-A^!yw`@MjE8SjU=k 0aRz#"'f[I63mF#D3+:Um;rsFbkk%8&Jzg3WYTs[rDAmXO-+D0Gvss`fZF4g~5-:/T && m[YZzv?6Ze^z|` ,;C{bBcocn:]eM% =jqkz.5 Sub^g%6Oa:=31iB) 2Rsh]c 8 8RQg{rnzx\QfhrH18%|'7r 4;JuywqX=M>-E^O*vuSJM:&Lq!#,?Obv{YVSN( xwqvrhnt\KIYPRhsaSg3b}s\|\cdsjR5=8"  oZ`]T}"1_#0~7 kP_vwgVVfiPQq|qmgz<fj~uget-2.2.2/sounds/Makefile.am0000664000175000017500000000014113470304402012744 00000000000000soundsdir = $(datadir)/sounds/uget sounds_DATA = notification.wav EXTRA_DIST = $(sounds_DATA) uget-2.2.2/configure0000775000175000017500000077575313470304627011351 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for uget 2.2.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='uget' PACKAGE_TARNAME='uget' PACKAGE_VERSION='2.2.2' PACKAGE_STRING='uget 2.2.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WITH_LIBPWMD_FALSE WITH_LIBPWMD_TRUE LIBPWMD_LIBS LIBPWMD_CFLAGS GSTREAMER_LIBS GSTREAMER_CFLAGS APP_INDICATOR_LIBS APP_INDICATOR_CFLAGS LIBNOTIFY_LIBS LIBNOTIFY_CFLAGS LIBCRYPTO_LIBS LIBCRYPTO_CFLAGS LIBGCRYPT_LIBS LIBGCRYPT_CFLAGS LIBGCRYPT_CONFIG CURL_LIBS CURL_CFLAGS CURL_CONFIG LFS_LDFLAGS LFS_CFLAGS GETCONF PTHREAD_LIBS PTHREAD_CFLAGS GLIB_LIBS GLIB_CFLAGS GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS MSGFMT_OPTS INTL_MACOSX_LIBS EGREP GREP CPP GETTEXT_PACKAGE ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS RANLIB ac_ct_AR AR am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_nls with_gnutls with_openssl enable_notify enable_appindicator enable_gstreamer enable_pwmd enable_rss_notify enable_unix_socket ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS GLIB_CFLAGS GLIB_LIBS LIBCRYPTO_CFLAGS LIBCRYPTO_LIBS LIBNOTIFY_CFLAGS LIBNOTIFY_LIBS APP_INDICATOR_CFLAGS APP_INDICATOR_LIBS GSTREAMER_CFLAGS GSTREAMER_LIBS LIBPWMD_CFLAGS LIBPWMD_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures uget 2.2.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/uget] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of uget 2.2.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-nls do not use Native Language Support --disable-notify Disable libnotify support. --enable-appindicator=[no/auto/yes] Build support for application indicators. --disable-gstreamer Disable GStreamer audio support. --enable-pwmd Enable pwmd support. --disable-rss-notify Disable RSS Notify. --enable-unix-socket Enable UNIX Domain Socket. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnutls=[no/auto/yes] Enable GnuTLS support. (default is auto) --with-openssl=[no/yes] Enable OpenSSL support. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config LIBCRYPTO_CFLAGS C compiler flags for LIBCRYPTO, overriding pkg-config LIBCRYPTO_LIBS linker flags for LIBCRYPTO, overriding pkg-config LIBNOTIFY_CFLAGS C compiler flags for LIBNOTIFY, overriding pkg-config LIBNOTIFY_LIBS linker flags for LIBNOTIFY, overriding pkg-config APP_INDICATOR_CFLAGS C compiler flags for APP_INDICATOR, overriding pkg-config APP_INDICATOR_LIBS linker flags for APP_INDICATOR, overriding pkg-config GSTREAMER_CFLAGS C compiler flags for GSTREAMER, overriding pkg-config GSTREAMER_LIBS linker flags for GSTREAMER, overriding pkg-config LIBPWMD_CFLAGS C compiler flags for LIBPWMD, overriding pkg-config LIBPWMD_LIBS linker flags for LIBPWMD, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF uget configure 2.2.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by uget $as_me 2.2.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ## Use automake (add automake to autogen.sh) am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='uget' VERSION='2.2.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ## --- Use config.h (autogen.sh add autoheader) ac_config_headers="$ac_config_headers config.h" ## --- Determine a C compiler to use. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ## --- Check C compiler -c -o options. ## --- Determine a C++ compiler to use. # AC_PROG_CXX ## --- Check for the ar command to use if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac ## Use library (static library) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ## --- Check function posix_fallocate() for ac_func in posix_fallocate do : ac_fn_c_check_func "$LINENO" "posix_fallocate" "ac_cv_func_posix_fallocate" if test "x$ac_cv_func_posix_fallocate" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POSIX_FALLOCATE 1 _ACEOF fi done ## --- Check function ftruncate() for ac_func in ftruncate do : ac_fn_c_check_func "$LINENO" "ftruncate" "ac_cv_func_ftruncate" if test "x$ac_cv_func_ftruncate" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FTRUNCATE 1 _ACEOF fi done ## ---------------------------------------------- ## L10N (add intltoolize to autogen.sh) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5 $as_echo_n "checking for intltool >= ... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile ## replace ALL_LINGUAS with po/LINGUAS # ALL_LINGUAS="" GETTEXT_PACKAGE="$PACKAGE" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" cat >>confdefs.h <<_ACEOF #define LOCALEDIR "$localedir" _ACEOF ## Use AM_GLIB_DEFINE_LOCALEDIR with AC_CONFIG_HEADERS ## ---------------------------------------------- ## GTK+ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.4" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-3.0 >= 3.4) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ## ---------------- ## glib (add HAVE_GLIB definition to config.h) if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then have_glib="yes" else have_glib="no" fi if test x$have_glib = xyes ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0) were not met: $GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_GLIB 1" >>confdefs.h fi ## ---------------- ## pthread { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" else as_fn_error $? "required library pthread missing" "$LINENO" 5 fi PTHREAD_CFLAGS="-pthread" PTHREAD_LIBS="-pthread" ## ---------------- ## LFS # Extract the first word of "getconf", so it can be a program name with args. set dummy getconf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GETCONF+:} false; then : $as_echo_n "(cached) " >&6 else case $GETCONF in [\\/]* | ?:[\\/]*) ac_cv_path_GETCONF="$GETCONF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GETCONF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GETCONF=$ac_cv_path_GETCONF if test -n "$GETCONF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5 $as_echo "$GETCONF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GETCONF" != "x" ; then LFS_CFLAGS=`$GETCONF LFS_CFLAGS` LFS_LDFLAGS=`$GETCONF LFS_LDFLAGS` fi ## ---------------- ## cURL # Extract the first word of "curl-config", so it can be a program name with args. set dummy curl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CURL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $CURL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_CURL_CONFIG="$CURL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CURL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CURL_CONFIG=$ac_cv_path_CURL_CONFIG if test -n "$CURL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURL_CONFIG" >&5 $as_echo "$CURL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$CURL_CONFIG" = "x" ; then as_fn_error please install libcurl "Unable to find curl-config" "$LINENO" 5 fi CURL_CFLAGS=`$CURL_CONFIG --cflags` CURL_LIBS=`$CURL_CONFIG --libs` let CURL_VERNUM=0x0`$CURL_CONFIG --vernum` let CURL_VERMIN=0x071301 # 7.19.1 if test $CURL_VERNUM -lt $CURL_VERMIN; then as_fn_error $? "Requires libcurl version >= 7.19.1" "$LINENO" 5 fi ## ---------------- ## GnuTLS # Check whether --with-gnutls was given. if test "${with_gnutls+set}" = set; then : withval=$with_gnutls; with_gnutls="$withval" else with_gnutls="no" fi if test "x$with_gnutls" != "xno"; then # AC_CHECK_HEADER(gcrypt.h, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_CFLAGS="" # AC_SUBST(LIBGCRYPT_CFLAGS) # fi # AC_CHECK_HEADER(gcrypt/gcrypt.h, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_CFLAGS="" # AC_SUBST(LIBGCRYPT_CFLAGS, [""]) # fi # AC_CHECK_LIB(gcrypt, gcry_control, [USE_GNUTLS_GCRYPT=1], [USE_GNUTLS_GCRYPT=0]) # if test "$USE_GNUTLS_GCRYPT" = "1"; then # LIBGCRYPT_LIBS="-lgcrypt" # AC_SUBST(LIBGCRYPT_LIBS, ["-lgcrypt"]) # fi # Extract the first word of "libgcrypt-config", so it can be a program name with args. set dummy libgcrypt-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $LIBGCRYPT_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG if test -n "$LIBGCRYPT_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5 $as_echo "$LIBGCRYPT_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$LIBGCRYPT_CONFIG" = "x" ; then if test "x$with_gnutls" = "xyes"; then as_fn_error please install libgcrypt "Unable to find libgcrypt-config" "$LINENO" 5 fi else LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` $as_echo "#define USE_GNUTLS 1" >>confdefs.h fi fi ## ---------------- ## OpenSSL # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; with_openssl="$withval" else with_openssl="yes" fi if test "x$LIBGCRYPT_CONFIG" = "x" ; then if test "x$with_openssl" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCRYPTO" >&5 $as_echo_n "checking for LIBCRYPTO... " >&6; } if test -n "$LIBCRYPTO_CFLAGS"; then pkg_cv_LIBCRYPTO_CFLAGS="$LIBCRYPTO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCRYPTO_CFLAGS=`$PKG_CONFIG --cflags "libcrypto" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBCRYPTO_LIBS"; then pkg_cv_LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCRYPTO_LIBS=`$PKG_CONFIG --libs "libcrypto" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcrypto" 2>&1` else LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcrypto" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBCRYPTO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libcrypto) were not met: $LIBCRYPTO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBCRYPTO_CFLAGS and LIBCRYPTO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBCRYPTO_CFLAGS and LIBCRYPTO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBCRYPTO_CFLAGS=$pkg_cv_LIBCRYPTO_CFLAGS LIBCRYPTO_LIBS=$pkg_cv_LIBCRYPTO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define USE_OPENSSL 1" >>confdefs.h fi fi ## ---------------- ## libnotify # Check whether --enable-notify was given. if test "${enable_notify+set}" = set; then : enableval=$enable_notify; enable_notify="$enableval" else enable_notify="yes" fi if test "x$enable_notify" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBNOTIFY" >&5 $as_echo_n "checking for LIBNOTIFY... " >&6; } if test -n "$LIBNOTIFY_CFLAGS"; then pkg_cv_LIBNOTIFY_CFLAGS="$LIBNOTIFY_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnotify\""; } >&5 ($PKG_CONFIG --exists --print-errors "libnotify") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBNOTIFY_CFLAGS=`$PKG_CONFIG --cflags "libnotify" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBNOTIFY_LIBS"; then pkg_cv_LIBNOTIFY_LIBS="$LIBNOTIFY_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnotify\""; } >&5 ($PKG_CONFIG --exists --print-errors "libnotify") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBNOTIFY_LIBS=`$PKG_CONFIG --libs "libnotify" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnotify" 2>&1` else LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnotify" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBNOTIFY_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libnotify) were not met: $LIBNOTIFY_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBNOTIFY_CFLAGS and LIBNOTIFY_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBNOTIFY_CFLAGS and LIBNOTIFY_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBNOTIFY_CFLAGS=$pkg_cv_LIBNOTIFY_CFLAGS LIBNOTIFY_LIBS=$pkg_cv_LIBNOTIFY_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_LIBNOTIFY 1" >>confdefs.h # for ArchLinux fi ## ---------------- ## appindicator # Check whether --enable-appindicator was given. if test "${enable_appindicator+set}" = set; then : enableval=$enable_appindicator; enable_appindicator=$enableval else enable_appindicator="auto" fi if test x$enable_appindicator = xauto ; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"appindicator3-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "appindicator3-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then enable_appindicator="yes" else enable_appindicator="no" fi fi if test x$enable_appindicator = xyes ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for APP_INDICATOR" >&5 $as_echo_n "checking for APP_INDICATOR... " >&6; } if test -n "$APP_INDICATOR_CFLAGS"; then pkg_cv_APP_INDICATOR_CFLAGS="$APP_INDICATOR_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"appindicator3-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "appindicator3-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_APP_INDICATOR_CFLAGS=`$PKG_CONFIG --cflags "appindicator3-0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$APP_INDICATOR_LIBS"; then pkg_cv_APP_INDICATOR_LIBS="$APP_INDICATOR_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"appindicator3-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "appindicator3-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_APP_INDICATOR_LIBS=`$PKG_CONFIG --libs "appindicator3-0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then APP_INDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "appindicator3-0.1" 2>&1` else APP_INDICATOR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "appindicator3-0.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$APP_INDICATOR_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (appindicator3-0.1) were not met: $APP_INDICATOR_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables APP_INDICATOR_CFLAGS and APP_INDICATOR_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables APP_INDICATOR_CFLAGS and APP_INDICATOR_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else APP_INDICATOR_CFLAGS=$pkg_cv_APP_INDICATOR_CFLAGS APP_INDICATOR_LIBS=$pkg_cv_APP_INDICATOR_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_APP_INDICATOR 1" >>confdefs.h fi ## ---------------- ## gstreamer # Check whether --enable-gstreamer was given. if test "${enable_gstreamer+set}" = set; then : enableval=$enable_gstreamer; enable_gstreamer="$enableval" else enable_gstreamer="yes" fi if test "x$enable_gstreamer" = "xyes"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gstreamer-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then enable_gstreamer1="yes" else enable_gstreamer1="no" fi fi if test "x$enable_gstreamer1" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSTREAMER" >&5 $as_echo_n "checking for GSTREAMER... " >&6; } if test -n "$GSTREAMER_CFLAGS"; then pkg_cv_GSTREAMER_CFLAGS="$GSTREAMER_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gstreamer-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTREAMER_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GSTREAMER_LIBS"; then pkg_cv_GSTREAMER_LIBS="$GSTREAMER_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gstreamer-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTREAMER_LIBS=`$PKG_CONFIG --libs "gstreamer-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GSTREAMER_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gstreamer-1.0" 2>&1` else GSTREAMER_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gstreamer-1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GSTREAMER_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gstreamer-1.0) were not met: $GSTREAMER_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GSTREAMER_CFLAGS and GSTREAMER_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GSTREAMER_CFLAGS and GSTREAMER_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GSTREAMER_CFLAGS=$pkg_cv_GSTREAMER_CFLAGS GSTREAMER_LIBS=$pkg_cv_GSTREAMER_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_GSTREAMER 1" >>confdefs.h # for ArchLinux elif test "x$enable_gstreamer" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSTREAMER" >&5 $as_echo_n "checking for GSTREAMER... " >&6; } if test -n "$GSTREAMER_CFLAGS"; then pkg_cv_GSTREAMER_CFLAGS="$GSTREAMER_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "gstreamer-0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTREAMER_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GSTREAMER_LIBS"; then pkg_cv_GSTREAMER_LIBS="$GSTREAMER_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "gstreamer-0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTREAMER_LIBS=`$PKG_CONFIG --libs "gstreamer-0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GSTREAMER_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gstreamer-0.10" 2>&1` else GSTREAMER_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gstreamer-0.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GSTREAMER_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gstreamer-0.10) were not met: $GSTREAMER_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GSTREAMER_CFLAGS and GSTREAMER_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GSTREAMER_CFLAGS and GSTREAMER_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GSTREAMER_CFLAGS=$pkg_cv_GSTREAMER_CFLAGS GSTREAMER_LIBS=$pkg_cv_GSTREAMER_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_GSTREAMER 1" >>confdefs.h # for ArchLinux fi ## ----------------- ## libpwmd # Check whether --enable-pwmd was given. if test "${enable_pwmd+set}" = set; then : enableval=$enable_pwmd; enable_pwmd="$enableval" else enable_pwmd="no" fi if test "x$enable_pwmd" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPWMD" >&5 $as_echo_n "checking for LIBPWMD... " >&6; } if test -n "$LIBPWMD_CFLAGS"; then pkg_cv_LIBPWMD_CFLAGS="$LIBPWMD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpwmd-8.0 >= 8.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpwmd-8.0 >= 8.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBPWMD_CFLAGS=`$PKG_CONFIG --cflags "libpwmd-8.0 >= 8.3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBPWMD_LIBS"; then pkg_cv_LIBPWMD_LIBS="$LIBPWMD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpwmd-8.0 >= 8.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpwmd-8.0 >= 8.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBPWMD_LIBS=`$PKG_CONFIG --libs "libpwmd-8.0 >= 8.3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBPWMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpwmd-8.0 >= 8.3.0" 2>&1` else LIBPWMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpwmd-8.0 >= 8.3.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBPWMD_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpwmd-8.0 >= 8.3.0) were not met: $LIBPWMD_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBPWMD_CFLAGS and LIBPWMD_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBPWMD_CFLAGS and LIBPWMD_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBPWMD_CFLAGS=$pkg_cv_LIBPWMD_CFLAGS LIBPWMD_LIBS=$pkg_cv_LIBPWMD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_LIBPWMD 1" >>confdefs.h fi if test "x$enable_pwmd" = "xyes"; then WITH_LIBPWMD_TRUE= WITH_LIBPWMD_FALSE='#' else WITH_LIBPWMD_TRUE='#' WITH_LIBPWMD_FALSE= fi ## ----------------- ## RSS Notify # Check whether --enable-rss-notify was given. if test "${enable_rss_notify+set}" = set; then : enableval=$enable_rss_notify; enable_rss_notify="$enableval" else enable_rss_notify="yes" fi if test "x$enable_rss_notify" = "xyes"; then $as_echo "#define HAVE_RSS_NOTIFY 1" >>confdefs.h fi ## ----------------- ## UNIX Domain Socket # Check whether --enable-unix-socket was given. if test "${enable_unix_socket+set}" = set; then : enableval=$enable_unix_socket; enable_unix_socket="$enableval" else enable_unix_socket="no" fi if test "x$enable_unix_socket" = "xyes"; then $as_echo "#define USE_UNIX_DOMAIN_SOCKET 1" >>confdefs.h fi ## ---------------------------------------------- ## output ac_config_files="$ac_config_files Makefile doc/Makefile tests/Makefile uget/Makefile uglib/Makefile ui-gtk/Makefile ui-gtk-1to2/Makefile pixmaps/Makefile sounds/Makefile po/Makefile.in Windows/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${WITH_LIBPWMD_TRUE}" && test -z "${WITH_LIBPWMD_FALSE}"; then as_fn_error $? "conditional \"WITH_LIBPWMD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by uget $as_me 2.2.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ uget config.status 2.2.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "uget/Makefile") CONFIG_FILES="$CONFIG_FILES uget/Makefile" ;; "uglib/Makefile") CONFIG_FILES="$CONFIG_FILES uglib/Makefile" ;; "ui-gtk/Makefile") CONFIG_FILES="$CONFIG_FILES ui-gtk/Makefile" ;; "ui-gtk-1to2/Makefile") CONFIG_FILES="$CONFIG_FILES ui-gtk-1to2/Makefile" ;; "pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/Makefile" ;; "sounds/Makefile") CONFIG_FILES="$CONFIG_FILES sounds/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "Windows/Makefile") CONFIG_FILES="$CONFIG_FILES Windows/Makefile" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi uget-2.2.2/ChangeLog0000664000175000017500000000000013470301512011140 00000000000000uget-2.2.2/COPYING0000664000175000017500000006347613470304401010453 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! uget-2.2.2/compile0000755000175000017500000001632713250314767011001 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: uget-2.2.2/uglib/0000775000175000017500000000000013470305206010566 500000000000000uget-2.2.2/uglib/UgSocket.h0000664000175000017500000001420013470304403012376 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_SOCKET_H #define UG_SOCKET_H #include #include #include #if defined _WIN32 || defined _WIN64 #if !defined _WIN32_WINNT || _WIN32_WINNT < 0x0501 # define _WIN32_WINNT 0x0501 // WinXP #endif //#include #include #else #include // socket api #include // struct sockaddr_un #include // struct sockaddr_in #include // close() #define closesocket close #define SOCKET int #define INVALID_SOCKET (-1) #define SOCKET_ERROR (-1) #endif // _WIN32 || _WIN64 #ifdef __cplusplus extern "C" { #endif // domain AF_INET, AF_INET6, or AF_UNIX // type SOCK_STREAM or SOCK_DGRAM...etc // protocol IPPROTO_IP, IPPROTO_TCP, or IPPROTO_UDP //SOCKET ug_socket_new (int domain, int type, int protocol); #define ug_socket_new socket //void ug_socket_close (SOCKET fd); #define ug_socket_close closesocket //void ug_socket_shutdown (SOCKET fd, int how); #define ug_socket_shutdown shutdown // recv() return 0 if remote disconnected. //int ug_socket_send (SOCKET fd, char* buffer, int buffer_len, int flag); //int ug_socket_recv (SOCKET fd, char* buffer, int buffer_len, int flag); #define ug_socket_send send; #define ug_socket_recv recv; // ------------------------------------ // Client API // IPv4 or IPv6 // return SOCKET_ERROR(-1) if error occurred. int ug_socket_connect (SOCKET fd, const char* addr, const char* port_or_serv); #if !(defined _WIN32 || defined _WIN64) // UNIX Domain Socket int ug_socket_connect_unix (SOCKET fd, const char* path, int path_len); #endif // ! (_WIN32 || _WIN64) // return TRUE or FALSE int ug_socket_set_blocking (SOCKET fd, int is_blocking); // ------------------------------------ // Server API // IPv4 or IPv6 // backlog = incomplete connection queue + completed connection queue // use 5 in normal case // return SOCKET, return SOCKET_ERROR in error int ug_socket_listen (SOCKET fd, const char* addr, const char* port_or_serv, int backlog); #if !(defined _WIN32 || defined _WIN64) // UNIX Domain Socket int ug_socket_listen_unix (SOCKET fd, const char* path, int path_len, int backlog); #endif // ! (_WIN32 || _WIN64) /* // ------------------------------------ // UgSocketServer // sample code: UgSocketServer* server; SOCKET server_fd; server_fd = socket (AF_INET, SOCK_STREAM, 0); ug_socket_listen (server_fd, "127.0.0.1", "80", 5); server = ug_socket_server_new (server_fd); ug_socket_server_set_receiver (server, callback, callback_data); ug_socket_server_start (server); // --- now client can connect to server --- ug_socket_server_stop (server); ug_socket_server_unref (server); */ typedef struct UgSocketServer UgSocketServer; typedef void (*UgSocketServerFunc) (UgSocketServer* server, SOCKET client_socket, void* data); struct UgSocketServer { UgThread thread; int ref_count; uint8_t stopping; uint8_t stopped; SOCKET socket; fd_set read_fds; // client address used by accept() socklen_t client_addr_len; union { #if !(defined _WIN32 || defined _WIN64) // struct sockaddr_un unix_path; #endif struct sockaddr_in inet; struct sockaddr_in6 inet6; } client_addr; // callback after accept() struct { UgSocketServerFunc func; void* data; } receiver; // destroy notification struct { UgNotifyFunc func; void* data; } destroy; // user data struct { void* data; void* data2; void* data3; } user; }; UgSocketServer* ug_socket_server_new (SOCKET server_fd); UgSocketServer* ug_socket_server_new_addr (const char* addr, const char* port_or_serv); #if !(defined _WIN32 || defined _WIN64) // UNIX Domain Socket UgSocketServer* ug_socket_server_new_unix (const char* path, int path_len); #endif void ug_socket_server_ref (UgSocketServer* server); void ug_socket_server_unref (UgSocketServer* server); void ug_socket_server_close (UgSocketServer* server); // Program will call user specified function after accept() void ug_socket_server_set_receiver (UgSocketServer* server, UgSocketServerFunc func, void* data); // start/stop thread for accept() int ug_socket_server_start (UgSocketServer* server); void ug_socket_server_stop (UgSocketServer* server); #ifdef __cplusplus } #endif #endif // UG_SOCKET_H uget-2.2.2/uglib/UgValue.c0000664000175000017500000002753413470304403012233 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #if defined(_MSC_VER) #define strtoll _strtoi64 #define strtoull _strtoui64 #endif static UgValueArray* ug_value_array_new(int preAllocate); static void ug_value_array_free(UgValueArray* varray); #define ug_value_object_new ug_value_array_new #define ug_value_object_free ug_value_array_free // ---------------------------------------------------------------------------- // UgValue void ug_value_init(UgValue* value) { value->type = UG_VALUE_NONE; value->name = NULL; } void ug_value_clear(UgValue* value) { switch (value->type) { case UG_VALUE_STRING: ug_free(value->c.string); break; case UG_VALUE_OBJECT: case UG_VALUE_ARRAY: ug_value_array_free(value->c.array); break; default: break; } ug_free(value->name); value->name = NULL; value->type = UG_VALUE_NONE; } void ug_value_init_type(UgValue* value, UgValueType type) { if (type == UG_VALUE_OBJECT) value->c.object = ug_value_object_new(8); else if (type == UG_VALUE_ARRAY) value->c.array = ug_value_array_new(8); value->name = NULL; value->type = type; } void ug_value_init_array(UgValue* value, int nElements) { value->name = NULL; value->type = UG_VALUE_ARRAY; value->c.array = ug_value_array_new(nElements); } void ug_value_init_object(UgValue* value, int nMembers) { value->name = NULL; value->type = UG_VALUE_OBJECT; value->c.array = ug_value_object_new(nMembers); } UgValue* ug_value_alloc(UgValue* uvalue, int nValue) { int len; UgValue* value; UgValueArray* varray; // if (uvalue->type != UG_VALUE_ARRAY) // return NULL; varray = uvalue->c.array; len = varray->length + nValue; if (len > varray->allocated) { len *= 2; // if (len < 16) // len = 16; varray->allocated = len + 1; uvalue->c.array = ug_realloc(varray, sizeof(UgValueArray) + sizeof(UgValue[1]) * len); varray = uvalue->c.array; } len = varray->length; varray->length += nValue; value = varray->at + len; uvalue = value; while (nValue--) { value->name = NULL; value->type = UG_VALUE_NONE; // value->c.pointer = NULL; value++; } return uvalue; } #if 0 UgValue* ug_value_alloc_front(UgValue* uvalue, int nValue) { int len; UgValue* value; UgValueArray* varray; // if (uvalue->type != UG_VALUE_ARRAY) // return NULL; varray = uvalue->c.array; len = varray->length + nValue; if (len > varray->allocated) { len *= 2; // if (len < 16) // len = 16; varray->allocated = len + 1; uvalue->c.array = ug_realloc(varray, sizeof(UgValueArray) + sizeof(UgValue[1]) * len); varray = uvalue->c.array; } memmove(varray->at + nValue, varray->at, sizeof(UgValue) * varray->length); varray->length += nValue; value = varray->at; while (nValue--) { value->name = NULL; value->type = UG_VALUE_NONE; // value->c.pointer = NULL; value++; } return varray->at; } #endif UgValue* ug_value_find_name(UgValue* value, const char* name) { UgValue temp; if (value->type == UG_VALUE_OBJECT) { temp.name = (char*)name; return bsearch(&temp, value->c.object->at, value->c.object->length, sizeof(UgValue), ug_value_compare_name); } return NULL; } void ug_value_sort_recursive(UgValue* value, UgCompareFunc compare) { UgValue* end; if (value->type == UG_VALUE_OBJECT) { ug_value_sort(value, compare); end = value->c.object->at + value->c.object->length; for (value = value->c.object->at; value < end; value++) ug_value_sort_recursive(value, compare); } } int ug_value_compare_name(const void* value1, const void* value2) { return strcmp(((UgValue*)value1)->name, ((UgValue*)value2)->name); } int ug_value_compare_string(const void* value1, const void* value2) { return strcmp(((UgValue*)value1)->c.string, ((UgValue*)value2)->c.string); } void ug_value_set_name(UgValue* value, void* data) { value->name = data; } void ug_value_set_string(UgValue* value, void* data) { if (value->type == UG_VALUE_STRING) value->c.string = data; } void ug_value_set_name_string(UgValue* value, void* data) { value->name = data; if (value->type == UG_VALUE_STRING) value->c.string = data; } void ug_value_foreach(UgValue* value, UgValueForeachFunc func, void* data) { UgValue* end; func(value, data); if (value->type >= UG_VALUE_OBJECT) { end = value->c.object->at + value->c.object->length; for (value = value->c.object->at; value < end; value++) ug_value_foreach(value, func, data); } } int ug_value_get_int(UgValue* uvalue) { switch (uvalue->type) { default: case UG_VALUE_INT: return uvalue->c.integer; case UG_VALUE_UINT: return (int) uvalue->c.uinteger; case UG_VALUE_INT64: return (int) uvalue->c.integer64; case UG_VALUE_UINT64: return (int) uvalue->c.uinteger64; case UG_VALUE_DOUBLE: return (int) uvalue->c.fraction; case UG_VALUE_STRING: return strtol(uvalue->c.string, NULL, 10); } } int64_t ug_value_get_int64(UgValue* uvalue) { switch (uvalue->type) { case UG_VALUE_INT: return (int64_t) uvalue->c.integer; case UG_VALUE_UINT: return (int64_t) uvalue->c.uinteger; default: case UG_VALUE_INT64: return uvalue->c.integer64; case UG_VALUE_UINT64: return (int64_t) uvalue->c.uinteger64; case UG_VALUE_DOUBLE: return (int64_t) uvalue->c.fraction; case UG_VALUE_STRING: return strtoll(uvalue->c.string, NULL, 10); } } uint64_t ug_value_get_uint64(UgValue* uvalue) { switch (uvalue->type) { case UG_VALUE_INT: return (uint64_t) uvalue->c.integer; case UG_VALUE_UINT: return (uint64_t) uvalue->c.uinteger; case UG_VALUE_INT64: return (uint64_t) uvalue->c.integer64; default: case UG_VALUE_UINT64: return uvalue->c.uinteger64; case UG_VALUE_DOUBLE: return (uint64_t) uvalue->c.fraction; case UG_VALUE_STRING: return strtoull(uvalue->c.string, NULL, 10); } } static UgJsonError ug_json_parse_value_array(UgJson* json, const char* name, const char* value, void* uvalue, void* none); UgJsonError ug_json_parse_value(UgJson* json, const char* name, const char* value, void* data, void* none) { UgValue* uvalue; uvalue = data; if (json->scope == UG_JSON_OBJECT) uvalue->name = ug_strdup(name); else uvalue->name = NULL; switch (json->type) { case UG_JSON_NULL: uvalue->type = UG_VALUE_STRING; uvalue->c.string = NULL; break; case UG_JSON_TRUE: uvalue->type = UG_VALUE_BOOL; uvalue->c.boolean = 1; break; case UG_JSON_FALSE: uvalue->type = UG_VALUE_BOOL; uvalue->c.boolean = 0; break; case UG_JSON_NUMBER: if (strchr(value, '.')) { uvalue->type = UG_VALUE_DOUBLE; uvalue->c.fraction = strtod(value, NULL); } else if (value[0] == '-') { uvalue->c.integer64 = (int64_t) strtoll(value, NULL, 10); if (uvalue->c.integer64 >= INT_MIN) { uvalue->c.integer = (int) uvalue->c.integer64; uvalue->type = UG_VALUE_INT; } else uvalue->type = UG_VALUE_INT64; } else { uvalue->c.uinteger64 = (uint64_t) strtoull(value, NULL, 10); if (uvalue->c.uinteger64 <= INT_MAX) { uvalue->c.integer = (int) uvalue->c.uinteger64; uvalue->type = UG_VALUE_INT; } else if (uvalue->c.uinteger64 <= UINT_MAX) { uvalue->c.uinteger = (unsigned int) uvalue->c.uinteger64; uvalue->type = UG_VALUE_UINT; } else if (uvalue->c.uinteger64 <= INT64_MAX) { uvalue->c.integer64 = (int64_t) uvalue->c.uinteger64; uvalue->type = UG_VALUE_INT64; } else uvalue->type = UG_VALUE_UINT64; } break; case UG_JSON_STRING: uvalue->type = UG_VALUE_STRING; uvalue->c.string = ug_strdup(value); break; case UG_JSON_OBJECT: uvalue->type = UG_VALUE_OBJECT; uvalue->c.object = ug_value_object_new(8); ug_json_push(json, ug_json_parse_value_array, uvalue, NULL); break; case UG_JSON_ARRAY: uvalue->type = UG_VALUE_ARRAY; uvalue->c.array = ug_value_array_new(8); ug_json_push(json, ug_json_parse_value_array, uvalue, NULL); break; default: uvalue->type = UG_VALUE_NONE; break; }; return UG_JSON_ERROR_NONE; } static void ug_json_write_value_array(UgJson* json, UgValueArray* varray); void ug_json_write_value(UgJson* json, UgValue* uvalue) { if (uvalue->type == UG_VALUE_NONE) return; if (uvalue->name) ug_json_write_string(json, uvalue->name); switch (uvalue->type) { case UG_VALUE_BOOL: ug_json_write_bool(json, uvalue->c.boolean); break; case UG_VALUE_INT: ug_json_write_int(json, uvalue->c.integer); break; case UG_VALUE_UINT: ug_json_write_uint(json, uvalue->c.uinteger); break; case UG_VALUE_INT64: ug_json_write_int64(json, uvalue->c.integer64); break; case UG_VALUE_UINT64: ug_json_write_uint64(json, uvalue->c.uinteger64); break; case UG_VALUE_DOUBLE: ug_json_write_double(json, uvalue->c.fraction); break; case UG_VALUE_STRING: if (uvalue->c.string) ug_json_write_string(json, uvalue->c.string); else ug_json_write_null(json); break; case UG_VALUE_OBJECT: ug_json_write_object_head(json); ug_json_write_value_array(json, uvalue->c.array); ug_json_write_object_tail(json); break; case UG_VALUE_ARRAY: ug_json_write_array_head(json); ug_json_write_value_array(json, uvalue->c.array); ug_json_write_array_tail(json); break; default: break; }; } // ---------------------------------------------------------------------------- // UgValueArray = UgValueObject static UgValueArray* ug_value_array_new(int preAllocate) { UgValueArray* varray; varray = ug_malloc(sizeof(UgValueArray) + sizeof(UgValue) * preAllocate); varray->allocated = preAllocate + 1; varray->length = 0; return varray; } static void ug_value_array_free(UgValueArray* varray) { UgValue* cur; UgValue* end; cur = varray->at; end = varray->at + varray->length; for (; cur < end; cur++) ug_value_clear(cur); ug_free(varray); } static UgJsonError ug_json_parse_value_array(UgJson* json, const char* name, const char* value, void* uvalue, void* none) { UgValue* uvalue1; uvalue1 = ug_value_alloc(uvalue, 1); return ug_json_parse_value(json, name, value, uvalue1, none); } static void ug_json_write_value_array(UgJson* json, UgValueArray* varray) { UgValue* cur; UgValue* end; cur = varray->at; end = varray->at + varray->length; for (; cur < end; cur++) ug_json_write_value(json, cur); } uget-2.2.2/uglib/UgJsonrpc.h0000664000175000017500000001745313470304403012601 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_JSONRPC_H #define UG_JSONRPC_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgJsonrpc UgJsonrpc; typedef struct UgJsonrpcError UgJsonrpcError; typedef struct UgJsonrpcObject UgJsonrpcObject; typedef UG_ARRAY(UgJsonrpcObject*) UgJsonrpcArray; typedef void (*UgJsonrpcServerFunc) (UgJsonrpc* jrpc, void* data, void* data2); // UgEntry for JSON parser and writer extern const UgEntry UgJsonrpcErrorEntry[]; extern const UgEntry UgJsonrpcObjectEntry[]; // ---------------------------------------------------------------------------- // UgJsonrpcError: JSON-RPC error object struct UgJsonrpcError { // JSON-RPC error code: // -32700 Parse error. Invalid JSON was received by the server. // An error occurred on the server while parsing the JSON text. // -32600 Invalid Request The JSON sent is not a valid Request object. // -32601 Method not found The method does not exist / is not available. // -32602 Invalid params Invalid method parameter(s). // -32603 Internal error Internal JSON-RPC error. int code; char* message; // This may be omitted. // A Primitive or Structured value that contains additional information about the error. // The value of this member is defined by the Server // (e.g. detailed error information, nested errors etc.). UgValue data; }; // ---------------------------------------------------------------------------- // UgJsonrpcObject struct UgJsonrpcObject { // char* jsonrpc; // version string // A Notification is a Request object without an "id" member. UgValue id; // request char* method; const char* method_static; // This member MAY be omitted. UgValue params; // response // This member MUST NOT exist if there was an error. UgValue result; // This member MUST NOT exist if there was no error. UgJsonrpcError error; }; UgJsonrpcObject* ug_jsonrpc_object_new(void); void ug_jsonrpc_object_free(UgJsonrpcObject* jrobj); void ug_jsonrpc_object_init(UgJsonrpcObject* jrobj); void ug_jsonrpc_object_clear(UgJsonrpcObject* jrobj); void ug_jsonrpc_object_clear_request(UgJsonrpcObject* jrobj); void ug_jsonrpc_object_clear_response(UgJsonrpcObject* jrobj); // check request, and return error code. //int ug_jsonrpc_object_check(UgJsonrpcObject* jrobj); // parser: ug_json_parse_entry // writer: ug_json_write_entry will output all value in UgJsonrpcObject. // use below function to output JSON-RPC request and response object void ug_json_write_rpc_object(UgJson* json, UgJsonrpcObject* jrobj); // ---------------------------------------------------------------------------- // UgJsonrpcArray: a UgJsonrpcObject array for batch //void ug_jsonrpc_array_init(UgJsonrpcArray* joarray, int allocated_len); #define ug_jsonrpc_array_init(array, allocated_len) \ ug_array_init(array, sizeof(UgJsonrpcObject*), allocated_len) // param free_objects: TRUE or FALSE void ug_jsonrpc_array_clear(UgJsonrpcArray* joarray, int free_objects); UgJsonrpcObject* ug_jsonrpc_array_find(UgJsonrpcArray* joarray, UgValue* id, int* index); UgJsonrpcObject* ug_jsonrpc_array_alloc(UgJsonrpcArray* joarray); // ------------------------------------ UgJsonError ug_json_parse_rpc_array(UgJson* json, const char* name, const char* value, void* jrarray, void* none); // param noArrayIfPossible: TRUE or FALSE void ug_json_write_rpc_array(UgJson* json, UgJsonrpcArray* objects, int noArrayIfPossible); // If program doesn't known incoming data type, // this function can parse UgJsonrpcArray or UgJsonrpcObject. // This function used by server. UgJsonError ug_json_parse_rpc_unknown(UgJson* json, const char* name, const char* value, void* jrarray, void* jrobject); // ---------------------------------------------------------------------------- // UgJsonrpc: JSON-RPC Client & Server // +-----------------------------+ // | UgJsonrpcXXXX | UgJsonrpcArray // buffer <--+--> UgJson <--> UgJsonrpc <--+--> or // | | UgJsonrpcObject // +-----------------------------+ // send/receive return input or output size // send/receive return -1 = error // receive return 0 if connection close typedef int (*UgJsonrpcFunc) (void* target); struct UgJsonrpc { UgJson* json; UgBuffer* buffer; UgJsonError error; // input/output function struct { UgJsonrpcFunc func; void* data; } send, receive; union { // client struct { intptr_t current; intptr_t previous; } id; // server struct { UgJsonrpcObject* object; UgJsonrpcArray* array; } request; } data; }; void ug_jsonrpc_init(UgJsonrpc* jrpc, UgJson* json, UgBuffer* buffer); void ug_jsonrpc_clear(UgJsonrpc* jrpc); // ------------------------------------ // client API : set response == NULL if this is notify request // if error occurred, return -1 int ug_jsonrpc_call(UgJsonrpc* jrpc, UgJsonrpcObject* request, UgJsonrpcObject* response); int ug_jsonrpc_call_batch(UgJsonrpc* jrpc, UgJsonrpcArray* request, UgJsonrpcArray* response); // ------------------------------------ // server API // return 0 if remote disconnected. // return -1 if error occurred. // if ok, return UG_JSON_ARRAY or UG_JSON_OBJECT and set jr_array or jr_object. int ug_jsonrpc_receive(UgJsonrpc* jrpc, UgJsonrpcObject* jr_object, UgJsonrpcArray* jr_array); int ug_jsonrpc_response(UgJsonrpc* jrpc, UgJsonrpcObject* jr_object); int ug_jsonrpc_response_batch(UgJsonrpc* jrpc, UgJsonrpcArray* jr_array); // This function used by UgJsonrpc server mode. UgJsonError ug_json_parse_rpc_request(UgJson* json, const char* name, const char* value, void* jsonrpc, void* type); #ifdef __cplusplus } #endif #endif // UG_JSONRPC_H uget-2.2.2/uglib/UgFileUtil.h0000664000175000017500000000746113470304403012676 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_FILE_UTIL_H #define UG_FILE_UTIL_H #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include #endif #if !(defined _WIN32 || defined _WIN64) #include #include // opendir(), closedir(), readdir() #endif #include #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // UgDir #if defined HAVE_GLIB typedef GDir UgDir; # define ug_dir_open(p) g_dir_open(p, 0, NULL) # define ug_dir_close g_dir_close # define ug_dir_rewind g_dir_rewind # define ug_dir_read g_dir_read_name #elif defined _WIN32 || defined _WIN64 typedef struct UgDir UgDir; UgDir* ug_dir_open (const char* path_utf8); void ug_dir_close (UgDir* udir); void ug_dir_rewind (UgDir* udir); const char* ug_dir_read (UgDir* udir); #else typedef DIR UgDir; # define ug_dir_open opendir # define ug_dir_close closedir # define ug_dir_rewind rewinddir const char* ug_dir_read (UgDir* udir); #endif // ---------------------------------------------------------------------------- // Time // Change the modified time of file int ug_modify_file_time (const char *file_utf8, time_t mod_time); // ---------------------------------------------------------------------------- // file & directory functions int ug_file_is_exist (const char* file_utf8); int ug_file_is_dir (const char* file_utf8); // return -1 if error #if defined _WIN32 || defined _WIN64 || defined HAVE_GLIB || defined USE__ANDROID__SAF int ug_create_dir (const char *dir_utf8); int ug_delete_dir (const char *dir_utf8); #else # define ug_create_dir(dir) mkdir(dir,0755) # define ug_delete_dir rmdir #endif // return -1 if error int ug_create_dir_all (const char* dir_utf8, int len); //int ug_delete_dir_all (const char* dir_utf8, int len); // ---------------------------------------------------------------------------- // File I/O // return -1 if error int ug_file_copy (const char *src_file_utf8, const char *dest_file_utf8); // return number of lines int ug_file_get_lines (const char* filename_utf8, UgList* list); #ifdef __cplusplus } #endif #endif // End of UG_FILE_UTIL_H uget-2.2.2/uglib/UgJson-custom.c0000664000175000017500000003315713470304403013376 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #if defined(_MSC_VER) #define _CRT_SECURE_NO_WARNINGS #define strtoll _strtoi64 #define snprintf _snprintf #endif #include // time_t #include // INT_MIN, INT_MAX, UINT_MAX #include #include #include #include // ---------------------------------------------------------------------------- UgJsonError ug_json_parse_int_string(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type == UG_JSON_STRING || json->type == UG_JSON_NUMBER) *(int*) dest = strtol(value, NULL, 10); else return UG_JSON_ERROR_TYPE_NOT_MATCH; return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_uint_string(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type == UG_JSON_STRING || json->type == UG_JSON_NUMBER) *(unsigned int*) dest = strtoul(value, NULL, 10); else return UG_JSON_ERROR_TYPE_NOT_MATCH; return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_int64_string(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type == UG_JSON_STRING || json->type == UG_JSON_NUMBER) *(int64_t*) dest = strtoll(value, NULL, 10); else return UG_JSON_ERROR_TYPE_NOT_MATCH; return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_double_string(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type == UG_JSON_STRING || json->type == UG_JSON_NUMBER) *(double*) dest = strtod(value, NULL); else return UG_JSON_ERROR_TYPE_NOT_MATCH; return UG_JSON_ERROR_NONE; } void ug_json_write_int_string(UgJson* json, int* value) { int len; char* buf; len = snprintf(NULL, 0, "%d", *value) + 1; buf = ug_malloc(len); snprintf(buf, len, "%d", *value); ug_json_write_string(json, buf); ug_free(buf); } void ug_json_write_uint_string(UgJson* json, unsigned int* value) { int len; char* buf; len = snprintf(NULL, 0, "%u", *value) + 1; buf = ug_malloc(len); snprintf(buf, len, "%u", *value); ug_json_write_string(json, buf); ug_free(buf); } void ug_json_write_int64_string(UgJson* json, int64_t* value) { int len; char* buf; #if defined (_MSC_VER) || defined (__MINGW32__) len = snprintf(NULL, 0, "%I64d", *value) + 1; buf = ug_malloc(len); snprintf(buf, len, "%I64d", *value); #else len = snprintf(NULL, 0, "%lld", (long long) *value) + 1; buf = ug_malloc(len); snprintf(buf, len, "%lld", (long long) *value); #endif ug_json_write_string(json, buf); ug_free(buf); } void ug_json_write_double_string(UgJson* json, double* value) { int len; char* buf; len = snprintf(NULL, 0, "%f", *value) + 1; buf = ug_malloc(len); snprintf(buf, len, "%f", *value); ug_json_write_string(json, buf); ug_free(buf); } // ---------------------------------------------------------------------------- // parse and write JSON number for C types - uint8_t, int16_t, and int32_t UgJsonError ug_json_parse_uint8(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type != UG_JSON_NUMBER) return UG_JSON_ERROR_TYPE_NOT_MATCH; *(uint8_t*) dest = strtol(value, NULL, 10); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_int16(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type != UG_JSON_NUMBER) return UG_JSON_ERROR_TYPE_NOT_MATCH; *(int16_t*) dest = strtol(value, NULL, 10); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_int32(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } if (json->type != UG_JSON_NUMBER) return UG_JSON_ERROR_TYPE_NOT_MATCH; *(int32_t*) dest = strtol(value, NULL, 10); return UG_JSON_ERROR_NONE; } void ug_json_write_uint8(UgJson* json, uint8_t* value) { ug_json_write_int(json, *(uint8_t*)value); } void ug_json_write_int16(UgJson* json, int16_t* value) { ug_json_write_int(json, *(int16_t*)value); } void ug_json_write_int32(UgJson* json, int32_t* value) { ug_json_write_int(json, *(int32_t*)value); } // ---------------------------------------------------------------------------- // parse string "true" and "false" to integer (boolean). // write integer (boolean) to string "true" and "false". UgJsonError ug_json_parse_bool_string(UgJson* json, const char* name, const char* value, void* dest, void* data) { // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } switch (json->type) { case UG_JSON_TRUE: *(int*) dest = TRUE; break; case UG_JSON_FALSE: *(int*) dest = FALSE; break; // case UG_JSON_NUMBER: // if (strtol(value, NULL, 10) == 0) // *(int*) dest = FALSE; // else // *(int*) dest = TRUE; // break; case UG_JSON_STRING: if (strcmp(value, "true") == 0) *(int*) dest = TRUE; else if (strcmp(value, "false") == 0) *(int*) dest = FALSE; break; default: return UG_JSON_ERROR_TYPE_NOT_MATCH; } return UG_JSON_ERROR_NONE; } void ug_json_write_bool_string(UgJson* json, int* value) { if (*value == FALSE) ug_json_write_string(json, "false"); else ug_json_write_string(json, "true"); } // ---------------------------------------------------------------------------- // UgJsonParseFunc and UgJsonWriteFunc for time_t UgJsonError ug_json_parse_time_t(UgJson* json, const char* name, const char* value, void* dest, void* none) { #if 1 if (json->type != UG_JSON_NUMBER) return UG_JSON_ERROR_TYPE_NOT_MATCH; *(time_t*) dest = strtoll(value, NULL, 10); return UG_JSON_ERROR_NONE; #else struct tm timem; timem.tm_year = year - 1900; timem.tm_mon = month - 1; timem.tm_mday = day; timem.tm_hour = hour; timem.tm_min = minute; timem.tm_sec) = second; timem.tm_isdst = 0; *(time_t*) dest = mktime(timem); // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } #endif } void ug_json_write_time_t(UgJson* json, void* data) { #if 1 ug_json_write_int64(json, *(time_t*) data); #else struct tm* timem; char* timestr; timem = gmtime((time_t*) dest); // localtime((time_t*) dest); timestr = ug_malloc(32); // output format : "2013-02-05 21:25:15" snprintf(timestr, 32, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", timem->tm_year + 1900, timem->tm_mon + 1, timem->tm_mday, timem->tm_hour, timem->tm_min, timem->tm_sec); ug_json_write_string(json, timestr); ug_free(timestr); #endif } // ---------------------------------------------------------------------------- // UgJson reparse UgValue: this can convert UgValue to UgEntry // e.g. // ug_json_begin_parse(json); // ug_json_push(json, ug_json_parse_entry, entry, dest, data); // ug_json_reparse_value(json, value); // ug_json_end_parse(json); enum { PARSER_STACK_BASE, // 0 PARSER_STACK_TYPE, // 1 PARSER_STACK_DATA2, // 2 PARSER_STACK_DATA1, // 3 PARSER_STACK_FUNC, // 4 PARSER_STACK_UNIT = PARSER_STACK_FUNC, // equal with STACK_MULTIPLY_VALUE }; // static function static void ug_json_call_parser_value(UgJson* json, UgValue* uvalue, const char* value) { UgJsonParseFunc parser; void** stack; char error; int stackLen; // get parser and data from stack if (json->stack.length && json->type < UG_JSON_N_TYPE) { stackLen = json->stack.length; stack = json->stack.at + json->stack.length; parser = *(stack - PARSER_STACK_FUNC); error = parser(json, uvalue->name, value, *(stack - PARSER_STACK_DATA1), *(stack - PARSER_STACK_DATA2)); if (error) json->error = error; // It must push parser when getting UG_JSON_OBJECT or UG_JSON_ARRAY. // If callback function does NOT push any parser, push default one. if (json->type >= UG_JSON_OBJECT && stackLen == json->stack.length) ug_json_push(json, ug_json_parse_unknown, NULL, NULL); } // reset state json->type = 0; // UG_JSON_VALUE // reset buffer json->buf.at[0] = 0; json->buf.length = 1; } void ug_json_parse_by_value(UgJson* json, UgValue* value) { UgValue* end; switch (value->type) { case UG_VALUE_NONE: default: // skip this value break; case UG_VALUE_OBJECT: json->type = UG_JSON_OBJECT; ug_json_call_parser_value(json, value, NULL); json->scope = UG_JSON_OBJECT; end = value->c.object->at + value->c.object->length; for (value = value->c.object->at; value < end; value++) ug_json_parse_by_value(json, value); ug_json_pop(json); break; case UG_VALUE_ARRAY: json->type = UG_JSON_ARRAY; ug_json_call_parser_value(json, value, NULL); json->scope = UG_JSON_ARRAY; end = value->c.array->at + value->c.array->length; for (value = value->c.array->at; value < end; value++) ug_json_parse_by_value(json, value); ug_json_pop(json); break; case UG_VALUE_BOOL: if (value->c.boolean == FALSE) { json->type = UG_JSON_FALSE; ug_json_call_parser_value(json, value, "false"); } else { json->type = UG_JSON_TRUE; ug_json_call_parser_value(json, value, "true"); } break; case UG_VALUE_INT: json->type = UG_JSON_NUMBER; snprintf(json->buf.at, json->buf.allocated, "%d", value->c.integer); ug_json_call_parser_value(json, value, json->buf.at); break; case UG_VALUE_UINT: json->type = UG_JSON_NUMBER; snprintf(json->buf.at, json->buf.allocated, "%u", value->c.uinteger); ug_json_call_parser_value(json, value, json->buf.at); break; case UG_VALUE_INT64: json->type = UG_JSON_NUMBER; #if defined (_MSC_VER) || defined (__MINGW32__) snprintf(json->buf.at, json->buf.allocated, "%I64d", value->c.integer64); #else snprintf(json->buf.at, json->buf.allocated, "%lld", (long long int) value->c.integer64); #endif ug_json_call_parser_value(json, value, json->buf.at); break; case UG_VALUE_UINT64: json->type = UG_JSON_NUMBER; #if defined (_MSC_VER) || defined (__MINGW32__) snprintf(json->buf.at, json->buf.allocated, "%I64u", value->c.uinteger64); #else snprintf(json->buf.at, json->buf.allocated, "%llu", (long long int) value->c.uinteger64 ); #endif ug_json_call_parser_value(json, value, json->buf.at); break; case UG_VALUE_DOUBLE: json->type = UG_JSON_NUMBER; snprintf(json->buf.at, json->buf.allocated, "%f", value->c.fraction); ug_json_call_parser_value(json, value, json->buf.at); break; case UG_VALUE_STRING: if (value->c.string == NULL) { json->type = UG_JSON_NULL; ug_json_call_parser_value(json, value, NULL); } else { json->type = UG_JSON_STRING; ug_json_call_parser_value(json, value, value->c.string); } break; } } uget-2.2.2/uglib/UgUri.h0000664000175000017500000001644113470304403011716 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_URI_H #define UG_URI_H #include #ifdef __cplusplus extern "C" { #endif /* * Request for Comments: 3986 (RFC 3986) * Uniform Resource Identifier (URI): * * uri://example.org:8080/road/where?name=ferret#nose * \_/ \______________/\_________/ \_________/ \__/ * | | | | | * scheme authority path query fragment * | _____________________|__ * / \ / \ * urn:example:animal:ferret:nose * * uri://user:password@host:port/path/file.ext?query#fragment * urn:path */ typedef struct UgUri UgUri; #define UG_URI_MEMBERS \ const char* uri; \ int16_t scheme_len; \ int16_t authority; \ int16_t host; \ int16_t port; \ int16_t path; \ int16_t file; \ int16_t query; \ int16_t fragment struct UgUri { UG_URI_MEMBERS; /* const char* uri; int16_t scheme_len; int16_t authority; int16_t host; int16_t port; int16_t path; int16_t file; int16_t query; int16_t fragment; */ }; int ug_uri_init (UgUri* uuri, const char* uri); int ug_uri_part_scheme (UgUri* uuri, const char** scheme); int ug_uri_part_file (UgUri* uuri, const char** file); int ug_uri_part_file_ext (UgUri* uuri, const char** ext); int ug_uri_part_query (UgUri* uuri, const char** query); int ug_uri_part_fragment (UgUri* uuri, const char** fragment); int ug_uri_part_referrer (UgUri* uuri, const char** referrer); int ug_uri_part_user (UgUri* uuri, const char** user); int ug_uri_part_password (UgUri* uuri, const char** password); int ug_uri_part_host (UgUri* uuri, const char** host); int ug_uri_part_port (UgUri* uuri, const char** port); #define ug_uri_scheme ug_uri_part_scheme #define ug_uri_file ug_uri_part_file #define ug_uri_file_ext ug_uri_part_file_ext #define ug_uri_query ug_uri_part_query #define ug_uri_fragment ug_uri_part_fragment #define ug_uri_referrer ug_uri_part_referrer #define ug_uri_user ug_uri_part_user #define ug_uri_password ug_uri_part_password #define ug_uri_host ug_uri_part_host #define ug_uri_port ug_uri_part_port int ug_uri_get_port (UgUri* uuri); char* ug_uri_get_file (UgUri* uuri); int ug_uri_is_file (UgUri* uuri); // ------------------------------------ // match uri functions // return -1 if it can't match, return index if matched. // second parameter must be null-terminated. Below are sample: // hosts = {".twodot.edu", "your.com", ".org", NULL}; // schemes = {"http", "ftp", NULL}; // exts = {"torrent", "meta", NULL}; int ug_uri_match_hosts (UgUri* uuri, char** hosts); int ug_uri_match_schemes (UgUri* uuri, char** schemes); int ug_uri_match_file_exts (UgUri* uuri, char** exts); // ------------------------------------ // UgUriQuery // field1=value1&field2=value2&field3=value3,next_value typedef struct UgUriQuery UgUriQuery; struct UgUriQuery { int field_len; char* value; int value_len; char* field_next; char* value_next; }; /* // e.g. while (ug_uri_query_part(&uuquery, field) > 0) { // your code here field = uuquery->field_next; } */ // return 0: if param 'query_field' is NULL. // return 0: no field (end of query) // return 1: field only // return 2: field & value int ug_uri_query_part (UgUriQuery* uuquery, const char* query_field); // ------------------------------------ // Other URI functions // return length of decoded uri. param dest can be param uri or NULL. int ug_decode_uri (const char* uri, int uri_length, char* dest); char* ug_filename_from_uri (const char* uri); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct UriMethod { inline void init (const char* uri) { ug_uri_init ((UgUri*) this, uri); } // inline void final (void) // {} inline int file (const char** file) { return ug_uri_part_file ((UgUri*) this, file); } inline int fileExt (const char** ext) { return ug_uri_part_file_ext ((UgUri*) this, ext); } inline int query (const char** query) { return ug_uri_part_query ((UgUri*) this, query); } inline int fragment (const char** fragment) { return ug_uri_part_fragment ((UgUri*) this, fragment); } inline int referrer (const char** referrer) { return ug_uri_part_referrer ((UgUri*) this, referrer); } inline int user (const char** user) { return ug_uri_part_user ((UgUri*) this, user); } inline int password (const char** password) { return ug_uri_part_password ((UgUri*) this, password); } inline int host (const char** host) { return ug_uri_part_host ((UgUri*) this, host); } inline int port (const char** port) { return ug_uri_part_port ((UgUri*) this, port); } inline int port (void) { return ug_uri_get_port ((UgUri*) this); } // return -1 if it can't match, return index if matched. // parameter must be null-terminated. Below are sample: // hosts = {".twodot.edu", "your.com", ".org", NULL}; // schemes = {"http", "ftp", NULL}; // exts = {"torrent", "meta", NULL}; inline int matchHosts (char** hosts) { return ug_uri_match_hosts ((UgUri*) this, hosts); } inline int matchSchemes (char** schemes) { return ug_uri_match_schemes ((UgUri*) this, schemes); } inline int matchFileExts (char** exts) { return ug_uri_match_file_exts ((UgUri*) this, exts); } }; // This one is for directly use only. You can NOT derived it. struct Uri : UriMethod, UgUri {}; }; // namespace Ug #endif // __cplusplus #endif // UG_URI_H uget-2.2.2/uglib/Makefile.in0000664000175000017500000010070713470304626012565 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = uglib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libuglib_a_AR = $(AR) $(ARFLAGS) libuglib_a_LIBADD = am_libuglib_a_OBJECTS = libuglib_a-UgStdio.$(OBJEXT) \ libuglib_a-UgString.$(OBJEXT) libuglib_a-UgThread.$(OBJEXT) \ libuglib_a-UgSocket.$(OBJEXT) libuglib_a-UgUtil.$(OBJEXT) \ libuglib_a-UgFileUtil.$(OBJEXT) libuglib_a-UgArray.$(OBJEXT) \ libuglib_a-UgList.$(OBJEXT) libuglib_a-UgSLink.$(OBJEXT) \ libuglib_a-UgOption.$(OBJEXT) libuglib_a-UgUri.$(OBJEXT) \ libuglib_a-UgNode.$(OBJEXT) libuglib_a-UgData.$(OBJEXT) \ libuglib_a-UgInfo.$(OBJEXT) libuglib_a-UgRegistry.$(OBJEXT) \ libuglib_a-UgValue.$(OBJEXT) libuglib_a-UgEntry.$(OBJEXT) \ libuglib_a-UgBuffer.$(OBJEXT) libuglib_a-UgJson.$(OBJEXT) \ libuglib_a-UgJson-custom.$(OBJEXT) \ libuglib_a-UgJsonFile.$(OBJEXT) libuglib_a-UgJsonrpc.$(OBJEXT) \ libuglib_a-UgJsonrpcSocket.$(OBJEXT) \ libuglib_a-UgJsonrpcCurl.$(OBJEXT) libuglib_a-UgHtml.$(OBJEXT) \ libuglib_a-UgHtmlEntry.$(OBJEXT) \ libuglib_a-UgHtmlFilter.$(OBJEXT) libuglib_a_OBJECTS = $(am_libuglib_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = am__maybe_remake_depfiles = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libuglib_a_SOURCES) DIST_SOURCES = $(libuglib_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_INDICATOR_CFLAGS = @APP_INDICATOR_CFLAGS@ APP_INDICATOR_LIBS = @APP_INDICATOR_LIBS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETCONF = @GETCONF@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ GSTREAMER_LIBS = @GSTREAMER_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LFS_CFLAGS = @LFS_CFLAGS@ LFS_LDFLAGS = @LFS_LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBPWMD_CFLAGS = @LIBPWMD_CFLAGS@ LIBPWMD_LIBS = @LIBPWMD_LIBS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = no-dependencies # lib_LIBRARIES = libuglib.a noinst_LIBRARIES = libuglib.a libuglib_a_CPPFLAGS = -I$(top_srcdir)/uglib libuglib_a_CFLAGS = @PTHREAD_CFLAGS@ @LFS_CFLAGS@ @CURL_CFLAGS@ @GLIB_CFLAGS@ libuglib_a_SOURCES = \ UgStdio.c \ UgString.c \ UgThread.c \ UgSocket.c \ UgUtil.c \ UgFileUtil.c \ UgArray.c \ UgList.c \ UgSLink.c \ UgOption.c \ UgUri.c \ UgNode.c \ UgData.c \ UgInfo.c \ UgRegistry.c \ UgValue.c \ UgEntry.c \ UgBuffer.c \ UgJson.c \ UgJson-custom.c \ UgJsonFile.c \ UgJsonrpc.c \ UgJsonrpcSocket.c \ UgJsonrpcCurl.c \ UgHtml.c \ UgHtmlEntry.c \ UgHtmlFilter.c noinst_HEADERS = \ UgDefine.h \ UgStdio.h \ UgString.h \ UgThread.h \ UgSocket.h \ UgUtil.h \ UgFileUtil.h \ UgArray.h \ UgList.h \ UgSLink.h \ UgOption.h \ UgUri.h \ UgNode.h \ UgData.h \ UgInfo.h \ UgRegistry.h \ UgValue.h \ UgEntry.h \ UgBuffer.h \ UgJson.h \ UgJson-custom.h \ UgJsonFile.h \ UgJsonrpc.h \ UgJsonrpcSocket.h \ UgJsonrpcCurl.h \ UgHtml.h \ UgHtmlEntry.h \ UgHtmlFilter.h EXTRA_DIST = \ Android.mk \ CMakeLists.txt all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu uglib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu uglib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libuglib.a: $(libuglib_a_OBJECTS) $(libuglib_a_DEPENDENCIES) $(EXTRA_libuglib_a_DEPENDENCIES) $(AM_V_at)-rm -f libuglib.a $(AM_V_AR)$(libuglib_a_AR) libuglib.a $(libuglib_a_OBJECTS) $(libuglib_a_LIBADD) $(AM_V_at)$(RANLIB) libuglib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libuglib_a-UgStdio.o: UgStdio.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgStdio.o `test -f 'UgStdio.c' || echo '$(srcdir)/'`UgStdio.c libuglib_a-UgStdio.obj: UgStdio.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgStdio.obj `if test -f 'UgStdio.c'; then $(CYGPATH_W) 'UgStdio.c'; else $(CYGPATH_W) '$(srcdir)/UgStdio.c'; fi` libuglib_a-UgString.o: UgString.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgString.o `test -f 'UgString.c' || echo '$(srcdir)/'`UgString.c libuglib_a-UgString.obj: UgString.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgString.obj `if test -f 'UgString.c'; then $(CYGPATH_W) 'UgString.c'; else $(CYGPATH_W) '$(srcdir)/UgString.c'; fi` libuglib_a-UgThread.o: UgThread.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgThread.o `test -f 'UgThread.c' || echo '$(srcdir)/'`UgThread.c libuglib_a-UgThread.obj: UgThread.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgThread.obj `if test -f 'UgThread.c'; then $(CYGPATH_W) 'UgThread.c'; else $(CYGPATH_W) '$(srcdir)/UgThread.c'; fi` libuglib_a-UgSocket.o: UgSocket.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgSocket.o `test -f 'UgSocket.c' || echo '$(srcdir)/'`UgSocket.c libuglib_a-UgSocket.obj: UgSocket.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgSocket.obj `if test -f 'UgSocket.c'; then $(CYGPATH_W) 'UgSocket.c'; else $(CYGPATH_W) '$(srcdir)/UgSocket.c'; fi` libuglib_a-UgUtil.o: UgUtil.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgUtil.o `test -f 'UgUtil.c' || echo '$(srcdir)/'`UgUtil.c libuglib_a-UgUtil.obj: UgUtil.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgUtil.obj `if test -f 'UgUtil.c'; then $(CYGPATH_W) 'UgUtil.c'; else $(CYGPATH_W) '$(srcdir)/UgUtil.c'; fi` libuglib_a-UgFileUtil.o: UgFileUtil.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgFileUtil.o `test -f 'UgFileUtil.c' || echo '$(srcdir)/'`UgFileUtil.c libuglib_a-UgFileUtil.obj: UgFileUtil.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgFileUtil.obj `if test -f 'UgFileUtil.c'; then $(CYGPATH_W) 'UgFileUtil.c'; else $(CYGPATH_W) '$(srcdir)/UgFileUtil.c'; fi` libuglib_a-UgArray.o: UgArray.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgArray.o `test -f 'UgArray.c' || echo '$(srcdir)/'`UgArray.c libuglib_a-UgArray.obj: UgArray.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgArray.obj `if test -f 'UgArray.c'; then $(CYGPATH_W) 'UgArray.c'; else $(CYGPATH_W) '$(srcdir)/UgArray.c'; fi` libuglib_a-UgList.o: UgList.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgList.o `test -f 'UgList.c' || echo '$(srcdir)/'`UgList.c libuglib_a-UgList.obj: UgList.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgList.obj `if test -f 'UgList.c'; then $(CYGPATH_W) 'UgList.c'; else $(CYGPATH_W) '$(srcdir)/UgList.c'; fi` libuglib_a-UgSLink.o: UgSLink.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgSLink.o `test -f 'UgSLink.c' || echo '$(srcdir)/'`UgSLink.c libuglib_a-UgSLink.obj: UgSLink.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgSLink.obj `if test -f 'UgSLink.c'; then $(CYGPATH_W) 'UgSLink.c'; else $(CYGPATH_W) '$(srcdir)/UgSLink.c'; fi` libuglib_a-UgOption.o: UgOption.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgOption.o `test -f 'UgOption.c' || echo '$(srcdir)/'`UgOption.c libuglib_a-UgOption.obj: UgOption.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgOption.obj `if test -f 'UgOption.c'; then $(CYGPATH_W) 'UgOption.c'; else $(CYGPATH_W) '$(srcdir)/UgOption.c'; fi` libuglib_a-UgUri.o: UgUri.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgUri.o `test -f 'UgUri.c' || echo '$(srcdir)/'`UgUri.c libuglib_a-UgUri.obj: UgUri.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgUri.obj `if test -f 'UgUri.c'; then $(CYGPATH_W) 'UgUri.c'; else $(CYGPATH_W) '$(srcdir)/UgUri.c'; fi` libuglib_a-UgNode.o: UgNode.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgNode.o `test -f 'UgNode.c' || echo '$(srcdir)/'`UgNode.c libuglib_a-UgNode.obj: UgNode.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgNode.obj `if test -f 'UgNode.c'; then $(CYGPATH_W) 'UgNode.c'; else $(CYGPATH_W) '$(srcdir)/UgNode.c'; fi` libuglib_a-UgData.o: UgData.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgData.o `test -f 'UgData.c' || echo '$(srcdir)/'`UgData.c libuglib_a-UgData.obj: UgData.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgData.obj `if test -f 'UgData.c'; then $(CYGPATH_W) 'UgData.c'; else $(CYGPATH_W) '$(srcdir)/UgData.c'; fi` libuglib_a-UgInfo.o: UgInfo.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgInfo.o `test -f 'UgInfo.c' || echo '$(srcdir)/'`UgInfo.c libuglib_a-UgInfo.obj: UgInfo.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgInfo.obj `if test -f 'UgInfo.c'; then $(CYGPATH_W) 'UgInfo.c'; else $(CYGPATH_W) '$(srcdir)/UgInfo.c'; fi` libuglib_a-UgRegistry.o: UgRegistry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgRegistry.o `test -f 'UgRegistry.c' || echo '$(srcdir)/'`UgRegistry.c libuglib_a-UgRegistry.obj: UgRegistry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgRegistry.obj `if test -f 'UgRegistry.c'; then $(CYGPATH_W) 'UgRegistry.c'; else $(CYGPATH_W) '$(srcdir)/UgRegistry.c'; fi` libuglib_a-UgValue.o: UgValue.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgValue.o `test -f 'UgValue.c' || echo '$(srcdir)/'`UgValue.c libuglib_a-UgValue.obj: UgValue.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgValue.obj `if test -f 'UgValue.c'; then $(CYGPATH_W) 'UgValue.c'; else $(CYGPATH_W) '$(srcdir)/UgValue.c'; fi` libuglib_a-UgEntry.o: UgEntry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgEntry.o `test -f 'UgEntry.c' || echo '$(srcdir)/'`UgEntry.c libuglib_a-UgEntry.obj: UgEntry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgEntry.obj `if test -f 'UgEntry.c'; then $(CYGPATH_W) 'UgEntry.c'; else $(CYGPATH_W) '$(srcdir)/UgEntry.c'; fi` libuglib_a-UgBuffer.o: UgBuffer.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgBuffer.o `test -f 'UgBuffer.c' || echo '$(srcdir)/'`UgBuffer.c libuglib_a-UgBuffer.obj: UgBuffer.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgBuffer.obj `if test -f 'UgBuffer.c'; then $(CYGPATH_W) 'UgBuffer.c'; else $(CYGPATH_W) '$(srcdir)/UgBuffer.c'; fi` libuglib_a-UgJson.o: UgJson.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJson.o `test -f 'UgJson.c' || echo '$(srcdir)/'`UgJson.c libuglib_a-UgJson.obj: UgJson.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJson.obj `if test -f 'UgJson.c'; then $(CYGPATH_W) 'UgJson.c'; else $(CYGPATH_W) '$(srcdir)/UgJson.c'; fi` libuglib_a-UgJson-custom.o: UgJson-custom.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJson-custom.o `test -f 'UgJson-custom.c' || echo '$(srcdir)/'`UgJson-custom.c libuglib_a-UgJson-custom.obj: UgJson-custom.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJson-custom.obj `if test -f 'UgJson-custom.c'; then $(CYGPATH_W) 'UgJson-custom.c'; else $(CYGPATH_W) '$(srcdir)/UgJson-custom.c'; fi` libuglib_a-UgJsonFile.o: UgJsonFile.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonFile.o `test -f 'UgJsonFile.c' || echo '$(srcdir)/'`UgJsonFile.c libuglib_a-UgJsonFile.obj: UgJsonFile.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonFile.obj `if test -f 'UgJsonFile.c'; then $(CYGPATH_W) 'UgJsonFile.c'; else $(CYGPATH_W) '$(srcdir)/UgJsonFile.c'; fi` libuglib_a-UgJsonrpc.o: UgJsonrpc.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpc.o `test -f 'UgJsonrpc.c' || echo '$(srcdir)/'`UgJsonrpc.c libuglib_a-UgJsonrpc.obj: UgJsonrpc.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpc.obj `if test -f 'UgJsonrpc.c'; then $(CYGPATH_W) 'UgJsonrpc.c'; else $(CYGPATH_W) '$(srcdir)/UgJsonrpc.c'; fi` libuglib_a-UgJsonrpcSocket.o: UgJsonrpcSocket.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpcSocket.o `test -f 'UgJsonrpcSocket.c' || echo '$(srcdir)/'`UgJsonrpcSocket.c libuglib_a-UgJsonrpcSocket.obj: UgJsonrpcSocket.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpcSocket.obj `if test -f 'UgJsonrpcSocket.c'; then $(CYGPATH_W) 'UgJsonrpcSocket.c'; else $(CYGPATH_W) '$(srcdir)/UgJsonrpcSocket.c'; fi` libuglib_a-UgJsonrpcCurl.o: UgJsonrpcCurl.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpcCurl.o `test -f 'UgJsonrpcCurl.c' || echo '$(srcdir)/'`UgJsonrpcCurl.c libuglib_a-UgJsonrpcCurl.obj: UgJsonrpcCurl.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgJsonrpcCurl.obj `if test -f 'UgJsonrpcCurl.c'; then $(CYGPATH_W) 'UgJsonrpcCurl.c'; else $(CYGPATH_W) '$(srcdir)/UgJsonrpcCurl.c'; fi` libuglib_a-UgHtml.o: UgHtml.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtml.o `test -f 'UgHtml.c' || echo '$(srcdir)/'`UgHtml.c libuglib_a-UgHtml.obj: UgHtml.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtml.obj `if test -f 'UgHtml.c'; then $(CYGPATH_W) 'UgHtml.c'; else $(CYGPATH_W) '$(srcdir)/UgHtml.c'; fi` libuglib_a-UgHtmlEntry.o: UgHtmlEntry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtmlEntry.o `test -f 'UgHtmlEntry.c' || echo '$(srcdir)/'`UgHtmlEntry.c libuglib_a-UgHtmlEntry.obj: UgHtmlEntry.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtmlEntry.obj `if test -f 'UgHtmlEntry.c'; then $(CYGPATH_W) 'UgHtmlEntry.c'; else $(CYGPATH_W) '$(srcdir)/UgHtmlEntry.c'; fi` libuglib_a-UgHtmlFilter.o: UgHtmlFilter.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtmlFilter.o `test -f 'UgHtmlFilter.c' || echo '$(srcdir)/'`UgHtmlFilter.c libuglib_a-UgHtmlFilter.obj: UgHtmlFilter.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libuglib_a_CPPFLAGS) $(CPPFLAGS) $(libuglib_a_CFLAGS) $(CFLAGS) -c -o libuglib_a-UgHtmlFilter.obj `if test -f 'UgHtmlFilter.c'; then $(CYGPATH_W) 'UgHtmlFilter.c'; else $(CYGPATH_W) '$(srcdir)/UgHtmlFilter.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: uget-2.2.2/uglib/UgBuffer.h0000664000175000017500000001251713470304403012370 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_BUFFER_H #define UG_BUFFER_H #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // UgBuffer functions typedef struct UgBuffer UgBuffer; typedef int (*UgBufferFunc) (UgBuffer* buffer); void ug_buffer_init_external(UgBuffer* buffer, char* exbuf, int length); void ug_buffer_init(UgBuffer* buffer, int length); // If you use ug_buffer_init_external() to init UgBuffer, // you may not free, resize, or allocate buffer. void ug_buffer_clear(UgBuffer* buffer, int free_buffer); void ug_buffer_set_size(UgBuffer* buffer, int length); char* ug_buffer_alloc(UgBuffer* buffer, int length); // UgBuffer.more() default function for external buffer. int ug_buffer_restart(UgBuffer* buffer); // UgBuffer.more() default function for internal buffer. int ug_buffer_expand(UgBuffer* buffer); void ug_buffer_fill(UgBuffer* buffer, char ch, int count); // return number of bytes written int ug_buffer_write(UgBuffer* buffer, const char* string, int length); void ug_buffer_write_data(UgBuffer* buffer, const char* binary, int length); #define ug_buffer_length(buffer) (int)((buffer)->cur - (buffer)->beg) #define ug_buffer_allocated(buffer) (int)((buffer)->end - (buffer)->beg) #define ug_buffer_remain(buffer) (int)((buffer)->end - (buffer)->cur) #ifdef __cplusplus } #endif // This definition is used by UgBuffer::write(char ch) #ifdef __cplusplus inline void ug_buffer_write_char(UgBuffer* buffer, char ch); #endif // ---------------------------------------------------------------------------- // UgBuffer structure struct UgBuffer { char* beg; char* cur; char* end; // for writing: expand or flush buffer // for reading: expand or fill buffer // return > 0 if ok // return < 0 if error. // return = 0 if no more data (read) UgBufferFunc more; // flush/expand (write) or fill/expand (read) void* data; // extra data for UgBuffer.more() #ifdef __cplusplus // C++11 standard-layout inline void init(int length) { ug_buffer_init(this, length); } inline void init(char* exbuf, int length) { ug_buffer_init_external(this, exbuf, length); } // If you use ug_buffer_init_external() to init UgBuffer, // you may not free, resize, or allocate buffer. inline void clear(bool free_buffer) { ug_buffer_clear(this, free_buffer); } inline void setSize(int length) { ug_buffer_set_size(this, length); } inline char* alloc(int length) { return ug_buffer_alloc(this, length); } inline void fill(char ch, int count) { ug_buffer_fill(this, ch, count); } // return number of bytes written inline int write(const char* string, int length = -1) { return ug_buffer_write(this, string, length); } inline void write(char ch) { ug_buffer_write_char(this, ch); } inline void writeData(const char* binary, int length) { ug_buffer_write_data(this, binary, length); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C/C++ inline function #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__cplusplus) // C99 or C++ inline function #ifdef __cplusplus // C++ inline #else // C99 static inline #endif void ug_buffer_write_char(UgBuffer* buffer, char ch) { if ((buffer)->cur >= (buffer)->end) (buffer)->more(buffer); *(buffer)->cur++ = (char)(ch); } #else // C function void ug_buffer_write_char(UgBuffer* buffer, char ch); #endif // __STDC_VERSION__ || __cplusplus // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgBuffer Buffer; }; // namespace Ug #endif // __cplusplus #endif // UG_BUFFER_H uget-2.2.2/uglib/Android.mk0000664000175000017500000000120113470304403012407 00000000000000LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libuglib LOCAL_CPPFLAGS := -DNDEBUG LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/../curl/include LOCAL_SRC_FILES := \ UgStdio.c \ UgString.c \ UgThread.c \ UgSocket.c \ UgUtil.c \ UgFileUtil.c \ UgArray.c \ UgList.c \ UgSLink.c \ UgOption.c \ UgUri.c \ UgNode.c \ UgData.c \ UgInfo.c \ UgRegistry.c \ UgValue.c \ UgEntry.c \ UgBuffer.c \ UgJson.c \ UgJson-custom.c \ UgJsonFile.c \ UgJsonrpc.c \ UgJsonrpcSocket.c \ UgJsonrpcCurl.c \ UgHtml.c \ UgHtmlEntry.c \ UgHtmlFilter.c include $(BUILD_STATIC_LIBRARY) uget-2.2.2/uglib/UgArray.c0000664000175000017500000002371613470304403012233 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include // NULL #include #include #include #include #if defined(_MSC_VER) #define strtoll _strtoi64 #endif // ---------------------------------------------------------------------------- // UgArray: for UG_ENTRY_ARRAY void ug_array_init(void* arr, int element_size, int allocated_len) { UgArrayChar* array = arr; if (allocated_len) array->at = ug_malloc(element_size * allocated_len); else array->at = NULL; array->length = 0; array->allocated = allocated_len; array->element_size = element_size; } void ug_array_clear(void* arr) { UgArrayChar* array = arr; ug_free(array->at); array->at = NULL; array->length = 0; array->allocated = 0; } void* ug_array_alloc(void* arr, int nElements) { UgArrayChar* array = arr; int len; len = array->length + nElements; if (array->allocated < len) { array->allocated = len * 2; // if (array->allocated < 16) // array->allocated = 16; array->at = ug_realloc(array->at, array->allocated * array->element_size); } arr = array->at + array->length * array->element_size; array->length += nElements; return arr; } void ug_array_foreach(void* array, UgForeachFunc func, void* data) { char* cur; char* end; cur = ((UgArrayChar*)array)->at; end = cur + ((UgArrayChar*)array)->element_size * ((UgArrayChar*)array)->length; for (; cur < end; cur+= ((UgArrayChar*)array)->element_size) func(cur, data); } void ug_array_foreach_ptr(void* array, UgForeachFunc func, void* data) { char* cur = ((UgArrayChar*)array)->at; char* end = cur + ((UgArrayChar*)array)->element_size * ((UgArrayChar*)array)->length; for (; cur < end; cur+= ((UgArrayChar*)array)->element_size) func(*(void**)cur, data); } void* ug_array_find_sorted(void* array, const void* key, UgCompareFunc compare, int* inserted_index) { int low; int cur; int high; int diff; void* cur_key; low = 0; cur = 0; high = ((UgArrayChar*)array)->length; while (low < high) { // cur = low + ((high - low) / 2); cur = low + ((high - low) >> 1); cur_key = ((UgArrayChar*)array)->at + cur * ((UgArrayChar*)array)->element_size; diff = compare(cur_key, key); if (diff == 0) { if (inserted_index) inserted_index[0] = cur; return ((UgArrayChar*)array)->at + cur * ((UgArrayChar*)array)->element_size; } else if (diff > 0) high = cur; else if (diff < 0) low = cur + 1; } if (inserted_index) { if (cur < low) cur++; inserted_index[0] = cur; } return NULL; } #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) // C99 or C++ inline functions in UgArray.h #else void* ug_array_insert(void* array, int index, int length) { char* addr; ug_array_alloc(array, length); memmove(ug_array_addr(array, index + length), addr = ug_array_addr(array, index), ug_array_count(array, ug_array_length(array) - index - 1)); return (void*)addr; } void ug_array_erase(void* array, int index, int length) { memmove(ug_array_addr(array, index), ug_array_addr(array, index + length), ug_array_count(array, ug_array_length(array) - index - 1)); ((UgArrayChar*)array)->length -= length; } void ug_array_sort(void* array, UgCompareFunc compare) { qsort( ((UgArrayChar*)array)->at, ((UgArrayChar*)array)->length, ((UgArrayChar*)array)->element_size, compare); } #endif // __STDC_VERSION__ int ug_array_compare_int(const void *s1, const void *s2) { return *(int*)s1 - *(int*)s2; } int ug_array_compare_string(const void *s1, const void *s2) { return strcmp(*(char**)s1, *(char**)s2); } int ug_array_compare_pointer(const void *s1, const void *s2) { return *(char**)s1 - *(char**)s2; } // ---------------------------------------------------------------------------- // UgJsonParseFunc for JSON array elements UgJsonError ug_json_parse_array_bool(UgJson* json, const char* name, const char* value, void* array, void* none) { int boolValue; if (json->type != UG_JSON_TRUE && json->type != UG_JSON_FALSE) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } if (json->type == UG_JSON_TRUE) boolValue = TRUE; else boolValue = FALSE; ((UgArrayInt*)array)->element_size = sizeof(int); *((int*) ug_array_alloc(array, 1)) = boolValue; return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_array_int(UgJson* json, const char* name, const char* value, void* array, void* none) { if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } ((UgArrayInt*)array)->element_size = sizeof(int); *((int*) ug_array_alloc(array, 1)) = strtol(value, NULL, 10); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_array_uint(UgJson* json, const char* name, const char* value, void* array, void* none) { if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } ((UgArrayInt*)array)->element_size = sizeof(unsigned int); *((unsigned int*) ug_array_alloc(array, 1)) = strtoul(value, NULL, 10); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_array_int64(UgJson* json, const char* name, const char* value, void* array, void* none) { if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } ((UgArrayInt*)array)->element_size = sizeof(int64_t); *((int64_t*) ug_array_alloc(array, 1)) = strtoll(value, NULL, 10); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_array_double(UgJson* json, const char* name, const char* value, void* array, void* none) { if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } ((UgArrayInt*)array)->element_size = sizeof(double); *((double*) ug_array_alloc(array, 1)) = strtod(value, NULL); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_array_string(UgJson* json, const char* name, const char* value, void* array, void* none) { char* string; if (json->type == UG_JSON_STRING) string = ug_strdup(value); else if (json->type == UG_JSON_NULL) string = NULL; else { // if (json->type >= UG_JSON_OBJECT) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } ((UgArrayInt*)array)->element_size = sizeof(char*); *((char**) ug_array_alloc(array, 1)) = string; return UG_JSON_ERROR_NONE; } // ---------------------------------------------------------------------------- // write JSON array elements void ug_json_write_array_bool(UgJson* json, UgArrayInt* array) { // UgArrayInt* array = src; int index; for (index = 0; index < array->length; index++) ug_json_write_bool(json, array->at[index]); } void ug_json_write_array_int(UgJson* json, UgArrayInt* array) { // UgArrayInt* array = src; int index; for (index = 0; index < array->length; index++) ug_json_write_int(json, array->at[index]); } void ug_json_write_array_uint(UgJson* json, UgArrayUint* array) { int index; for (index = 0; index < array->length; index++) ug_json_write_uint(json, array->at[index]); } void ug_json_write_array_int64(UgJson* json, UgArrayInt64* array) { int index; for (index = 0; index < array->length; index++) ug_json_write_int64(json, array->at[index]); } void ug_json_write_array_double(UgJson* json, UgArrayDouble* array) { int index; for (index = 0; index < array->length; index++) ug_json_write_double(json, array->at[index]); } void ug_json_write_array_string(UgJson* json, UgArrayStr* array) { int index; char* string; for (index = 0; index < array->length; index++) { string = array->at[index]; if (string == NULL) ug_json_write_null(json); else ug_json_write_string(json, string); } } uget-2.2.2/uglib/UgJsonFile.h0000664000175000017500000000512213470304403012662 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_JSON_FILE_H #define UG_JSON_FILE_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgJsonFile UgJsonFile; // ---------------------------------------------------------------------------- // UgJsonFile: JSON file loader and writer struct UgJsonFile { UgJson json; UgBuffer buffer; int fd; int n_bytes; char bytes[1]; }; UgJsonFile* ug_json_file_new (int buffer_size); void ug_json_file_free (UgJsonFile* jfile); // return TRUE or FALSE int ug_json_file_begin_parse (UgJsonFile* jfile, const char* filename); int ug_json_file_begin_write (UgJsonFile* jfile, const char* filename, UgJsonFormat format); int ug_json_file_begin_parse_fd (UgJsonFile* jfile, int fd); int ug_json_file_begin_write_fd (UgJsonFile* jfile, int fd, UgJsonFormat format); UgJsonError ug_json_file_end_parse (UgJsonFile* jfile); void ug_json_file_end_write (UgJsonFile* jfile); #ifdef __cplusplus } #endif #endif // UG_JSON_FILE_H uget-2.2.2/uglib/UgHtmlFilter.h0000664000175000017500000000620313470304403013224 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_HTML_FILTER_H #define UG_HTML_FILTER_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgHtmlFilter UgHtmlFilter; typedef struct UgHtmlFilterTag UgHtmlFilterTag; typedef void (*UgHtmlFilterTagFunc) (UgHtmlFilterTag* tag, const char* value, void* user_data); // ---------------------------------------------------------------------------- // UgHtmlFilter struct UgHtmlFilter { UgHtml html; char* base_href; char* charset; const char* element_name; UgList tags; }; UgHtmlFilter* ug_html_filter_new (void); void ug_html_filter_free (UgHtmlFilter* filter); void ug_html_filter_add_tag (UgHtmlFilter* filter, UgHtmlFilterTag* tag); int ug_html_filter_parse_file (UgHtmlFilter* filter, const char* file_utf8); // ---------------------------------------------------------------------------- // UgHtmlFilterTag struct UgHtmlFilterTag { UG_LINK_MEMBERS (UgHtmlFilterTag, UgHtmlFilterTag, self); // UgHtmlFilterTag* self; // UgHtmlFilterTag* next; // UgHtmlFilterTag* prev; int ref_count; char* tag_name; // element name char* attr_name; // attribute name UgList attr_values; // attribute values, string list UgHtmlFilter* filter; // callback UgHtmlFilterTagFunc callback; void* callback_data; }; UgHtmlFilterTag* ug_html_filter_tag_new (char* element_name, char* attr_name); void ug_html_filter_tag_ref (UgHtmlFilterTag* tag); void ug_html_filter_tag_unref (UgHtmlFilterTag* tag); #ifdef __cplusplus } #endif #endif // UG_HTML_FILTER_H uget-2.2.2/uglib/UgThread.h0000664000175000017500000000714013470304403012362 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_THREAD_H #define UG_THREAD_H #include #include #ifdef __cplusplus extern "C" { #endif #if defined _WIN32 || defined _WIN64 typedef uintptr_t UgThread; typedef void* UgMutex; typedef unsigned UgThreadResult; // This function must return UG_THREAD_RESULT typedef UgThreadResult (*UgThreadFunc)(void*); #define UG_THREAD_RESULT 0 #define UG_THREAD_OK 0 // ug_thread_create() and ug_thread_join() return UG_THREAD_OK if successful int ug_thread_create(UgThread* thread, UgThreadFunc func, void* data); int ug_thread_join (UgThread* thread); void ug_thread_unjoin(UgThread* thread); UgThread ug_thread_self (void); // mutex ------ void ug_mutex_init (UgMutex* mutex); void ug_mutex_clear (UgMutex* mutex); void ug_mutex_lock (UgMutex* mutex); void ug_mutex_unlock(UgMutex* mutex); //#elif defined(HAVE_PTHREAD) #else #include typedef pthread_t UgThread; typedef pthread_mutex_t UgMutex; typedef void* UgThreadResult; // This function must return UG_THREAD_RESULT typedef UgThreadResult (*UgThreadFunc)(void*); #define UG_THREAD_RESULT NULL #define UG_THREAD_OK 0 // ug_thread_create() and ug_thread_join() return UG_THREAD_OK if successful #define ug_thread_create(thread, func, data) \ pthread_create(thread, NULL, func, data) #define ug_thread_join(thread) \ pthread_join(*(thread), NULL) #define ug_thread_unjoin(thread) \ pthread_detach(*(thread)) #define ug_thread_self pthread_self // mutex ------ // void ug_mutex_init(UgMutex* mutex); #define ug_mutex_init(mutex) pthread_mutex_init(mutex, NULL) // void ug_mutex_clear(UgMutex* mutex); #define ug_mutex_clear(mutex) pthread_mutex_destroy(mutex) // void ug_mutex_lock(UgMutex* mutex); #define ug_mutex_lock(mutex) pthread_mutex_lock(mutex) // void ug_mutex_unlock(UgMutex* mutex); #define ug_mutex_unlock(mutex) pthread_mutex_unlock(mutex) #endif // _WIN32 || _WIN64 #ifdef __cplusplus } #endif #endif // UG_THREAD_H uget-2.2.2/uglib/UgDefine.h0000664000175000017500000000537513470304403012355 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_DEFINE_H #define UG_DEFINE_H #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include #define ug_malloc g_malloc #define ug_malloc0 g_malloc0 #define ug_realloc g_realloc #define ug_free g_free #else #include // malloc, calloc, free #define ug_malloc malloc #define ug_malloc0(size) calloc (1, size) #define ug_realloc realloc #define ug_free free #endif #ifdef __cplusplus extern "C" { #endif typedef void (*UgInitFunc) (void* instance); typedef void (*UgFinalFunc) (void* instance); typedef void* (*UgCreateFunc) (void); typedef void (*UgDeleteFunc) (void* instance); typedef void (*UgNotifyFunc) (void* user_data); typedef void (*UgForeachFunc)(void* instance, void* data); typedef int (*UgCompareFunc)(const void* a, const void* b); #if defined _WIN32 || defined _WIN64 #define UG_DIR_SEPARATOR '\\' #define UG_DIR_SEPARATOR_S "\\" #else #define UG_DIR_SEPARATOR '/' #define UG_DIR_SEPARATOR_S "/" #endif // _WIN32 || _WIN64 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifdef __cplusplus } #endif #endif // UG_DEFINE_H uget-2.2.2/uglib/UgString.c0000664000175000017500000002046013470304403012414 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include // vsnprintf #include #include #include // ---------------------------------------------------------------------------- // String #if !(defined HAVE_GLIB) char* ug_strdup_printf (const char* format, ...) { va_list arg_list; char* string; int string_len; va_start (arg_list, format); #ifdef _MSC_VER /* for MS C only */ string_len = _vscprintf (format, arg_list); #else /* for C99 standard */ string_len = vsnprintf (NULL, 0, format, arg_list); #endif va_end (arg_list); string = ug_malloc (string_len + 1); va_start (arg_list, format); vsprintf (string, format, arg_list); va_end (arg_list); return string; } char* ug_strndup (const char* string, size_t length) { char* result; result = ug_malloc (length + 1); result[length] = 0; strncpy (result, string, length); return result; } #endif // ! (HAVE_GLIB) // return length of new string int ug_str_remove_crlf (const char* src, char* dest) { return ug_str_remove_chars (src, dest, "\r\n"); } // return length of new string int ug_str_remove_chars (const char* src, char* dest, const char* chars) { const char* cur; int length = 0; if (src) { for (; ; src++) { for (cur = chars; cur[0]; cur++) { if (src[0] == cur[0]) break; } if (cur[0] != 0) continue; if (dest) *dest++ = *src; if (src[0] == 0) break; length++; } } return length; } // return number of characters was replaced by to_char int ug_str_replace_chars (char* str, const char* from_chars, int to_char) { int counts; for (counts = 0; ; counts++) { str = strpbrk (str, from_chars); if (str == NULL) break; str[0] = to_char; } return counts; } /* * convert double to string * If value large than 1024, it will append unit string like "KiB", * "MiB", "GiB", "TiB", or "PiB" to string. */ char* ug_str_from_int_unit (int64_t value, const char* tail) { static const char* unit_array[] = {"", " KiB", " MiB", " GiB", " TiB", " PiB"}; static const int unit_array_len = sizeof (unit_array) / sizeof (char*); int index; for (index=0; index < unit_array_len -1; index++) { // if (value < 1024) if (value < 10000) break; // value /= 1024; value >>= 10; } return ug_strdup_printf ("%d%s%s", (int)value, unit_array[index], (tail) ? tail : ""); } /* * convert seconds to string (hh:mm:ss) */ char* ug_str_from_seconds (int seconds, int limit_99_99_99) { int hour, minute; int day, year; minute = seconds / 60; hour = minute / 60; minute = minute % 60; seconds = seconds % 60; if (hour < 100) return ug_strdup_printf ("%.2d:%.2d:%.2d", hour, minute, seconds); else if (limit_99_99_99) return ug_strdup ("99:99:99"); else { day = hour / 24; year = day / 365; if (year) return ug_strdup ("> 1 year"); else return ug_strdup_printf ("%u days", day); } } /* * convert time_t to string */ char* ug_str_from_time (time_t ptt, int date_only) { struct tm* timem; timem = localtime (&ptt); if (timem == NULL) return NULL; if (date_only) { return ug_strdup_printf ("%.4d-%.2d-%.2d", timem->tm_year + 1900, timem->tm_mon + 1, timem->tm_mday); } else { return ug_strdup_printf ("%.4d-%.2d-%.2d" " %.2d:%.2d:%.2d", timem->tm_year + 1900, timem->tm_mon + 1, timem->tm_mday, timem->tm_hour, timem->tm_min, timem->tm_sec); } } static const char* month_string[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; time_t ug_str_rfc822_to_time (const char* string) { struct tm timem; const char* cur; const char* end; int idx; end = string + strlen (string); // day if ((cur = string + 5) >= end) return -1; timem.tm_mday = strtoul (cur, NULL, 10); // month if ((cur += 3) >= end) return -1; for (idx = 0; idx < 12; idx++) { if (strncmp (cur, month_string[idx], 3) == 0) break; } if (idx == 12) return -1; timem.tm_mon = idx; // year if ((cur += 4) >= end) return -1; timem.tm_year = strtoul (cur, NULL, 10); // if (timem.tm_year < 50) // timem.tm_year += 100; // else if (timem.tm_year > 1000) timem.tm_year -= 1900; if ((cur = strchr (cur, ' ')) == NULL) return -1; cur++; // hour timem.tm_hour = strtoul (cur, NULL, 10); // minute if ((cur += 3) >= end) return -1; timem.tm_min = strtoul (cur, NULL, 10); // second if ((cur += 3) >= end) return -1; timem.tm_sec = strtoul (cur, NULL, 10); // zone // if ((cur += 3) >= end) // return -1; // other timem.tm_wday = 0; timem.tm_yday = 0; timem.tm_isdst = -1; return mktime (&timem); } time_t ug_str_rfc3339_to_time (const char* string) { struct tm timem; const char* cur; const char* end; end = string + strlen (string); // year timem.tm_year = strtoul (string, NULL, 10); timem.tm_year -= 1900; if ((cur = strchr (string, '-')) == NULL) return -1; cur++; // month timem.tm_mon = strtoul (cur, NULL, 10); if (timem.tm_mon > 0) timem.tm_mon -= 1; // day if ((cur += 3) >= end) return -1; timem.tm_mday = strtoul (cur, NULL, 10); // hour if ((cur += 3) >= end) return -1; timem.tm_hour = strtoul (cur, NULL, 10); // minute if ((cur += 3) >= end) return -1; timem.tm_min = strtoul (cur, NULL, 10); // second if ((cur += 3) >= end) return -1; timem.tm_sec = strtoul (cur, NULL, 10); // zone if ((cur = strpbrk (cur, "+-")) == NULL) return -1; // other timem.tm_wday = 0; timem.tm_yday = 0; timem.tm_isdst = -1; return mktime (&timem); } // ------------------------------------ // command-line char** ug_argv_from_cmd (const char* cmd, int* argc, int reserve_len) { int argn; char** argv; char* buf; char* beg; char* cur; char* end; char* quote = NULL; // pointer to '\"' for (argn = 0, cur = (char*)cmd; ; argn++) { if (cur[0] == 0) { end = cur; break; } while (cur[0] != ' ' && cur[0]) cur++; while (cur[0] == ' ') cur++; } // malloc size include buffer and null-terminated argv = ug_malloc (sizeof (char*) * (argn+2+reserve_len)); buf = ug_strdup (cmd); end = buf + (end - cmd); // argv[-1] == buf *argv++ = buf; for (argn = reserve_len, beg = buf, cur = buf; cur[0]; ) { switch (cur[0]) { default: cur++; break; case '\"': // overwrite '\"', must include null-terminated memmove (cur, cur+1, end - cur); if (quote == NULL) quote = cur; else quote = NULL; break; case ' ': if (quote == NULL) { argv[argn++] = beg; while (cur[0] == ' ') *cur++ = 0; beg = cur; } break; } } if (beg[0]) argv[argn++] = beg; if (argc) argc[0] = argn; argv[argn++] = NULL; // null-termainate return argv; } void ug_argv_free (char** ug_argv) { ug_free (ug_argv[-1]); ug_free (ug_argv-1); } uget-2.2.2/uglib/UgRegistry.c0000664000175000017500000000576713470304403012773 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include void ug_registry_init(UgRegistry* reg) { ug_array_init(reg, sizeof(UgPair), 16); reg->sorted = FALSE; } void ug_registry_final(UgRegistry* reg) { ug_array_clear(reg); } void ug_registry_add(UgRegistry* reg, const void* typeinfo) { UgPair* pair; int index; if (reg->sorted == FALSE || reg->length == 0) pair = ug_array_alloc(reg, 1); else { pair = ug_registry_find(reg, ((UgTypeInfo*)typeinfo)->name, &index); if (pair == NULL) pair = ug_array_insert(reg, index, 1); } pair->key = (void*) ((UgTypeInfo*)typeinfo)->name; pair->data = (void*) typeinfo; } void ug_registry_remove(UgRegistry* reg, const void* typeinfo) { UgPair* cur; int index; cur = ug_registry_find(reg, ((UgTypeInfo*)typeinfo)->name, &index); if (cur) ug_array_erase(reg, index, 1); } UgPair* ug_registry_find(UgRegistry* reg, const char* key, int* inserted_index) { UgPair* cur; UgPair* end; if (reg->sorted == FALSE) { cur = reg->at; end = reg->at + reg->length; for (; cur < end; cur++) { if (strcmp(cur->key, key) == 0) { if (inserted_index) inserted_index[0] = cur - reg->at; return cur; } } return NULL; } return ug_array_find_sorted(reg, &key, ug_array_compare_string, inserted_index); } void ug_registry_sort(UgRegistry* reg) { ug_array_sort(reg, ug_array_compare_string); reg->sorted = TRUE; } uget-2.2.2/uglib/UgUtil.h0000664000175000017500000000705713470304403012077 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_UTIL_H #define UG_UTIL_H #include #include #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // Time uint64_t ug_get_time_count (void); // ---------------------------------------------------------------------------- // Unicode int ug_utf8_get_invalid (const char* input, char* ch); uint16_t* ug_utf8_to_utf16 (const char* string, int stringLength, int* utf16len); char* ug_utf16_to_utf8 (const uint16_t* string, int stringLength, int* utf8len); uint32_t* ug_utf8_to_ucs4 (const char* string, int stringLength, int* ucs4len); char* ug_ucs4_to_utf8 (const uint32_t* string, int stringLength, int* utf8len); // ---------------------------------------------------------------------------- // Base64 char* ug_base64_encode (const unsigned char* data, int input_length, int* output_length); unsigned char* ug_base64_decode (const char* data, int input_length, int* output_length); // ---------------------------------------------------------------------------- // filename & path functions char* ug_build_filename (const char* first_element, ...); // ---------------------------------------------------------------------------- // Power Management // Suspend does not turn off your computer. It puts the computer and all peripherals on a low power consumption mode. // Hibernate saves the state of your computer to the hard disk and completely powers off. void ug_reboot (void); void ug_shutdown (void); void ug_suspend (void); void ug_hibernate (void); // ---------------------------------------------------------------------------- // Others char* ug_sys_release (void); #ifdef __cplusplus } #endif #endif // End of UG_UTIL_H uget-2.2.2/uglib/UgJsonFile.c0000664000175000017500000001060313470304403012655 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include static int buffer_to_fd (UgBuffer* buffer); UgJsonFile* ug_json_file_new (int buffer_size) { UgJsonFile* jfile; if (buffer_size == 0) buffer_size = 4096; if (buffer_size == 0) jfile = ug_malloc (sizeof (UgJsonFile)); else jfile = ug_malloc (sizeof (UgJsonFile) + sizeof (char) * buffer_size - 1); jfile->fd = -1; jfile->n_bytes = buffer_size; ug_json_init (&jfile->json); return jfile; } void ug_json_file_free (UgJsonFile* jfile) { if (jfile->fd != -1) ug_close (jfile->fd); ug_json_final (&jfile->json); ug_free (jfile); } int ug_json_file_begin_parse (UgJsonFile* jfile, const char* path) { int fd; // fd = open (path, O_RDONLY, 0); fd = ug_open (path, UG_O_RDONLY | UG_O_TEXT, 0); if (fd == -1) return FALSE; return ug_json_file_begin_parse_fd (jfile, fd); } int ug_json_file_begin_write (UgJsonFile* jfile, const char* path, UgJsonFormat format) { int fd; // fd = open (path, O_CREAT | O_WRONLY | O_TRUNC, // S_IREAD | S_IWRITE | S_IRGRP | S_IROTH); fd = ug_open (path, UG_O_CREAT | UG_O_WRONLY | UG_O_TRUNC | UG_O_TEXT, UG_S_IREAD | UG_S_IWRITE | UG_S_IRGRP | UG_S_IROTH); if (fd == -1) return FALSE; return ug_json_file_begin_write_fd (jfile, fd, format); } int ug_json_file_begin_parse_fd (UgJsonFile* jfile, int fd) { jfile->fd = fd; // ready to parse ug_json_begin_parse (&jfile->json); return TRUE; } int ug_json_file_begin_write_fd (UgJsonFile* jfile, int fd, UgJsonFormat format) { jfile->fd = fd; // init UgBuffer for writer ug_buffer_init_external (&jfile->buffer, jfile->bytes, jfile->n_bytes); jfile->buffer.data = (void*)(uintptr_t) jfile->fd; jfile->buffer.more = buffer_to_fd; // ready to write ug_json_begin_write (&jfile->json, format, &jfile->buffer); return TRUE; } UgJsonError ug_json_file_end_parse (UgJsonFile* jfile) { UgJsonError error; int len; do { len = ug_read (jfile->fd, &jfile->bytes, jfile->n_bytes); error = ug_json_parse (&jfile->json, jfile->bytes, len); if (error < 0) goto exit; } while (len > 0); error = ug_json_end_parse (&jfile->json); exit: ug_close (jfile->fd); jfile->fd = -1; return error; } void ug_json_file_end_write (UgJsonFile* jfile) { ug_json_end_write (&jfile->json); ug_buffer_clear (&jfile->buffer, FALSE); ug_write (jfile->fd, "\n\n", 2); // close() doesn't call fsync() // If you want to avoid delayed write, call fsync() before close() ug_sync (jfile->fd); ug_close (jfile->fd); jfile->fd = -1; } // ---------------------------------------------------------------------------- // static function for ug_json_file_save // UgBufferFunc static int buffer_to_fd (UgBuffer* buffer) { int fd; fd = (uintptr_t)buffer->data; ug_write (fd, buffer->beg, ug_buffer_length (buffer)); buffer->cur = buffer->beg; return 0; } uget-2.2.2/uglib/UgJsonrpcSocket.c0000664000175000017500000001576413470304403013750 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #if defined _WIN32 || defined _WIN64 static int global_ref_count = 0; #endif void ug_jsonrpc_socket_init (UgJsonrpcSocket* jrsock) { #if defined _WIN32 || defined _WIN64 WSADATA WSAData; if (global_ref_count == 0) WSAStartup (MAKEWORD (2, 2), &WSAData); global_ref_count++; #endif // _WIN32 || _WIN64 ug_buffer_init (&jrsock->buffer, 4096); ug_json_init (&jrsock->json); ug_jsonrpc_init (&jrsock->rpc, &jrsock->json, &jrsock->buffer); jrsock->socket = INVALID_SOCKET; jrsock->rpc.send.func = (UgJsonrpcFunc) ug_jsonrpc_socket_send; jrsock->rpc.send.data = jrsock; jrsock->rpc.receive.func = (UgJsonrpcFunc) ug_jsonrpc_socket_receive; jrsock->rpc.receive.data = jrsock; } void ug_jsonrpc_socket_final (UgJsonrpcSocket* jrsock) { closesocket (jrsock->socket); jrsock->socket = INVALID_SOCKET; ug_json_final (&jrsock->json); ug_jsonrpc_clear (&jrsock->rpc); ug_buffer_clear (&jrsock->buffer, TRUE); #if defined _WIN32 || defined _WIN64 global_ref_count--; if (global_ref_count == 0) WSACleanup (); #endif } void ug_jsonrpc_socket_close (UgJsonrpcSocket* jrsock) { closesocket (jrsock->socket); jrsock->socket = INVALID_SOCKET; } int ug_jsonrpc_socket_connect (UgJsonrpcSocket* jrsock, const char* addr, const char* port_or_serv) { SOCKET fd; if (jrsock->socket != INVALID_SOCKET) return FALSE; fd = socket (AF_INET, SOCK_STREAM, 0); if (fd == INVALID_SOCKET) return FALSE; if (ug_socket_connect (fd, addr, port_or_serv) == SOCKET_ERROR) { closesocket (fd); return FALSE; } jrsock->socket = fd; return TRUE; } #if !(defined _WIN32 || defined _WIN64) int ug_jsonrpc_socket_connect_unix (UgJsonrpcSocket* jrsock, const char* path, int path_len) { int fd; if (jrsock->socket != INVALID_SOCKET) return FALSE; fd = socket (AF_UNIX, SOCK_STREAM, 0); if (fd == -1) return FALSE; if (ug_socket_connect_unix (fd, path, path_len) < 0) { close (fd); return FALSE; } jrsock->socket = fd; return TRUE; } #endif // ! (_WIN32 || _WIN64) int ug_jsonrpc_socket_send (UgJsonrpcSocket* jrsock) { int n; n = send (jrsock->socket, jrsock->buffer.beg, jrsock->buffer.cur - jrsock->buffer.beg, 0); jrsock->buffer.cur = jrsock->buffer.beg; if (n == -1) return -1; return n; } int ug_jsonrpc_socket_receive (UgJsonrpcSocket* jrsock) { int length; int buffer_size; int error; int receive_size = 0; buffer_size = jrsock->buffer.end - jrsock->buffer.beg; do { // if connection was closed, read()/recv()/recvXXX() will return zero. length = recv (jrsock->socket, jrsock->buffer.beg, buffer_size, 0); if (length == -1) return -1; error = ug_json_parse (&jrsock->json, jrsock->buffer.beg, length); if (error < 0 || jrsock->rpc.error == 0) jrsock->rpc.error = error; receive_size += length; } while (length == buffer_size); return receive_size; } // ---------------------------------------------------------------------------- // Server API // ------------------------------------ // one thread handle all connection static void on_receiving_all (UgSocketServer* server, SOCKET client_fd, void* data) { UgJsonrpcSocket* jrsock; UgJsonrpcServerFunc callback; jrsock = data; jrsock->socket = client_fd; callback = server->user.data3; callback (&jrsock->rpc, server->user.data, server->user.data2); } void ug_jsonrpc_socket_use_server (UgJsonrpcSocket* jrsock, UgSocketServer* server, UgJsonrpcServerFunc callback, void* data, void* data2) { server->user.data = data; server->user.data2 = data2; server->user.data3 = callback; ug_socket_server_set_receiver (server, on_receiving_all, jrsock); } // ------------------------------------ // one thread handle one connection struct UgJsonrpcSocketThread { UG_JSONRPC_SOCKET_MEMBERS; // UgJson json; // UgJsonrpc rpc; // UgBuffer buffer; // int socket; UgSocketServer* server; UgThread thread; }; static UgThreadResult jrpc_thread (struct UgJsonrpcSocketThread* jrst) { UgSocketServer* server; UgJsonrpcServerFunc callback; server = jrst->server; callback = server->user.data3; callback (&jrst->rpc, server->user.data, server->user.data2); ug_jsonrpc_socket_final ((UgJsonrpcSocket*) jrst); ug_free (jrst); ug_socket_server_unref (server); // ref() on on_accepted() return UG_THREAD_RESULT; } static void on_receiving (UgSocketServer* server, SOCKET client_fd, void* data) { struct UgJsonrpcSocketThread* jrst; ug_socket_server_ref (server); // unref() on service_thread() // create UgJsonrpcSocket to accept JSON-RPC request jrst = ug_malloc (sizeof (struct UgJsonrpcSocketThread)); ug_jsonrpc_socket_init ((UgJsonrpcSocket*) jrst); jrst->socket = client_fd; jrst->server = server; ug_thread_create (&jrst->thread, (UgThreadFunc) jrpc_thread, jrst); ug_thread_unjoin (&jrst->thread); } void ug_socket_server_run_jsonrpc (UgSocketServer* server, UgJsonrpcServerFunc callback, void* data, void* data2) { server->user.data = data; server->user.data2 = data2; server->user.data3 = callback; ug_socket_server_set_receiver (server, on_receiving, NULL); ug_socket_server_start (server); } uget-2.2.2/uglib/UgHtmlEntry.h0000664000175000017500000001135013470304403013077 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_HTML_ENTRY_H #define UG_HTML_ENTRY_H #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- typedef struct UgHtmlEntry UgHtmlEntry; struct UgHtmlEntry { char* name; int offset; const UgHtmlParser* parser; void* param1; void* param2; }; // parser for UgHtmlEntry extern const UgHtmlParser ug_html_parser_entry; void ug_html_start_element_entry (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* entry); /* UgHtmlEntry.name = element_name UgHtmlEntry.offset = offset of structure if UgHtmlEntry.parser == NULL, this entry is null-terminated. if UgHtmlEntry.name == NULL, it can match any name. it usually uses at first or last entry. if UgHtmlEntry.parser == ug_html_parser_custom UgEntry.param1 = start element function (UgHtmlParserStartElementFunc) UgEntry.param2 = custom writer function UgHtmlEntry.parser == ug_html_parser_int, ug_html_parser_string...etc UgHtmlEntry.param2 = UgHtmlEntry for attribute UgHtmlEntry.parser == ug_html_parser_string If you don't want to output anything when string value is NULL, set NULL at UgHtmlEntry.param1. UgHtmlEntry.param2 = UgHtmlEntry for attribute UgHtmlEntry.parser == ug_html_parser_entry UgHtmlEntry.param1 = UgHtmlEntry UgHtmlEntry.param2 = UgHtmlEntry for attribute */ // ------------------------------------ // parser for unknown element extern const UgHtmlParser ug_html_parser_unknown; void ug_html_start_element_unknown (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data); void ug_html_end_element_unknown (UgHtml* uhtml, const char* element_name, void* dest, void* data); // ------------------------------------ // parser for C type extern const UgHtmlParser ug_html_parser_bool; extern const UgHtmlParser ug_html_parser_int; extern const UgHtmlParser ug_html_parser_uint; extern const UgHtmlParser ug_html_parser_int64; extern const UgHtmlParser ug_html_parser_uint64; extern const UgHtmlParser ug_html_parser_double; extern const UgHtmlParser ug_html_parser_string; extern const UgHtmlParser ug_html_parser_custom; // ------------------------------------ // parser for time_t. // RFC3339: 2012-05-23T18:30:00.000-05:00 // 2013-09-12T22:50:20+08:00 // RFC822: Sat, 07 Sep 2002 00:00:01 GMT extern const UgHtmlParser ug_html_parser_time_rfc822; extern const UgHtmlParser ug_html_parser_time_rfc3339; #ifdef __cplusplus } #endif #endif // UG_HTML_ENTRY_H uget-2.2.2/uglib/UgData.c0000664000175000017500000001063713470304403012024 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include // g_slice_xxx #endif #include #include #include // ---------------------------------------------------------------------------- // UgTypeInfo // | // +-- UgDataInfo void* ug_type_new(const void* typeinfo) { UgInitFunc init; UgType* type; #ifdef HAVE_GLIB type = g_slice_alloc0(((UgTypeInfo*)typeinfo)->size); #else type = ug_malloc0(((UgTypeInfo*)typeinfo)->size); #endif // HAVE_GLIB type->info = typeinfo; init = type->info->init; if (init) init(type); return type; } void ug_type_free(void* type) { UgFinalFunc final; final = ((UgType*)type)->info->final; if (final) final(type); #ifdef HAVE_GLIB g_slice_free1(((UgType*)type)->info->size, type); #else ug_free(type); #endif // HAVE_GLIB } void ug_type_init(void* type) { UgInitFunc init; init = ((UgType*)type)->info->init; if (init) init(type); } void ug_type_final(void* type) { UgFinalFunc final; final = ((UgType*)type)->info->final; if (final) final(type); } // ---------------------------------------------------------------------------- // UgData // UgData* ug_data_copy(UgData* data) void* ug_data_copy(void* data) { const UgDataInfo* info; UgInitFunc init; UgAssignFunc assign; void* newone; if (data) { info = ((UgData*)data)->info; init = info->init; assign = info->assign; if (assign) { #ifdef HAVE_GLIB newone = g_slice_alloc0(info->size); #else newone = ug_malloc0(info->size); #endif ((UgData*)newone)->info = info; if (init) init(newone); assign(newone, data); return newone; } } return NULL; } //void ug_data_assign(UgData* dest, UgData* src) int ug_data_assign(void* data, void* src) { UgAssignFunc assign; if (data) { assign = ((UgData*)data)->info->assign; if(assign) return assign(data, src); } return FALSE; } // UgJsonParseFunc for UgData, used by UgEntry with UG_ENTRY_CUSTOM UgJsonError ug_json_parse_data(UgJson* json, const char* name, const char* value, void* data, void* none) { UgData* ugdata = (UgData*)data; // UgData's type is UG_JSON_OBJECT if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } if (ugdata->info->entry == NULL) ug_json_push(json, ug_json_parse_unknown, NULL, NULL); else ug_json_push(json, ug_json_parse_entry, data, (void*)ugdata->info->entry); return UG_JSON_ERROR_NONE; } // write UgData, used by UgEntry with UG_ENTRY_CUSTOM void ug_json_write_data(UgJson* json, const UgData* data) { ug_json_write_object_head(json); if (data->info->entry) ug_json_write_entry(json, (void*) data, data->info->entry); ug_json_write_object_tail(json); } uget-2.2.2/uglib/UgEntry.c0000664000175000017500000001612413470304403012251 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #include #if defined(_MSC_VER) #define strtoll _strtoi64 #define strtoull _strtoui64 #endif UgJsonError ug_json_parse_entry(UgJson* json, const char* name, const char* value, void* dest, void* entry0) { const UgEntry* entry; UgJsonError error = UG_JSON_ERROR_NONE; for (entry = entry0; entry->type; entry++) { if (entry->name && strcmp(entry->name, name) != 0) continue; // get destination dest = ((char*) dest) + entry->offset; // handle data by UgEntryType switch (entry->type) { case UG_ENTRY_BOOL: if (json->type == UG_JSON_TRUE) *(int*) dest = 1; else if (json->type == UG_JSON_FALSE) *(int*) dest = 0; else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_INT: if (json->type == UG_JSON_NUMBER) *(int*) dest = strtol(value, NULL, 10); else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_UINT: if (json->type == UG_JSON_NUMBER) *(unsigned int*) dest = (unsigned int) strtoul(value, NULL, 10); else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_INT64: // C99 Standard if (json->type == UG_JSON_NUMBER) *(int64_t*) dest = strtoll(value, NULL, 10); else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_UINT64: // C99 Standard if (json->type == UG_JSON_NUMBER) *(uint64_t*) dest = strtoull(value, NULL, 10); else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_DOUBLE: if (json->type == UG_JSON_NUMBER) *(double*) dest = strtod(value, NULL); else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_STRING: if (json->type == UG_JSON_STRING) *(char**) dest = ug_strdup(value); else if (json->type == UG_JSON_NULL) *(char**) dest = NULL; else error = UG_JSON_ERROR_TYPE_NOT_MATCH; break; case UG_ENTRY_OBJECT: if (json->type != UG_JSON_OBJECT) return UG_JSON_ERROR_TYPE_NOT_MATCH; if (entry->param2) ((UgInitFunc)entry->param2)(dest); ug_json_push(json, ug_json_parse_entry, dest, entry->param1); return UG_JSON_ERROR_NONE; case UG_ENTRY_ARRAY: if (json->type != UG_JSON_ARRAY) return UG_JSON_ERROR_TYPE_NOT_MATCH; ug_json_push(json, (UgJsonParseFunc) entry->param1, dest, NULL); return UG_JSON_ERROR_NONE; case UG_ENTRY_CUSTOM: return ((UgJsonParseFunc)entry->param1)(json, name, value, dest, (void*)entry); default: break; } // End of switch (entry->type) break; } // if entry->type != UG_ENTRY_OBJECT or UG_ENTRY_ARRAY // but json->type == UG_JSON_OBJECT or UG_JSON_ARRAY // if (json->type >= UG_JSON_OBJECT) { // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); // return UG_JSON_ERROR_TYPE_NOT_MATCH; // } return error; } // ---------------------------------------------------------------------------- void ug_json_write_entry(UgJson* json, void* src, const UgEntry* entry) { union { void* src; char** pstring; int* pint; unsigned int* puint; int64_t* pint64; uint64_t* puint64; double* pdouble; UgValue* pvalue; } value; for (; entry->type; entry++) { value.src = ((char*) src) + entry->offset; switch (entry->type) { case UG_ENTRY_BOOL: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_bool(json, *(value.pint)); break; case UG_ENTRY_INT: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_int(json, *(value.pint)); break; case UG_ENTRY_UINT: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_uint(json, *(value.puint)); break; case UG_ENTRY_INT64: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_int64(json, *(value.pint64)); break; case UG_ENTRY_UINT64: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_uint64(json, *(value.puint64)); break; case UG_ENTRY_DOUBLE: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_double(json, *(value.pdouble)); break; case UG_ENTRY_STRING: // for UG_ENTRY_NO_NULL if ((entry->param2==UG_ENTRY_NO_NULL) && *(value.pstring) == NULL) break; if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_string(json, *(value.pstring)); break; case UG_ENTRY_OBJECT: if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_object_head(json); ug_json_write_entry(json, value.src, entry->param1); ug_json_write_object_tail(json); break; case UG_ENTRY_ARRAY: // Don't output if no UgJsonWriteFunc in entry->param2. if (entry->param2 == NULL) break; if (entry->name) ug_json_write_string(json, entry->name); ug_json_write_array_head(json); ((UgJsonWriteFunc)entry->param2)(json, value.src, (void*)entry); ug_json_write_array_tail(json); break; case UG_ENTRY_CUSTOM: // Don't output if no UgJsonWriteFunc in entry->param2. if (entry->param2 == NULL) break; if (entry->param2 == (void*) ug_json_write_value) { // for UgValue only if (value.pvalue->type == UG_VALUE_NONE) continue; if (value.pvalue->name == NULL) ug_json_write_string(json, entry->name); } else if (entry->name) ug_json_write_string(json, entry->name); ((UgJsonWriteFunc) entry->param2)(json, value.src, (void*)entry); break; default: break; } } } uget-2.2.2/uglib/UgOption.h0000664000175000017500000000753013470304403012426 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_OPTION_H #define UG_OPTION_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgOption UgOption; typedef struct UgOptionEntry UgOptionEntry; // return TRUE if accepted by parse function. typedef int (*UgOptionParseFunc) (UgOption* option, const char* name, const char* value, void* dest, void* data); // type = UG_ENTRY_OBJECT // UgOptionEntry.data pointer to UgEntry // type = UG_ENTRY_ARRAY // UgOptionEntry.data pointer to UgOptionParseFunc // type = UG_ENTRY_CUSTOM // UgOptionEntry.data pointer to UgOptionParseFunc struct UgOptionEntry { char* long_name; char* short_name; int offset; int type; char* description; char* arg_description; void* data; }; void ug_option_entry_print_help (UgOptionEntry* entry, const char* prog_name, const char* parameter_string, const char* summary_string); // ---------------------------------------------------------------------------- struct UgOption { UgArrayStr others; // begin character is not '-' UgArrayStr unaccepted; // Not accepted by parse function uint8_t short_name; uint8_t discard_unaccepted; struct { UgOptionParseFunc func; void* dest; void* data; } parse; }; void ug_option_init (UgOption* option); void ug_option_final (UgOption* option); void ug_option_clear (UgOption* option); void ug_option_set_parser (UgOption* option, UgOptionParseFunc func, void* dest, void* data); int ug_option_parse (UgOption* option, const char* string, int length); // UgOptionEntry* entry int ug_option_parse_entry (UgOption* option, const char* name, const char* value, void* dest, void* entry); // ---------------------------------------------------------------------------- // command-line argument char* ug_args_find_version (int argc, char** argv); char* ug_args_find_help (int argc, char** argv); #ifdef __cplusplus } #endif #endif // UG_OPTION_H uget-2.2.2/uglib/UgFileUtil.c0000664000175000017500000002423313470304403012665 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include // ug_strdup #include #if defined _WIN32 || defined _WIN64 #define _CRT_SECURE_NO_WARNINGS // _MSC_VER #include #include // _wmkdir(), _wrmdir() #include // struct utimbuf #else #include #include // struct utimbuf #include #endif // ---------------------------------------------------------------------------- // UgDir #if defined HAVE_GLIB // use Glib functions #elif defined _WIN32 || defined _WIN64 #else const char* ug_dir_read (UgDir* udir) { struct dirent* entry; entry = readdir (udir); while (entry) { if (strcmp (entry->d_name, ".")) break; if (strcmp (entry->d_name, "..")) break; entry = readdir (udir); } if (entry) return entry->d_name; else return NULL; } #endif // ---------------------------------------------------------------------------- // Time #if defined _WIN32 || defined _WIN64 int ug_modify_file_time (const char *file_utf8, time_t mod_time) { struct _utimbuf utb; wchar_t* file; int retval; utb.actime = time (NULL); utb.modtime = mod_time; file = (wchar_t*) ug_utf8_to_utf16 (file_utf8, -1, NULL); retval = _wutime (file, &utb); ug_free (file); return retval; } #elif defined HAVE_GLIB int ug_modify_file_time (const char *file_utf8, time_t mod_time) { struct utimbuf utb; gchar* file; int retval; utb.actime = time (NULL); utb.modtime = mod_time; file = g_filename_from_utf8 (file_utf8, -1, NULL, NULL, NULL); retval = g_utime (file, &utb); g_free (file); return retval; } #else int ug_modify_file_time (const char *file_utf8, time_t mod_time) { struct utimbuf utb; int retval; utb.actime = time (NULL); utb.modtime = mod_time; retval = utime (file_utf8, &utb); return retval; } #endif // ---------------------------------------------------------------------------- // file and directory functions #if defined _WIN32 || defined _WIN64 int ug_create_dir (const char *dir_utf8) { wchar_t *wfilename = ug_utf8_to_utf16 (dir_utf8, -1, NULL); int save_errno; int retval; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wmkdir (wfilename); save_errno = errno; ug_free (wfilename); errno = save_errno; return retval; } int ug_delete_dir (const char *dir_utf8) { wchar_t *wfilename = ug_utf8_to_utf16 (dir_utf8, -1, NULL); int save_errno; int retval; if (wfilename == NULL) { errno = EINVAL; return -1; } retval = _wrmdir (wfilename); save_errno = errno; ug_free (wfilename); errno = save_errno; return retval; } int ug_file_is_exist (const char* filename) { int attributes; wchar_t *wfilename = ug_utf8_to_utf16 (filename, -1, NULL); if (wfilename == NULL) return FALSE; attributes = GetFileAttributesW (wfilename); ug_free (wfilename); if (attributes == INVALID_FILE_ATTRIBUTES) return FALSE; return TRUE; } int ug_file_is_dir (const char* dir) { int attributes; wchar_t *wfilename = ug_utf8_to_utf16 (dir, -1, NULL); if (wfilename == NULL) return FALSE; attributes = GetFileAttributesW (wfilename); ug_free (wfilename); if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) return TRUE; return FALSE; } #elif defined HAVE_GLIB int ug_create_dir (const gchar *dir_utf8) { if (g_get_filename_charsets (NULL)) return g_mkdir (dir_utf8, 0755); else { gchar *cp_filename = g_filename_from_utf8 (dir_utf8, -1, NULL, NULL, NULL); int save_errno; int retval; if (cp_filename == NULL) { errno = EINVAL; return -1; } retval = g_mkdir (cp_filename, 0755); save_errno = errno; g_free (cp_filename); errno = save_errno; return retval; } } int ug_delete_dir (const gchar *dir_utf8) { if (g_get_filename_charsets (NULL)) return g_rmdir (dir_utf8); else { gchar *cp_filename = g_filename_from_utf8 (dir_utf8, -1, NULL, NULL, NULL); int save_errno; int retval; if (cp_filename == NULL) { errno = EINVAL; return -1; } retval = g_rmdir (cp_filename); save_errno = errno; g_free (cp_filename); errno = save_errno; return retval; } } int ug_file_is_exist (const char* filename) { gchar *name; int result; if (g_get_filename_charsets (NULL)) result = g_access (filename, F_OK); else { name = g_filename_from_utf8 (filename, -1, NULL, NULL, NULL); result = g_access (name, F_OK); g_free (name); } if (result == -1) return FALSE; return TRUE; } int ug_file_is_dir (const char* dir) { struct stat s; gchar *cp_dir; int result; if (g_get_filename_charsets (NULL)) result = g_stat (dir, &s); else { cp_dir = g_filename_from_utf8 (dir, -1, NULL, NULL, NULL); result = g_stat (cp_dir, &s) == 0; g_free (cp_dir); } if (result == 0) return S_ISDIR (s.st_mode); return FALSE; } #elif defined USE__ANDROID__SAF #else int ug_file_is_exist (const char* filename) { if (access (filename, F_OK) == -1) return FALSE; return TRUE; } int ug_file_is_dir (const char* dir) { struct stat s; if (stat (dir, &s) == 0) return S_ISDIR (s.st_mode); return FALSE; } #endif // _WIN32 || _WIN64 #ifndef USE__ANDROID__SAF int ug_create_dir_all (const char* dir, int len) { const char* dir_end; const char* element_end; // path element char* element_os; if (len == -1) len = strlen (dir); if (len > 1 && dir[len-1] == UG_DIR_SEPARATOR) len--; dir_end = dir + len; element_end = dir; // quick check element_os = ug_strndup (dir, len); if (ug_file_is_exist (element_os) && ug_file_is_dir(element_os)) { ug_free (element_os); return 0; } ug_free (element_os); for (;;) { // skip directory separator "\\\\" or "//" for (; element_end < dir_end; element_end++) { if (*element_end != UG_DIR_SEPARATOR) break; } if (element_end == dir_end) return 0; // get directory name [dir, element_end) for (; element_end < dir_end; element_end++) { if (*element_end == UG_DIR_SEPARATOR) break; } element_os = (char*) ug_malloc (element_end - dir + 1); element_os[element_end - dir] = 0; strncpy (element_os, dir, element_end - dir); if (element_os == NULL) break; if (ug_file_is_exist (element_os) == FALSE) { if (ug_create_dir (element_os) == -1) { ug_free (element_os); return -1; } } ug_free (element_os); } return -1; } #endif // USE__ANDROID__SAF // ---------------------------------------------------------------------------- // File I/O #if defined _WIN32 || defined _WIN64 int ug_file_copy (const char *src_file_utf8, const char *new_file_utf8) { int retval; uint16_t* src_file_wcs; uint16_t* new_file_wcs; src_file_wcs = ug_utf8_to_utf16 (src_file_utf8, -1, NULL); new_file_wcs = ug_utf8_to_utf16 (new_file_utf8, -1, NULL); retval = CopyFileW (src_file_wcs, new_file_wcs, FALSE); ug_free (src_file_wcs); ug_free (new_file_wcs); if (retval == 0) return -1; return 0; } #else int ug_file_copy (const char *src_file_utf8, const char *new_file_utf8) { int src_fd; int new_fd; char* buf; int buf_len; int retval = 0; // new_fd = open (new_file_utf8, // O_BINARY | O_WRONLY | O_CREAT, // S_IREAD | S_IWRITE | S_IRGRP | S_IROTH); new_fd = ug_open (new_file_utf8, UG_O_BINARY | UG_O_WRONLY | UG_O_CREAT, UG_S_IREAD | UG_S_IWRITE | UG_S_IRGRP | UG_S_IROTH); if (new_fd == -1) return -1; // src_fd = open (src_file_utf8, O_BINARY | O_RDONLY, S_IREAD); src_fd = ug_open (src_file_utf8, UG_O_BINARY | UG_O_RDONLY, UG_S_IREAD); if (src_fd == -1) { ug_close (new_fd); return -1; } // read & write buf = ug_malloc (8192); for (;;) { buf_len = ug_read (src_fd, buf, 8192); if (buf_len <=0) break; if (ug_write (new_fd, buf, buf_len) != buf_len) { retval = -1; break; } } // clear ug_free (buf); ug_close (src_fd); ug_close (new_fd); return retval; } #endif // _WIN32 int ug_file_get_lines (const char* filename_utf8, UgList* list) { UgLink* link; FILE* file; char* buf; int len; int count = 0; file = ug_fopen (filename_utf8, "r"); if (file == NULL) return 0; buf = ug_malloc (8192); if (fread (buf, 1, 3, file) == 3) { // UTF-8 byte-order mark: 0xEF, 0xBB, 0xBF if ((unsigned char)buf[0] != 0xEF || (unsigned char)buf[1] != 0xBB) rewind (file); } while (fgets (buf, 8192, file) != NULL) { count++; len = strlen (buf); if (len > 0 && buf[len-1] == '\n') buf[--len] = 0; if (list) { link = ug_link_new (); link->data = ug_strndup (buf, len); ug_list_append (list, link); } } ug_free (buf); fclose (file); return count; } uget-2.2.2/uglib/UgInfo.h0000664000175000017500000001323113470304403012044 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_INFO_H #define UG_INFO_H #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgInfo UgInfo; /* ---------------------------------------------------------------------------- This UgRegistry used by UgInfo. User can only store UgDataInfo in this UgRegistry. key pointer to UgDataInfo.name data pointer to UgDataInfo */ UgRegistry* ug_info_get_registry(void); void ug_info_set_registry(UgRegistry* registry); /* ---------------------------------------------------------------------------- UgInfo - collection of UgDataInfo and UgData - It uses UgDataInfo to get/alloc UgData. key pointer to UgDataInfo data pointer to UgData */ // ---------------------------------------------------------------------------- // UgInfo functions UgInfo* ug_info_new(int allocated_length, int cache_length); void ug_info_ref(UgInfo* info); void ug_info_unref(UgInfo* info); void ug_info_init(UgInfo* info, int allocated_length, int cache_length); void ug_info_final(UgInfo* info); // ug_info_get() and ug_info_realloc() return UgData // ug_info_set() replace old data by new one. It return old UgData void* ug_info_realloc(UgInfo* info, const UgDataInfo* key); void ug_info_remove(UgInfo* info, const UgDataInfo* key); void* ug_info_get(UgInfo* info, const UgDataInfo* key); void* ug_info_set(UgInfo* info, const UgDataInfo* key, void* new_data); UgPair* ug_info_find(UgInfo* info, const UgDataInfo* key, int* inserted_index); void ug_info_assign(UgInfo* info, UgInfo* src, const UgDataInfo* exclude); // ---------------- // JSON parser/writer that used with UG_ENTRY_CUSTOM. // if 'registry' is NULL, use default registry. UgJsonError ug_json_parse_info_ptr(UgJson* json, const char* name, const char* value, void** pinfo, void* registry); void ug_json_write_info_ptr(UgJson* json, UgInfo** pinfo); UgJsonError ug_json_parse_info(UgJson* json, const char* name, const char* value, void* info, void* registry); void ug_json_write_info(UgJson* json, UgInfo* info); /* // --- JSON output sample --- { "progress": { }, "common": { }, "log": { } } */ #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgInfo structure struct UgInfo { UG_ARRAY_MEMBERS(UgPair); /* // ------ UgArray members ------ UgPair* at; int length; int allocated; int element_size; */ int cache_length; int ref_count; #ifdef __cplusplus // C++11 standard-layout inline void* operator new(size_t size, int allocated_length, int cache_length) { return ug_info_new(allocated_length, cache_length); } inline void operator delete(void* p) { ug_info_unref((UgInfo*)p); } inline void ref() { ug_info_ref(this); } inline void unref() { ug_info_unref(this); } inline void init(int allocatedLength, int cacheLength) { ug_info_init(this, allocatedLength, cacheLength); } inline void final(void) { ug_info_final(this); } inline void remove(const UgDataInfo* key) { ug_info_remove(this, key); } inline void* realloc(const UgDataInfo* key) { return ug_info_realloc(this, key); } inline void* get(const UgDataInfo* key) { return ug_info_get(this, key); } inline void* set(const UgDataInfo* key, void* new_data) { return ug_info_set(this, key, new_data); } inline void assign(UgInfo* src, const UgDataInfo* exclude) { ug_info_assign(this, src, exclude); } // static method static inline UgRegistry* getRegistry(void) { return ug_info_get_registry(); } static inline void setRegistry(UgRegistry* registry) { ug_info_set_registry(registry); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgInfo Info; }; // namespace Ug #endif // __cplusplus #endif // UG_INFO_H uget-2.2.2/uglib/UgUri.c0000664000175000017500000002404413470304403011707 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include // ---------------------------------------------------------------------------- // UgUri int ug_uri_init (UgUri* upart, const char* uri) { const char* cur; const char* tmp; // scheme - make sure ':' before '/', '%', '?', and '#' #if defined _WIN32 || defined _WIN64 cur = strpbrk (uri, ":\\/%?#"); #else cur = strpbrk (uri, ":/%?#"); #endif if (cur && cur[0] == ':') { if (upart == NULL) return cur - uri; upart->scheme_len = cur - uri; cur++; } else { if (upart == NULL) return 0; upart->scheme_len = 0; cur = uri; } upart->uri = uri; #if defined _WIN32 || defined _WIN64 // Windows Path if (upart->scheme_len == 1) { upart->scheme_len = 0; cur = uri; } #endif // _WIN32 || _WIN64 // authority & path if (upart->scheme_len && cur[0] == '/' && cur[1] == '/') { cur += 2; upart->authority = cur - uri; cur += strcspn (cur, "/"); } else upart->authority = -1; upart->path = cur - uri; // file upart->file = -1; if (cur[0]) { for (; ; ) { #if defined _WIN32 || defined _WIN64 tmp = strpbrk (cur, "\\/?#"); if (tmp == NULL || (tmp[0] != '/' && tmp[0] != '\\')) { #else tmp = strpbrk (cur, "/?#"); if (tmp == NULL || tmp[0] != '/') { #endif // _WIN32 || _WIN64 upart->file = cur - uri; break; } cur = tmp + 1; } } // query if ((tmp = strchr (cur, '?')) == NULL) upart->query = -1; else { cur = tmp + 1; upart->query = cur - uri; } // fragment if ((tmp = strrchr (cur, '#')) == NULL) upart->fragment = -1; else { cur = tmp + 1; if (cur - uri <= INT16_MAX) upart->fragment = cur - uri; else upart->fragment = -1; } // host & port upart->port = -1; if (upart->authority == -1) upart->host = -1; else { upart->host = upart->authority; tmp = uri + upart->authority; for (cur = uri + upart->path -1; cur >= tmp; cur--) { if (cur[0] == '@') { upart->host = cur - uri + 1; break; } if (cur[0] == ':') upart->port = cur - uri + 1; } } return upart->scheme_len; } int ug_uri_part_scheme (UgUri* uuri, const char** scheme) { if (scheme && uuri->scheme_len) *scheme = uuri->uri; return uuri->scheme_len; } int ug_uri_part_file (UgUri* uuri, const char** file) { if (uuri->file != -1) { if (file) *file = uuri->uri + uuri->file; if (uuri->query != -1) return uuri->query - uuri->file - 1; // - '?' if (uuri->fragment != -1) return uuri->fragment - uuri->file - 1; // - '#' return strlen (uuri->uri + uuri->file); } return 0; } int ug_uri_part_file_ext (UgUri* uuri, const char** ext) { const char* beg; const char* end; int len; if (uuri->file != -1) { len = ug_uri_part_file (uuri, &beg); end = uuri->uri + uuri->file + len -1; for (; end >= beg; end--) { if (end[0] == '.') { end += 1; // + '.' if (ext) *ext = end; return len - (end - beg); } } } return 0; } int ug_uri_part_query (UgUri* uuri, const char** query) { if (uuri->query != -1) { if (query) *query = uuri->uri + uuri->query; if (uuri->fragment != -1) return uuri->fragment - uuri->query -1; // - '#' return strlen (uuri->uri + uuri->query); } return 0; } int ug_uri_part_fragment (UgUri* uuri, const char** fragment) { if (uuri->fragment != -1) { if (fragment) *fragment = uuri->uri + uuri->fragment; return strlen (uuri->uri + uuri->fragment); } return 0; } int ug_uri_part_referrer (UgUri* uuri, const char** referrer) { if (referrer) *referrer = uuri->uri; if (uuri->file == -1) return uuri->path; return uuri->file; } int ug_uri_part_user (UgUri* uuri, const char** user) { const char* beg; const char* end; if (uuri->authority == uuri->host) return 0; beg = uuri->uri + uuri->authority; end = uuri->uri + uuri->host - 1; // - '@' if (user) *user = beg; for (; beg < end; beg++) { if (beg[0] == ':') break; } return beg - uuri->uri - uuri->authority; } int ug_uri_part_password (UgUri* uuri, const char** password) { const char* tmp; int length; length = ug_uri_part_user (uuri, &tmp); if (length && tmp[length] == ':') { tmp += length + 1; // + ':' if (password) *password = tmp; return uuri->host - (tmp - uuri->uri) - 1; // - '@' } return 0; } int ug_uri_part_host (UgUri* uuri, const char** host) { if (uuri->host != -1) { if (host) *host = uuri->uri + uuri->host; if (uuri->port != -1) return uuri->port - uuri->host - 1; // - ':' else return uuri->path - uuri->host; } return 0; } int ug_uri_part_port (UgUri* uuri, const char** port) { if (uuri->port != -1) { if (port) *port = uuri->uri + uuri->port; return uuri->path - uuri->port; } return 0; } int ug_uri_get_port (UgUri* uuri) { if (uuri->port != -1) return strtol (uuri->uri + uuri->port, NULL, 10); return -1; } char* ug_uri_get_file (UgUri* uuri) { const char* str; char* name; int len; len = ug_uri_part_file (uuri, &str); if (len == 0) return NULL; name = ug_malloc (len + 1); ug_decode_uri (str, len, name); if (ug_utf8_get_invalid (name, NULL) == -1) return name; ug_free (name); return ug_strndup (str, len); } int ug_uri_is_file(UgUri* uuri) { if (uuri->scheme_len == 4) { if (strncmp(uuri->uri, "file", 4) != 0) return FALSE; } else if (uuri->scheme_len != 0) return FALSE; return TRUE; } // ------------------------------------ // match uri functions int ug_uri_match_hosts (UgUri* uuri, char** hosts) { const char* str; const char* end1; const char* end2; int len; int lenHost; int nthHost; len = ug_uri_part_host (uuri, &str); if (len) { for (nthHost = 0; *hosts; hosts++, nthHost++) { lenHost = strlen (*hosts); if (lenHost > len) continue; // compare host from head if (strncasecmp (uuri->uri, *hosts, len) == 0) return nthHost; // compare host from tail end1 = str + len -1; end2 = *hosts + lenHost -1; for (; lenHost > 0; lenHost--, end1--, end2--) { if (end1[0] != end2[0]) break; } if (lenHost == 0) return nthHost; } } return -1; } int ug_uri_match_schemes (UgUri* uuri, char** schemes) { int len; int index; len = ug_uri_part_scheme (uuri, NULL); if (len) { for (index = 0; *schemes; schemes++, index++) { if (strncasecmp (uuri->uri, *schemes, len) == 0) return index; } } return -1; } int ug_uri_match_file_exts (UgUri* uuri, char** exts) { const char* str; int len; int index; len = ug_uri_part_file_ext (uuri, &str); if (len) { for (index = 0; *exts; exts++, index++) { if (strncasecmp (str, *exts, len) == 0) return index; } } return -1; } // ------------------------------------ // UgUriQuery int ug_uri_query_part (UgUriQuery* uuquery, const char* query_field) { int ret_value; if (query_field == NULL) return 0; uuquery->field_len = strcspn (query_field, "=&#;,"); if (uuquery->field_len == 0) return 0; query_field += uuquery->field_len; if (query_field[0] == '=') { uuquery->value = (char*) query_field + 1; // + '=' uuquery->value_len = strcspn (uuquery->value, "&#;,"); query_field = uuquery->value + uuquery->value_len; ret_value = 2; } else { uuquery->value = NULL; uuquery->value_len = 0; ret_value = 1; } // next field or next value switch (query_field[0]) { case ',': uuquery->value_next = (char*) query_field + 1; uuquery->field_next = NULL; break; case '&': case ';': uuquery->value_next = NULL; uuquery->field_next = (char*) query_field + 1; break; default: uuquery->value_next = NULL; uuquery->field_next = NULL; break; } return ret_value; } // ------------------------------------ // Other URI functions char* ug_filename_from_uri (const char* str) { UgUri uuri; ug_uri_init (&uuri, str); return ug_uri_get_file ((UgUri*) &uuri); } // return length of decoded uri. param dest can be param uri or NULL. int ug_decode_uri (const char* uri, int length, char* dest) { const char* uri_end; char* dest_beg; char* endptr; char buf[3]; if (length == -1) length = strlen (uri); dest_beg = dest; for (uri_end = uri + length; uri < uri_end; uri++, dest++) { if (uri[0] == '%' && uri + 2 < uri_end) { buf[0] = uri[1]; buf[1] = uri[2]; buf[2] = 0; endptr = NULL; *(uint8_t*)buf = (uint8_t) strtoul (buf, &endptr, 16); if (endptr == buf + 2) { if (dest_beg) *dest = *buf; uri += 2; continue; } } if (dest_beg) { if (uri[0] == '+') *dest = ' '; else *dest = *uri; } } if (dest_beg) *dest = 0; return dest - dest_beg; } uget-2.2.2/uglib/UgNode.h0000664000175000017500000000745313470304403012047 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_NODE_H #define UG_NODE_H #include // memset #ifdef __cplusplus extern "C" { #endif typedef struct UgNode UgNode; // ---------------------------------------------------------------------------- // UgNode: Data Node for all data, compatible with GNode in glib #define UG_NODE_MEMBERS(NodeType, DataType, DataName) \ DataType* DataName; \ NodeType* next; \ NodeType* prev; \ NodeType* parent; \ NodeType* children; \ NodeType* last; \ int n_children struct UgNode { UG_NODE_MEMBERS (UgNode, void, data); /* void* data; UgNode* next; UgNode* prev; UgNode* parent; UgNode* children; UgNode* last; int n_children; */ }; UgNode* ug_node_new (void); void ug_node_free (UgNode* link); void ug_node_init (UgNode* node); void ug_node_reverse (UgNode* node); void ug_node_prepend (UgNode* parent, UgNode* node); void ug_node_append (UgNode* parent, UgNode* node); void ug_node_insert (UgNode* parent, UgNode* sibling, UgNode* node); void ug_node_remove (UgNode* parent, UgNode* node); void ug_node_unlink (UgNode* node); UgNode* ug_node_nth_child (UgNode* node, int nth); int ug_node_child_position (UgNode* node, UgNode* child); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct NodeMethod { inline void init (void) { ug_node_init ((UgNode*)this); } inline void prepend (UgNode* node) { ug_node_prepend ((UgNode*)this, node); } inline void append (UgNode* node) { ug_node_append ((UgNode*)this, node); } inline void insert (UgNode* sibling, UgNode* node) { ug_node_insert ((UgNode*)this, sibling, node); } inline void remove (UgNode* node) { ug_node_remove ((UgNode*)this, node); } inline void unlink (void) { ug_node_unlink ((UgNode*)this); } }; // This one is for directly use only. You can NOT derived it. struct Node : NodeMethod, UgNode { inline Node (void) { ug_node_init ((UgNode*)this); } }; }; // namespace Ug #endif // __cplusplus #endif // UG_NODE_H uget-2.2.2/uglib/UgList.c0000664000175000017500000001720213470304403012061 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include // g_slice_xxx #endif // HAVE_GLIB #include #include #include #include #include // ---------------------------------------------------------------------------- // UgLink UgLink* ug_link_new (void) { #ifdef HAVE_GLIB return g_slice_alloc0 (sizeof (UgLink)); #else return ug_malloc0 (sizeof (UgLink)); #endif } void ug_link_free (UgLink* link) { #ifdef HAVE_GLIB g_slice_free1 (sizeof (UgLink), link); #else ug_free (link); #endif } // ---------------------------------------------------------------------------- // UgList: for UG_ENTRY_LIST void ug_list_init (UgList* list) { list->head = NULL; list->tail = NULL; list->size = 0; } void ug_list_clear (UgList* list, int free_links) { UgLink* link; UgLink* next; if (free_links) { for (link = list->head; link; link = next) { next = link->next; // ug_link_free (link); #ifdef HAVE_GLIB g_slice_free1 (sizeof (UgLink), link); #else ug_free (link); #endif // HAVE_GLIB } } list->size = 0; list->head = NULL; list->tail = NULL; } void ug_list_foreach (UgList* list, UgForeachFunc func, void* data) { UgLink* link; UgLink* next; for (link = list->head; link; link = next) { next = link->next; func (link->data, data); } } void ug_list_foreach_link (UgList* list, UgForeachFunc func, void* data) { UgLink* link; UgLink* next; for (link = list->head; link; link = next) { next = link->next; func (link, data); } } void ug_list_prepend (UgList* list, UgLink* link) { link->prev = NULL; link->next = list->head; if (list->head) list->head->prev = link; else // if (list->tail == NULL) list->tail = link; list->head = link; list->size++; } void ug_list_append (UgList* list, UgLink* link) { if (list->tail) list->tail->next = link; else // if (list->head == NULL) list->head = link; link->next = NULL; link->prev = list->tail; list->tail = link; list->size++; } void ug_list_insert (UgList* list, UgLink* sibling, UgLink* link) { if (sibling == NULL) { ug_list_append (list, link); return; } if (sibling == list->head) { ug_list_prepend (list, link); return; } sibling->prev->next = link; link->next = sibling; link->prev = sibling->prev; sibling->prev = link; list->size++; } void ug_list_remove (UgList* list, UgLink* link) { if (list->tail == link) list->tail = link->prev; if (list->head == link) list->head = link->next; if (link->prev) link->prev->next = link->next; if (link->next) link->next->prev = link->prev; link->next = NULL; link->prev = NULL; list->size--; } int ug_list_position (UgList* list, UgLink* link) { UgLink* temp; int pos; for (pos = 0, temp = list->head; temp; temp = temp->next, pos++) { if (temp == link) return pos; } return -1; } // ---------------------------------------------------------------------------- // UgJsonParseFunc for JSON array elements UgJsonError ug_json_parse_list_bool (UgJson* json, const char* name, const char* value, void* list, void* none) { UgLink* link; if (json->type != UG_JSON_TRUE && json->type != UG_JSON_FALSE) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } link = ug_link_new (); if (json->type == UG_JSON_TRUE) link->data = (void*)(intptr_t)1; else link->data = (void*)(intptr_t)0; ug_list_append (list, link); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_list_int (UgJson* json, const char* name, const char* value, void* list, void* none) { UgLink* link; if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } link = ug_link_new (); link->data = (void*)(intptr_t) strtol (value, NULL, 10); ug_list_append (list, link); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_list_uint (UgJson* json, const char* name, const char* value, void* list, void* none) { UgLink* link; if (json->type != UG_JSON_NUMBER) { // if (json->type >= UG_JSON_OBJECT) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } link = ug_link_new (); link->data = (void*)(uintptr_t) strtoul (value, NULL, 10); ug_list_append (list, link); return UG_JSON_ERROR_NONE; } UgJsonError ug_json_parse_list_string (UgJson* json, const char* name, const char* value, void* list, void* none) { UgLink* link; char* string; if (json->type == UG_JSON_STRING) string = ug_strdup (value); else if (json->type == UG_JSON_NULL) string = NULL; else { // if (json->type >= UG_JSON_OBJECT) // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } link = ug_link_new (); link->data = string; ug_list_append (list, link); return UG_JSON_ERROR_NONE; } // ---------------------------------------------------------------------------- // write JSON array elements void ug_json_write_list_bool (UgJson* json, UgList* list) { UgLink* link; for (link = list->head; link; link = link->next) ug_json_write_bool (json, (intptr_t)link->data); } void ug_json_write_list_int (UgJson* json, UgList* list) { UgLink* link; for (link = list->head; link; link = link->next) ug_json_write_int (json, (intptr_t)link->data); } void ug_json_write_list_uint (UgJson* json, UgList* list) { UgLink* link; for (link = list->head; link; link = link->next) ug_json_write_uint (json, (uintptr_t)link->data); } void ug_json_write_list_string (UgJson* json, UgList* list) { UgLink* link; for (link = list->head; link; link = link->next) { if (link->data == NULL) ug_json_write_null (json); else ug_json_write_string (json, link->data); } } uget-2.2.2/uglib/UgJson.h0000664000175000017500000002701013470304403012062 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_JSON_H #define UG_JSON_H #include // int64_t #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // UgJsonType & UgJsonError typedef enum { UG_JSON_NULL, // null UG_JSON_TRUE, // true UG_JSON_FALSE, // false UG_JSON_NUMBER, // 1234, 0.567 UG_JSON_STRING, // "string" UG_JSON_OBJECT, // { UG_JSON_ARRAY, // [ UG_JSON_N_TYPE, // numbers of UgJsonType } UgJsonType; typedef enum { UG_JSON_ERROR_NONE = 0, // error code < 0, JSON format error UG_JSON_ERROR_UNKNOWN = -1, UG_JSON_ERROR_INVALID_NAME = -2, UG_JSON_ERROR_EXCESS_NAME = -3, // get 2 names in 1 element UG_JSON_ERROR_BEFORE_COLON = -4, // no name before colon in object UG_JSON_ERROR_EXCESS_COLON = -5, // get 2 colons in 1 element // UG_JSON_ERROR_NO_VALUE = -6, UG_JSON_ERROR_INVALID_VALUE = -7, // not true, false, null, string, and number. UG_JSON_ERROR_EXCESS_VALUE = -8, // get 2 values in 1 element UG_JSON_ERROR_INVALID_CONTROL = -9, // unknown control character after '\' UG_JSON_ERROR_INVALID_UNICODE = -10, UG_JSON_ERROR_INVALID_NUMBER = -11, UG_JSON_ERROR_IN_OBJECT = -12, UG_JSON_ERROR_IN_ARRAY = -13, UG_JSON_ERROR_IN_SEPARATOR = -14, // ',' UG_JSON_ERROR_UNCOMPLETED = -15, // -------------------------------- // JSON-RPC error code UG_JSON_ERROR_RPC_INVALID = -32, // -------------------------------- // error code > 0, user (application) error // used by user parser (e.g. UgArray, UgList, UgEntry) UG_JSON_ERROR_TYPE_NOT_MATCH = 1, UG_JSON_ERROR_NO_DESTINATION = 2, UG_JSON_ERROR_OUT_OF_MEMORY = 3, UG_JSON_ERROR_CUSTOM = 4, } UgJsonError; // ---------------------------------------------------------------------------- // UgJson: a simple JSON parser & writer typedef struct UgJson UgJson; // UgJsonParseFunc : a callback function to parse data typedef UgJsonError (*UgJsonParseFunc) (UgJson* json, const char* name, const char* value, void* dest, void* data); typedef void (*UgJsonWriteFunc) (UgJson* json, void* src, void* data); // ---------------------------------------------------------------------------- // JSON initialize & finalize functions void ug_json_init (UgJson* json); void ug_json_final (UgJson* json); // ---------------------------------------------------------------------------- // JSON Parser functions void ug_json_begin_parse (UgJson* json); UgJsonError ug_json_end_parse (UgJson* json); UgJsonError ug_json_parse (UgJson* json, const char* string, int len); // Don't call ug_json_pop() directly. void ug_json_set (UgJson* json, UgJsonParseFunc func, void* dest, void* data); void ug_json_push (UgJson* json, UgJsonParseFunc func, void* dest, void* data); void ug_json_pop (UgJson* json); // UgJsonParseFunc for JSON that starting with array. // This parser will be popped if JSON start with array, otherwise it pop parser twice. // User must push it after UserParseFunc. Below is sample code. // ug_json_push (json, UserParseFunc, UserData1, UserData2); // ug_json_push (json, ug_json_parse_array, NULL, NULL); UgJsonError ug_json_parse_array (UgJson* json, const char* name, const char* value, void* dest, void* data); // UgJsonParseFunc for JSON that starting with object. // This parser will be popped if JSON start with object, otherwise it pop parser twice. // User must push it after UserParseFunc. Below is sample code. // ug_json_push (json, UserParseFunc, UserData1, UserData2); // ug_json_push (json, ug_json_parse_object, NULL, NULL); UgJsonError ug_json_parse_object (UgJson* json, const char* name, const char* value, void* dest, void* data); // UgJsonParseFunc for unknown object or array. // User must push this function in UserParseFunc if you get unknown object or array. // ug_json_push (json, ug_json_parse_unknown, NULL, NULL); UgJsonError ug_json_parse_unknown (UgJson* json, const char* name, const char* value, void* dest, void* data); // ---------------------------------------------------------------------------- // JSON Writer functions // UgJson.state = UgJsonFormat // UgJson.index[0] = level // UgJson.stack.at[0] = UgBuffer typedef enum { UG_JSON_FORMAT_INDENT = 1, UG_JSON_FORMAT_UTF8 = 2, UG_JSON_FORMAT_ALL = UG_JSON_FORMAT_INDENT | UG_JSON_FORMAT_UTF8 } UgJsonFormat; // UgJson Writer functions void ug_json_begin_write (UgJson* json, UgJsonFormat format, UgBuffer* buffer); void ug_json_end_write (UgJson* json); void ug_json_write_head (UgJson* json, char ch); void ug_json_write_tail (UgJson* json, char ch); // void ug_json_write_object_head (UgJson* json) // void ug_json_write_object_tail (UgJson* json) // void ug_json_write_array_head (UgJson* json) // void ug_json_write_array_tail (UgJson* json) #define ug_json_write_object_head(json) ug_json_write_head (json, '{') #define ug_json_write_object_tail(json) ug_json_write_tail (json, '}') #define ug_json_write_array_head(json) ug_json_write_head (json, '[') #define ug_json_write_array_tail(json) ug_json_write_tail (json, ']') void ug_json_write_null (UgJson* json); void ug_json_write_bool (UgJson* json, int value); void ug_json_write_number (UgJson* json, const char* format, ...); void ug_json_write_string (UgJson* json, const char* Cstring); // void ug_json_write_int (UgJson* json, int value); // void ug_json_write_uint (UgJson* json, unsigned int value); // void ug_json_write_int64 (UgJson* json, int64_t value); // void ug_json_write_uint64 (UgJson* json, uint64_t value); // void ug_json_write_double (UgJson* json, double value); #define ug_json_write_int(json, value) ug_json_write_number (json, "%d", value) #define ug_json_write_uint(json, value) ug_json_write_number (json, "%u", value) #define ug_json_write_double(json, value) ug_json_write_number (json, "%f", value) #if defined (_MSC_VER) || defined (__MINGW32__) #define ug_json_write_int64(json, value) ug_json_write_number (json, "%I64d", value) #define ug_json_write_uint64(json, value) ug_json_write_number (json, "%I64u", value) #else #define ug_json_write_int64(json, value) ug_json_write_number (json, "%lld", (long long) (value)) #define ug_json_write_uint64(json, value) ug_json_write_number (json, "%llu", (unsigned long long) (value)) #endif #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgJson structure struct UgJson { // buffer is used by parser & writer struct { char* at; int length; int allocated; } buf; // stack can store state, function, and data. struct { void** at; int length; int allocated; } stack; // User's parser can read type and scope only. // used by parser & writer uint8_t scope; // UG_JSON_OBJECT or UG_JSON_ARRAY uint8_t state; // Parser state, Writer UgJsonFormat int8_t error; // temporary state uint8_t type; // UgJsonType uint8_t count; // count value (true, false, null, unicode) length uint8_t colon:1; // boolean, has ':' in object. uint8_t numberPoint:1; // boolean, has '.' in number. uint8_t numberEe:1; // boolean, has 'E' or 'e' in number. uint8_t numberPm:1; // boolean, has '+' or '-' in number. // parser index[0] = index of name // index[1] = index of value // writer index[0] = level int index[2]; #ifdef __cplusplus // C++11 standard-layout inline UgJson (void) { ug_json_init (this); } inline ~UgJson (void) { ug_json_final (this); } inline void init (void) { ug_json_init (this); } inline void final (void) { ug_json_final (this); } // parser inline void beginParse(void) { ug_json_begin_parse (this); } inline void endParse (void) { ug_json_end_parse (this); } inline void parse (const char* string, int length) { ug_json_parse (this, string, length); } inline void push (UgJsonParseFunc func, void* dest, void* data) { ug_json_push (this, func, dest, data); } inline void pop (void) { ug_json_pop (this); } // writer inline void beginWrite (UgJsonFormat format, UgBuffer* buffer) { ug_json_begin_write (this, format, buffer); } inline void endWrite (void) { ug_json_end_write (this); } // inline void writeHead (char ch) // { ug_json_write_head (this, ch); } // inline void writeTail (char ch) // { ug_json_write_tail (this, ch); } inline void writeObjectHead (void) { ug_json_write_object_head (this); } inline void writeObjectTail (void) { ug_json_write_object_tail (this); } inline void writeArrayHead (void) { ug_json_write_array_head (this); } inline void writeArrayTail (void) { ug_json_write_array_tail (this); } inline void writeNull (void) { ug_json_write_null (this); } inline void writeBool (int value) { ug_json_write_bool (this, value); } // void writeNumber (const char* format, ...) inline void writeString (const char* Cstring) { ug_json_write_string (this, Cstring); } inline void writeInt (int value) { ug_json_write_int (this, value); } inline void writeUint (unsigned int value) { ug_json_write_uint (this, value); } inline void writeInt64 (int64_t value) { ug_json_write_int64 (this, value); } inline void writeDouble (double value) { ug_json_write_double (this, value); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgJson Json; }; // namespace Ug #endif // __cplusplus #endif // UG_JSON_H uget-2.2.2/uglib/UgOption.c0000664000175000017500000002214613470304403012421 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #include #if defined(_MSC_VER) #define strtoll _strtoi64 #define strtoull _strtoui64 #endif static void print_entry (UgBuffer* buffer, UgOptionEntry* entry, int arg_max_length) { int length = 0; length += ug_buffer_write (buffer, " ", 2); if (entry->short_name) { ug_buffer_write_char (buffer, '-'); length++; length += ug_buffer_write (buffer, entry->short_name, -1); length += ug_buffer_write (buffer, ", ", 2); } if (entry->long_name) { length += ug_buffer_write (buffer, "--", 2); length += ug_buffer_write (buffer, entry->long_name, -1); } if (entry->arg_description) { ug_buffer_write_char (buffer, '='); length++; #if 0 // defined HAVE_GLIB length += ug_buffer_write (buffer, gettext (entry->arg_description), -1); #else length += ug_buffer_write (buffer, entry->arg_description, -1); #endif } length = arg_max_length + 4 - length; ug_buffer_fill (buffer, ' ', length); if (entry->description) { #if 0//defined HAVE_GLIB ug_buffer_write (buffer, gettext (entry->description), -1); #else ug_buffer_write (buffer, entry->description, -1); #endif } ug_buffer_write_char (buffer, '\n'); } static int buffer_more (UgBuffer* buffer) { int length; length = buffer->cur - buffer->beg; if (length > 0) { printf ("%.*s", length, buffer->beg); buffer->cur = buffer->beg; } return length; } void ug_option_entry_print_help (UgOptionEntry* entry, const char* prog_name, const char* parameter_string, const char* summary_string) { UgBuffer buffer; ug_buffer_init (&buffer, 4096); buffer.more = buffer_more; ug_buffer_write (&buffer, "\n" "Usage:\n ", -1); ug_buffer_write (&buffer, prog_name, -1); ug_buffer_write (&buffer, " [OPTION...] ", -1); ug_buffer_write (&buffer, parameter_string, -1); ug_buffer_write (&buffer, "\n\n", -1); if (summary_string) { ug_buffer_write (&buffer, summary_string, -1); ug_buffer_write (&buffer, "\n\n", -1); } for (; entry->long_name; entry++) print_entry (&buffer, entry, 28); buffer_more (&buffer); ug_buffer_write (&buffer, "\n\n", -1); ug_buffer_clear (&buffer, TRUE); } // ---------------------------------------------------------------------------- void ug_option_init (UgOption* option) { ug_array_init (&option->others, sizeof (char*), 16); ug_array_init (&option->unaccepted, sizeof (char*), 16); } void ug_option_final (UgOption* option) { ug_option_clear (option); ug_array_clear (&option->others); ug_array_clear (&option->unaccepted); } void ug_option_clear (UgOption* option) { ug_array_foreach_ptr (&option->others, (UgForeachFunc) ug_free, NULL); ug_array_foreach_ptr (&option->unaccepted, (UgForeachFunc) ug_free, NULL); option->unaccepted.length = 0; option->others.length = 0; } void ug_option_set_parser (UgOption* option, UgOptionParseFunc func, void* dest, void* data) { option->parse.func = func; option->parse.dest = dest; option->parse.data = data; } int ug_option_parse (UgOption* option, const char* string, int length) { char* beg; char* cur; char* end; if (string == NULL || length == 0) return FALSE; if (length == -1) length = strlen (string); string = ug_strndup (string, length); // not option if (string[0] != '-') { *(char**) ug_array_alloc (&option->others, 1) = (char*) string; return TRUE; } // option name end = (char*) string + length; for (beg = (char*) string; beg < end; beg++) { if (beg[0] != '-') break; } if (beg == end) { ug_free ((void*) string); return FALSE; } if (beg - string == 1) option->short_name = TRUE; else option->short_name = FALSE; // option value for (cur = beg; cur < end; cur++) { if (cur[0] == '=') { *cur++ = 0; break; } } if (cur == end) cur = NULL; if (option->parse.func (option, beg, cur, option->parse.dest, option->parse.data) == FALSE) { if (option->discard_unaccepted == FALSE) *(char**) ug_array_alloc (&option->unaccepted, 1) = (char*) string; } ug_free ((void*) string); return TRUE; } int ug_option_parse_entry (UgOption* option, const char* name, const char* value, void* dest, void* data) { UgOptionEntry* entry = (UgOptionEntry*) data; for (; entry->long_name; entry++) { // compare option name if (entry->long_name[0] != 0) { if (option->short_name) { if (strcmp (entry->short_name, name) != 0) continue; } else { if (strcmp (entry->long_name, name) != 0) continue; } } // get destination dest = ((char*) dest) + entry->offset; // handle data by UgEntryType switch (entry->type) { case UG_ENTRY_BOOL: *(int*) dest = TRUE; if (value) { if (strcmp (value, "no") == 0 || strcmp (value, "false") == 0) *(int*) dest = FALSE; } return TRUE; case UG_ENTRY_INT: *(int*) dest = strtol (value, NULL, 10); return TRUE; case UG_ENTRY_UINT: *(unsigned int*) dest = (unsigned int) strtoul (value, NULL, 10); return TRUE; case UG_ENTRY_INT64: // C99 Standard *(int64_t*) dest = strtoll (value, NULL, 10); return TRUE; case UG_ENTRY_UINT64: // C99 Standard *(uint64_t*) dest = strtoull (value, NULL, 10); return TRUE; case UG_ENTRY_DOUBLE: *(double*) dest = strtod (value, NULL); return TRUE; case UG_ENTRY_STRING: *(char**) dest = ug_strdup (value); return TRUE; case UG_ENTRY_OBJECT: // UgOptionEntry.data pointer to UgEntry return ug_option_parse_entry (option, name, value, dest, entry->data); case UG_ENTRY_ARRAY: // UgOptionEntry.data pointer to UgOptionParseFunc return ((UgOptionParseFunc) entry->data) (option, name, value, dest, data); case UG_ENTRY_CUSTOM: // UgOptionEntry.data pointer to UgOptionParseFunc return ((UgOptionParseFunc) entry->data) (option, name, value, dest, data); default: return FALSE; } } return FALSE; } // ---------------------------------------------------------------------------- // command-line argument // find -?, -h, --help, or --help- in command-line options and return it. char* ug_args_find_help (int argc, char** argv) { char* arg; int arg_len; for (argc -= 1; argc >= 0; argc--) { arg = argv[argc]; arg_len = strlen (arg); #ifdef _WIN32 // Check and remove some character (space,0x20) in tail of argument from command line. // This problem only happen in Windows platform. // ug_str_clear_tail_charset (arg, arg_len, " \n"); #endif // check short_name: -h or -? if (arg_len < 2 || arg[0] != '-') continue; if (arg_len == 2 && (arg[1] == 'h' || arg[1] == '?')) return arg; // check long name: --help if (arg_len < 6 || arg[1] != '-') continue; if (strncmp (arg+2, "help", 4) == 0) { if (arg_len == 6 || arg[6] == '-') return arg; } } return NULL; } // find -V, --version char* ug_args_find_version (int argc, char** argv) { char* arg; int arg_len; for (argc -= 1; argc >= 0; argc--) { arg = argv[argc]; arg_len = strlen (arg); #ifdef _WIN32 // Check and remove some character (space,0x20) in tail of argument from command line. // This problem only happen in Windows platform. // ug_str_clear_tail_charset (arg, arg_len, " \n"); #endif // check short_name: -V if (arg_len < 2 || arg[0] != '-') continue; if (arg_len == 2 && arg[1] == 'V') return arg; // check long name: --version if (arg_len != 9 || arg[1] != '-') continue; if (strncmp (arg+2, "version", 7) == 0) return arg; } return NULL; } uget-2.2.2/uglib/UgHtmlEntry.c0000664000175000017500000002116013470304403013072 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include #if defined(_MSC_VER) #define strtoll _strtoi64 #define strtoull _strtoui64 #endif // ---------------------------------------------------------------------------- // unknown void ug_html_start_element_unknown (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data) { ug_html_push (uhtml, &ug_html_parser_unknown, NULL, NULL); } const UgHtmlParser ug_html_parser_unknown = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) NULL, }; // ---------------------------------------------------------------------------- // time_t static void entry_text_time_rfc822 (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(time_t*) dest = ug_str_rfc822_to_time (text); } const UgHtmlParser ug_html_parser_time_rfc822 = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_time_rfc822, }; static void entry_text_time_rfc3339 (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(time_t*) dest = ug_str_rfc3339_to_time (text); } const UgHtmlParser ug_html_parser_time_rfc3339 = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_time_rfc3339, }; // ---------------------------------------------------------------------------- // bool static void entry_text_bool (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { if (strncasecmp (text, "false", text_len) == 0 || text[0] == '0') *(int*) dest = 0; else *(int*) dest = 1; } const UgHtmlParser ug_html_parser_bool = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_bool, }; // ---------------------------------------------------------------------------- // int static void entry_text_int (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(int*) dest = strtol (text, NULL, 10); } const UgHtmlParser ug_html_parser_int = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_int, }; // ---------------------------------------------------------------------------- // unsigned int static void entry_text_uint (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(unsigned int*) dest = (unsigned int) strtoul (text, NULL, 10); } const UgHtmlParser ug_html_parser_uint = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_uint, }; // ---------------------------------------------------------------------------- // int64_t static void entry_text_int64 (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { // C99 Standard *(int64_t*) dest = strtoll (text, NULL, 10); } const UgHtmlParser ug_html_parser_int64 = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_int64, }; // ---------------------------------------------------------------------------- // uint64_t static void entry_text_uint64 (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { // C99 Standard *(uint64_t*) dest = strtoull (text, NULL, 10); } const UgHtmlParser ug_html_parser_uint64 = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_uint64, }; // ---------------------------------------------------------------------------- // double static void entry_text_double (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(double*) dest = strtod (text, NULL); } const UgHtmlParser ug_html_parser_double = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_double, }; // ---------------------------------------------------------------------------- // string static void entry_text_string (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data) { *(char**) dest = ug_strdup (text); } const UgHtmlParser ug_html_parser_string = { (void*) ug_html_start_element_unknown, (void*) ug_html_pop, (void*) entry_text_string, }; // ---------------------------------------------------------------------------- // custom const UgHtmlParser ug_html_parser_custom = { (void*) NULL, (void*) NULL, (void*) NULL, }; // ---------------------------------------------------------------------------- void ug_html_start_element_entry (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* entry0) { const UgHtmlEntry* entry; const UgHtmlParser* parser; for (entry = (UgHtmlEntry*) entry0; entry->parser; entry++) { if (entry->name && strcmp (entry->name, uhtml->element_name) != 0) continue; // get destination dest = ((char*) dest) + entry->offset; parser = entry->parser; if (parser == &ug_html_parser_custom) { // call custom start_element ((UgHtmlParserStartElementFunc)entry->param1) (uhtml, element_name, attribute_names, attribute_values, dest, (void*) entry); } else ug_html_push (uhtml, parser, dest, (void*) entry); return; } ug_html_push (uhtml, &ug_html_parser_unknown, NULL, NULL); } const UgHtmlParser ug_html_parser_entry = { (void*) ug_html_start_element_entry, (void*) ug_html_pop, (void*) NULL, }; uget-2.2.2/uglib/UgValue.h0000664000175000017500000002055213470304403012231 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_VALUE_H #define UG_VALUE_H #include // int64_t #include // qsort(), malloc(), free() #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgValue UgValue; typedef struct UgValue UgMember; typedef struct UgValueArray UgValueArray; typedef struct UgValueArray UgValueObject; typedef union UgValueC UgValueC; typedef void (*UgValueForeachFunc) (UgValue* value, void* data); // If value is NULL pointer and type is UG_VALUE_STRING, // you will get JSON output 'null'. typedef enum { UG_VALUE_NONE = 0, // JSON will not output this value. UG_VALUE_BOOL, // JSON true or false, C int UG_VALUE_INT, // JSON number, C int UG_VALUE_UINT, // JSON number, C unsigned int UG_VALUE_INT64, // JSON number, C int64_t, long long UG_VALUE_UINT64, // JSON number, C uint64_t, unsigned long long UG_VALUE_DOUBLE, // JSON number, C double UG_VALUE_STRING, // JSON string, C string UG_VALUE_OBJECT, // JSON object, C UgValueObject (UgValueArray) UG_VALUE_ARRAY, // JSON array, C UgValueArray } UgValueType; // ---------------------------------------------------------------------------- // UgValueC: C language value for UgValueType union UgValueC { int boolean; int integer; unsigned int uinteger; int64_t integer64; uint64_t uinteger64; char* string; double fraction; UgValueArray* array; UgValueObject* object; // void* pointer; }; // ---------------------------------------------------------------------------- // UgValue functions void ug_value_init(UgValue* value); void ug_value_clear(UgValue* value); void ug_value_init_type(UgValue* value, UgValueType type); void ug_value_init_array(UgValue* value, int nElements); void ug_value_init_object(UgValue* value, int nMembers); // You can use this if UgValue.type == UG_VALUE_ARRAY or UG_VALUE_OBJECT. UgValue* ug_value_alloc(UgValue* uvalue, int nValue); #if 0 UgValue* ug_value_alloc_front(UgValue* uvalue, int nValue); #endif // UgValue* ug_value_at(UgValue* value, UgValue* key, UgCompareFunc func); #define ug_value_at(varray, index) \ (varray)->c.array->at + (index) // int ug_value_length(UgValue* value); #define ug_value_length(varray) \ (varray)->c.array->length // void ug_value_sort(UgValue* value, UgCompareFunc compare); #define ug_value_sort(varray, compareFunc) \ qsort((varray)->c.array->at, (varray)->c.array->length, \ sizeof(UgValue), compareFunc) // UgValue* ug_value_find(UgValue* value, UgValue* key, UgCompareFunc func); #define ug_value_find(varray, key, compareFunc) \ bsearch(key, (varray)->c.array->at, (varray)->c.array->length, \ sizeof(UgValue), compareFunc) // void ug_value_sort_name(UgValue* value) #define ug_value_sort_name(vobj) \ qsort((vobj)->c.object->at, (vobj)->c.object->length, \ sizeof(UgValue), ug_value_compare_name) UgValue* ug_value_find_name(UgValue* value, const char* name); // recursive functions void ug_value_sort_recursive(UgValue* value, UgCompareFunc compare); //void ug_value_sort_name_recursive(UgValue* value); #define ug_value_sort_name_recursive(vobj) \ ug_value_sort_recursive(vobj, ug_value_compare_name) int ug_value_compare_name(const void* value1, const void* value2); int ug_value_compare_string(const void* value1, const void* value2); // If you set static string in all UgValue.name or UgValue.c.string, // run ug_value_foreach() before you call ug_value_clear(). // e.g. // ug_value_foreach(value, ug_value_set_name_string, NULL); void ug_value_set_name(UgValue* value, void* data); void ug_value_set_string(UgValue* value, void* data); void ug_value_set_name_string(UgValue* value, void* data); void ug_value_foreach(UgValue* value, UgValueForeachFunc func, void* data); int ug_value_get_int(UgValue* uvalue); int64_t ug_value_get_int64(UgValue* uvalue); uint64_t ug_value_get_uint64(UgValue* uvalue); UgJsonError ug_json_parse_value(UgJson* json, const char* name, const char* value, void* uvalue, void* none); void ug_json_write_value(UgJson* json, UgValue* value); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgValue structure struct UgValue { char* name; UgValueType type; UgValueC c; #ifdef __cplusplus // C++11 standard-layout inline UgValue(void) { ug_value_init(this); } inline UgValue(UgValueType type) { ug_value_init_type(this, type); } inline ~UgValue(void) { ug_value_clear(this); } inline void init(void) { ug_value_init(this); } inline void init(UgValueType type) { ug_value_init_type(this, type); } inline void initObject(int nMember) { ug_value_init_object(this, nMember); } inline void initArray(int nElement) { ug_value_init_array(this, nElement); } inline void clear(void) { ug_value_clear(this); } inline UgValue* alloc(int nValue) { return ug_value_alloc(this, nValue); } // get nth element at object or array inline UgValue* at(int index); // return length of object or array inline int length(void); // find by object's member name inline UgValue* find(const char* name) { return ug_value_find_name(this, name); } // find at object or array inline UgValue* find(UgValue* key, UgCompareFunc func); // sort by object's member name inline void sort(); // sort at object or array inline void sort(UgCompareFunc func); // sort by object's member name inline void sortRecursive() { ug_value_sort_recursive(this, ug_value_compare_name); } // sort at object or array inline void sortRecursive(UgCompareFunc func) { ug_value_sort_recursive(this, func); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // UgValueArray = UgValueObject struct UgValueArray { int length; int allocated; UgValue at[1]; }; // ---------------------------------------------------------------------------- // C++ inline functions #ifdef __cplusplus inline UgValue* UgValue::at(int index) { return ug_value_at(this, index); } inline int UgValue::length(void) { return ug_value_length(this); } inline UgValue* UgValue::find(UgValue* key, UgCompareFunc func) { return (UgValue*) ug_value_find(this, key, func); } inline void UgValue::sort() { ug_value_sort_name(this); } inline void UgValue::sort(UgCompareFunc func) { ug_value_sort(this, func); } #endif // __cplusplus // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgValueArray ValueArray; typedef struct UgValue Value; }; // namespace Ug #endif // __cplusplus #endif // UG_VALUE_H uget-2.2.2/uglib/UgEntry.h0000664000175000017500000001213713470304403012256 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_ENTRY_H #define UG_ENTRY_H #include // NULL, offsetof() #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgEntry UgEntry; // ---------------------------------------------------------------------------- // UgEntryType : UgEntry use this to parse and write JSON value typedef enum { UG_ENTRY_NONE = 0, UG_ENTRY_BOOL, // JSON true or false, C int UG_ENTRY_INT, // JSON number, C int UG_ENTRY_UINT, // JSON number, C unsigned int UG_ENTRY_INT64, // JSON number, C int64_t, long long UG_ENTRY_UINT64, // JSON number, C uint64_t, unsigned long long UG_ENTRY_DOUBLE, // JSON number, C double UG_ENTRY_STRING, // JSON string, C string UG_ENTRY_OBJECT, // JSON object, C struct, C++11 standard layout class UG_ENTRY_ARRAY, // JSON array, C array or others UG_ENTRY_CUSTOM, // JSON value, C functions were used. } UgEntryType; // You can set this in UgEntry.param2 when UgEntry.type is UG_ENTRY_STRING. // ug_json_write_entry() will not output this field when value is NULL. #define UG_ENTRY_NO_NULL ((void*)(uintptr_t) 0x0001) // ---------------------------------------------------------------------------- // UgEntry: It can defines a object member and it's offset of data structure. /* // --- UgEntry sample for JSON --- typedef struct { char* user; int number; } Foo; static UgEntry FooEntry[] = { { "user", offsetof(Foo, user), UG_ENTRY_STRING, NULL, NULL}, { "number", offsetof(Foo, number), UG_ENTRY_INT, NULL, NULL}, { NULL } // null-terminated }; // --- JSON output: --- { "user": "guest3", "number": 2500, } ------------------------------------------------------- if UgEntry.type == 0, this entry is null-terminated. if UgEntry.name == NULL, it can match no name or any name. it usually uses at first or last entry. UgEntryType = UG_ENTRY_STRING If you don't want to output anything when string value is NULL, set UG_ENTRY_NO_NULL at UgEntry.param2. UgEntryType = UG_ENTRY_OBJECT UgEntry.param1 pointer to UgEntry UgEntry.param2 pointer to UgInitFunc --------- if (UgInitFunc) UgInitFunc(UserData); UgEntryType = UG_ENTRY_ARRAY UgEntry.param1 = UgJsonParseFunc, how to parse JSON array elements. UgEntry.param2 = UgJsonWriteFunc, how to write JSON array elements. --------- parser call UgEntry.param1 to parse JSON array. writer call UgEntry.param2 to write JSON array. UgEntryType = UG_ENTRY_CUSTOM UgEntry.param1 = UgJsonParseFunc, how to parse JSON value. UgEntry.param2 = UgJsonWriteFunc, how to write JSON value. --------- parser call UgEntry.param1 to parse JSON value. writer call UgEntry.param2 to write JSON value. */ struct UgEntry { char* name; // JSON name int offset; // offsetof (TYPE, MEMBER) UgEntryType type; void* param1; // parameter 1 void* param2; // parameter 2 }; // parse JSON value by UgEntry UgJsonError ug_json_parse_entry(UgJson* json, const char* name, const char* value, void* dest, void* entry); // write JSON value by UgEntry void ug_json_write_entry(UgJson* json, void* src, const UgEntry* entry); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgEntry Entry; }; // namespace Ug #endif // __cplusplus #endif // UG_ENTRY_H uget-2.2.2/uglib/UgHtml.c0000664000175000017500000002701713470304403012057 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include enum UgHtmlState { UG_HTML_NULL, UG_HTML_TEXT, UG_HTML_ENTITY, UG_HTML_TAG, // UG_HTML_TAG_PASS, // }; enum UgHtmlTagState { UG_HTML_TAG_ERROR, // (0 << 0) UG_HTML_TAG_START, // (1 << 0) UG_HTML_TAG_END, // (1 << 1) }; UgHtml* ug_html_new (void) { UgHtml* uhtml; uhtml = ug_malloc (sizeof (UgHtml)); ug_html_init (uhtml); return uhtml; } void ug_html_free (UgHtml* uhtml) { ug_html_final (uhtml); ug_free (uhtml); } void ug_html_init (UgHtml* uhtml) { // initialize buffer uhtml->buf.allocated = 4096; uhtml->buf.length = 0; uhtml->buf.at = ug_malloc (uhtml->buf.allocated); // ug_array_init (&uhtml->stack, sizeof (void*), 16 * 3); ug_array_init (&uhtml->attr_names, sizeof (void*), 16); ug_array_init (&uhtml->attr_values, sizeof (void*), 16); } void ug_html_final (UgHtml* uhtml) { ug_free (uhtml->buf.at); ug_array_clear (&uhtml->stack); ug_array_clear (&uhtml->attr_names); ug_array_clear (&uhtml->attr_values); } // ---------------------------------------------------------------------------- enum { PARSER_STACK_BASE, // 0 PARSER_STACK_DATA2, // 1 PARSER_STACK_DATA1, // 2 PARSER_STACK_TABLE, // 3 PARSER_STACK_UNIT = PARSER_STACK_TABLE, // equal with STACK_MULTIPLY_VALUE }; static const UgHtmlParser ug_html_parser_null = {NULL, NULL, NULL}; void ug_html_push (UgHtml* uhtml, const UgHtmlParser* parser, void* dest, void* data) { void** addr; addr = (void**) ug_array_alloc (&uhtml->stack, PARSER_STACK_UNIT); *addr++ = (void*) parser; *addr++ = dest; *addr++ = data; } void ug_html_pop (UgHtml* uhtml) { if (uhtml->stack.length >= PARSER_STACK_UNIT) uhtml->stack.length -= PARSER_STACK_UNIT; if (uhtml->stack.length == 0) ug_html_push (uhtml, &ug_html_parser_null, NULL, NULL); } void ug_html_begin_parse (UgHtml* uhtml) { uhtml->buf.at[0] = 0; uhtml->buf.length = 1; uhtml->name_beg_pos = 0; uhtml->name_end_pos = 0; uhtml->error = 0; uhtml->state = UG_HTML_TEXT; } UgHtmlError ug_html_end_parse (UgHtml* uhtml) { uhtml->stack.length = 0; if (uhtml->state == UG_HTML_ENTITY) return UG_HTML_ERROR_BAD_ENTITY; if (uhtml->state == UG_HTML_TAG) return UG_HTML_ERROR_BAD_ELEMENT; return (UgHtmlError) uhtml->error; } // parse context->tag, separate attribute names and values. // output: uhtml->name_beg_pos, uhtml->name_end_pos, // uhtml->attr_names, uhtml->attr_values, // uhtml->tag_state static int ug_html_parse_tag (UgHtml* uhtml) { char* attr_name = NULL; char* attr_value = NULL; char quote_chr = 0; int quote_level = 0; char* cur; char* end; uhtml->name_beg_pos = 0; uhtml->name_end_pos = 0; uhtml->attr_names.length = 0; uhtml->attr_values.length = 0; uhtml->tag_state = UG_HTML_TAG_START; uhtml->equ = FALSE; end = uhtml->buf.at + uhtml->buf.length; for (cur = uhtml->buf.at; cur < end; cur++) { switch (cur[0]) { case ' ': cur[0] = 0; if (cur == uhtml->buf.at + uhtml->name_beg_pos) uhtml->name_beg_pos++; else { if (uhtml->name_end_pos == 0) uhtml->name_end_pos = cur - uhtml->buf.at; else if (uhtml->equ) { uhtml->equ = FALSE; *(void**) ug_array_alloc (&uhtml->attr_names, 1) = attr_name; *(void**) ug_array_alloc (&uhtml->attr_values, 1) = attr_value; attr_value = NULL; } attr_name = cur + 1; } continue; case '=': cur[0] = 0; if (uhtml->equ || attr_name == NULL) { uhtml->error = UG_HTML_ERROR_BAD_ATTRIBUTE; // uhtml->tag_state = 0; // return FALSE; } else { uhtml->equ = TRUE; attr_value = cur + 1; } continue; case '/': if (quote_level == 0) { cur[0] = 0; if (uhtml->tag_state & UG_HTML_TAG_END) uhtml->error = UG_HTML_ERROR_BAD_ELEMENT; if (cur == uhtml->buf.at + uhtml->name_beg_pos) { uhtml->tag_state = UG_HTML_TAG_END; uhtml->name_beg_pos++; } else { uhtml->tag_state |= UG_HTML_TAG_END; } } continue; case '\'': case '\"': // handle if (quote_chr == cur[0]) { quote_chr = (quote_chr=='"') ? '\'' : '"'; quote_level--; } else { if (quote_level == 0) attr_value = cur + 1; // ignore first character quote_chr = cur[0]; quote_level++; } if (quote_level == 0) { quote_chr = 0; cur[0] = 0; // null-terminated } continue; default: continue; } } if (uhtml->equ) { *(void**) ug_array_alloc (&uhtml->attr_names, 1) = attr_name; *(void**) ug_array_alloc (&uhtml->attr_values, 1) = attr_value; } if (uhtml->name_end_pos == 0) uhtml->name_end_pos = cur - uhtml->buf.at - 1; // null-terminated *(void**) ug_array_alloc (&uhtml->attr_names, 1) = NULL; *(void**) ug_array_alloc (&uhtml->attr_values, 1) = NULL; return TRUE; } UgHtmlError ug_html_parse (UgHtml* uhtml, const char* buffer, int buffer_len) { const UgHtmlParser* parser; const char* buffer_cur; const char* buffer_end; char vchar; int entity_len; if (buffer_len == -1) buffer_len = strlen (buffer); buffer_end = buffer + buffer_len; for (buffer_cur = buffer; buffer_cur < buffer_end; buffer_cur++) { if (uhtml->buf.allocated == uhtml->buf.length) { uhtml->buf.allocated *= 2; uhtml->buf.at = ug_realloc (uhtml->buf.at, uhtml->buf.allocated * sizeof (char)); } vchar = *buffer_cur; TopLevelSwitch: switch (uhtml->state) { case UG_HTML_TAG: if (vchar != '>') { uhtml->buf.at[uhtml->buf.length++] = vchar; continue; } // End of TAG uhtml->buf.at[uhtml->buf.length] = 0; // null-terminated ug_html_parse_tag (uhtml); uhtml->element_name = uhtml->buf.at + uhtml->name_beg_pos; if (uhtml->tag_state & UG_HTML_TAG_START) { parser = uhtml->stack.at[uhtml->stack.length - PARSER_STACK_TABLE]; if (parser->start_element) { parser->start_element (uhtml, uhtml->element_name, (const char**) uhtml->attr_names.at, (const char**) uhtml->attr_values.at, uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA1], uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA2]); } // clear buffer but reserve element name uhtml->buf.length = uhtml->name_end_pos + 1; } if (uhtml->tag_state & UG_HTML_TAG_END) { parser = uhtml->stack.at[uhtml->stack.length - PARSER_STACK_TABLE]; if (parser->end_element) { parser->end_element (uhtml, uhtml->element_name, uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA1], uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA2]); } // clear buffer and element name uhtml->buf.at[0] = 0; // null-terminated uhtml->buf.length = 1; uhtml->name_beg_pos = 0; uhtml->name_end_pos = 0; } uhtml->state = UG_HTML_TEXT; uhtml->entity = 0; continue; // break; case UG_HTML_TEXT: parser = uhtml->stack.at[uhtml->stack.length - PARSER_STACK_TABLE]; switch (vchar) { case '<': uhtml->element_name = uhtml->buf.at + uhtml->name_beg_pos; uhtml->buf.at[uhtml->buf.length] = 0; // null-terminated if (parser->text && uhtml->buf.length > uhtml->name_end_pos +1) { parser->text (uhtml, uhtml->buf.at + uhtml->name_end_pos +1, uhtml->buf.length - uhtml->name_end_pos -1, uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA1], uhtml->stack.at[uhtml->stack.length - PARSER_STACK_DATA2]); } uhtml->state = UG_HTML_TAG; // clear buffer uhtml->buf.length = 0; continue; // break; case '&': uhtml->state = UG_HTML_ENTITY; uhtml->entity = uhtml->buf.length; uhtml->buf.at[uhtml->buf.length++] = vchar; continue; // break; case '\r': case '\n': // skip continue; // break; default: // bypass text if parser doesn't care text. if (parser->text) uhtml->buf.at[uhtml->buf.length++] = vchar; continue; // break; } continue; // break; case UG_HTML_ENTITY: switch (vchar) { case '<': uhtml->error = UG_HTML_ERROR_BAD_ENTITY; uhtml->state = UG_HTML_TEXT; goto TopLevelSwitch; case ';': entity_len = uhtml->buf.length - uhtml->entity; // UgHtml doesn't support all entity if (entity_len > 5 || entity_len < 3) uhtml->buf.at[uhtml->buf.length++] = vchar; else { switch (uhtml->buf.at[uhtml->entity +1]) { // Entity Number // case '#': // break; case 'l': // < uhtml->buf.at[uhtml->entity] = '<'; break; case 'g': // > uhtml->buf.at[uhtml->entity] = '>'; break; case 'a': // & or ' vchar = uhtml->buf.at[uhtml->entity +2]; if (vchar == 'm') // & uhtml->buf.at[uhtml->entity] = '&'; else if (vchar == 'p') // ' uhtml->buf.at[uhtml->entity] = '\''; else { uhtml->buf.at[uhtml->buf.length++] = vchar; uhtml->error = UG_HTML_ERROR_UNKNOWN_ENTITY; uhtml->state = UG_HTML_TEXT; continue; } break; case 'q': // " uhtml->buf.at[uhtml->entity] = '\"'; break; default: uhtml->buf.at[uhtml->buf.length++] = vchar; uhtml->error = UG_HTML_ERROR_UNKNOWN_ENTITY; uhtml->state = UG_HTML_TEXT; continue; } uhtml->buf.length = uhtml->entity + 1; } uhtml->state = UG_HTML_TEXT; continue; // break; default: uhtml->buf.at[uhtml->buf.length++] = vchar; continue; // break; } // case UG_HTML_ENTITY: // break; } } return (UgHtmlError) uhtml->error; } int ug_html_parse_file (UgHtml* uhtml, const char* file_utf8) { char* buf; int buf_len; int fd; // fd = open (file_utf8, O_RDONLY | O_TEXT, S_IREAD); fd = ug_open (file_utf8, UG_O_READONLY | UG_O_TEXT, UG_S_IREAD); if (fd == -1) return FALSE; ug_html_begin_parse (uhtml); buf = ug_malloc (4096); for (;;) { // buf_len = read (fd, buf, 4096); buf_len = ug_read (fd, buf, 4096); if (buf_len <= 0) break; ug_html_parse (uhtml, buf, buf_len); } ug_free (buf); ug_html_end_parse (uhtml); // close (fd); ug_close (fd); return TRUE; } uget-2.2.2/uglib/UgStdio.h0000664000175000017500000002337113470304403012241 00000000000000/* * * Copyright (C) 2005-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ // Support LFS(Large File Support) and UTF-8 filename // It can compile with MS Visual C++, Mingw, Unix...etc. // To enable LFS (Large File Support) in UNIX platform // add `getconf LFS_CFLAGS` to CFLAGS // add `getconf LFS_LDFLAGS` to LDFLAGS #ifndef UG_STDIO_H #define UG_STDIO_H #ifdef HAVE_CONFIG_H #include #endif #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #ifndef snprintf #define snprintf _snprintf #endif // snprintf #endif // _MSC_VER #ifdef HAVE_GLIB #include #include #endif #if defined _WIN32 || defined _WIN64 #include #else #include #endif #include #include // for O_* flags //#include #include // for S_* mode #include #ifdef __cplusplus extern "C" { #endif // To enable LFS (Large File Support) in UNIX platform // add `getconf LFS_CFLAGS` to CFLAGS // add `getconf LFS_LDFLAGS` to LDFLAGS // in Linux // gcc -D_FILE_OFFSET_BITS=64 // define _FILE_OFFSET_BITS 64 // in Android // use lseek64() // ---------------------------------------------------------------------------- // low level file I/O // wrapper functions/definitions for file descriptor. // redefine flags: O_APPEND, O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL // redefine mode: S_IREAD, S_IWRITE #if defined _WIN32 || defined _WIN64 // flags # define UG_O_APPEND _O_APPEND # define UG_O_BINARY _O_BINARY // Text is the default in MS platform # define UG_O_TEXT _O_TEXT // Text is the default in MS platform # define UG_O_RDONLY _O_RDONLY # define UG_O_WRONLY _O_WRONLY # define UG_O_RDWR _O_RDWR # define UG_O_CREAT _O_CREAT # define UG_O_EXCL _O_EXCL // Use with _O_CREAT, return error if file exist. # define UG_O_TRUNC _O_TRUNC // Use with O_RDWR or O_WRONLY, Truncate the file if it does exist. // mnemonic flags # define UG_O_READONLY _O_RDONLY # define UG_O_WRITEONLY _O_WRONLY # define UG_O_READWRITE _O_RDWR # define UG_O_CREATE _O_CREAT # define UG_O_TRUNCATE _O_TRUNC // mode # define UG_S_IREAD _S_IREAD // Use with _O_CREAT # define UG_S_IWRITE _S_IWRITE // Use with _O_CREAT # define UG_S_IRUSR _S_IREAD // Use with _O_CREAT # define UG_S_IWUSR _S_IWRITE // Use with _O_CREAT # define UG_S_IXUSR 0 // Use with _O_CREAT # define UG_S_IRGRP 0 // Use with _O_CREAT # define UG_S_IWGRP 0 // Use with _O_CREAT # define UG_S_IROTH 0 // Use with _O_CREAT # define UG_S_IWOTH 0 // Use with _O_CREAT #else // flags # define UG_O_APPEND O_APPEND # ifdef O_BINARY # define UG_O_BINARY O_BINARY // Text is the default in MS platform # define UG_O_TEXT O_TEXT // Text is the default in MS platform # else # define UG_O_BINARY 0 // Text is the default in MS platform # define UG_O_TEXT 0 // Text is the default in MS platform # endif # define UG_O_RDONLY O_RDONLY # define UG_O_WRONLY O_WRONLY # define UG_O_RDWR O_RDWR # define UG_O_CREAT O_CREAT # define UG_O_EXCL O_EXCL // Use with O_CREAT, return error if file exist. # define UG_O_TRUNC O_TRUNC // Use with O_RDWR or O_WRONLY // mnemonic flags # define UG_O_READONLY O_RDONLY # define UG_O_WRITEONLY O_WRONLY # define UG_O_READWRITE O_RDWR # define UG_O_CREATE O_CREAT # define UG_O_TRUNCATE O_TRUNC // mode # ifndef S_IREAD # define S_IREAD S_IRUSR # endif # ifndef S_IWRITE # define S_IWRITE S_IWUSR # endif # define UG_S_IREAD S_IREAD // Use with O_CREAT # define UG_S_IWRITE S_IWRITE // Use with O_CREAT # define UG_S_IRUSR S_IRUSR // Use with O_CREAT # define UG_S_IWUSR S_IWUSR // Use with O_CREAT # define UG_S_IXUSR S_IXUSR // Use with O_CREAT # define UG_S_IRGRP S_IRGRP // Use with O_CREAT // GROUP READ # define UG_S_IWGRP S_IWGRP // Use with O_CREAT // GROUP WRITE # define UG_S_IROTH S_IROTH // Use with O_CREAT // OTHERS READ # define UG_S_IWOTH S_IWOTH // Use with O_CREAT // OTHERS WRITE #endif // creat(path, mode) == open (path, O_WRONLY|O_CREAT|O_TRUNC, mode) // Returns : a new file descriptor, or -1 if an error occurred. #if defined _WIN32 || defined _WIN64 || defined HAVE_GLIB || defined USE__ANDROID__SAF int ug_open (const char* filename_utf8, int flags, int mode); int ug_creat (const char* filename_utf8, int mode); #else # define ug_open open # define ug_creat creat #endif #if defined _WIN32 || defined _WIN64 int ug_truncate (int fd, int64_t length); #endif // ug_read() return 0 if end-of-file. return -1 on error. #if defined _WIN32 || defined _WIN64 # define ug_close _close # define ug_read _read # define ug_write _write # define ug_sync _commit # define ug_seek _lseeki64 // for MS VC # define ug_tell _telli64 // for MS VC #else # define ug_close close # define ug_read read # define ug_write write # define ug_sync fsync # if defined __ANDROID__ # define ug_seek lseek64 # define ug_tell(fd) lseek64(fd, 0L, SEEK_CUR) # if __ANDROID_API__ >= 12 # define ug_truncate ftruncate64 // Android API level 12+ # else # define ug_truncate ftruncate # endif # else # define ug_seek lseek # define ug_tell(fd) lseek(fd, 0L, SEEK_CUR) # define ug_truncate ftruncate # endif #endif // ------------------------------------------------------------------ // streaming file I/O // wrapper functions/definitions for file stream. (struct FILE) //#if defined (USE_FILE32API) // iOS //# define fopen64 fopen //# define ftello64 ftell //# define fseeko64 fseek //#endif #if defined _WIN32 || defined _WIN64 || defined HAVE_GLIB || defined USE__ANDROID__SAF FILE* ug_fopen (const char *filename_utf8, const char *mode); #else # define ug_fopen fopen #endif // FILE* fdopen(int fd, const char *mode); #define ug_fdopen fdopen #if defined __ANDROID__ int fseek_64 (FILE *stream, int64_t offset, int origin); int64_t ftell_64 (FILE *stream); #endif // __ANDROID__ int ug_ftruncate (FILE* file, int64_t size); #if defined _WIN32 || defined _WIN64 # if defined _MSC_VER # define ug_fseek _fseeki64 # define ug_ftell _ftelli64 # elif defined __MINGW32__ # define ug_fseek fseeko64 # define ug_ftell ftello64 # else # define ug_fseek fseek # define ug_ftell ftell # endif # define ug_fileno _fileno #else # if defined __ANDROID__ # define ug_fseek fseek_64 # define ug_ftell ftell_64 # else # define ug_fseek fseek # define ug_ftell ftell # endif # define ug_fileno fileno #endif #define ug_fclose fclose #define ug_fread(file,data,len) fread (data, 1, len, file) #define ug_fwrite(file,data,len) fwrite (data, 1, len, file) #define ug_fprintf fprintf #define ug_fputs(file,string) fputs (string, file) #define ug_fputc(file,character) fputc (character, file) #define ug_fgets(file,buf,len) fgets (buf, len, file) #define ug_fgetc(file) fgetc (file) #define ug_fflush fflush #define ug_fdget ug_fileno // ---------------------------------------------------------------------------- // file & directory functions: these functions returns 0 if it is successful. // ug_rename() renames a file, moving it between directories if required. // ug_remove() deletes a name from the filesystem, it works for both files and directories. // ug_unlink() If this was the last link to the file and no processes have it opened, the diskspace occupied by the file is freed. #if defined _WIN32 || defined _WIN64 || defined HAVE_GLIB || defined USE__ANDROID__SAF int ug_rename (const char *old_file_utf8, const char *new_file_utf8); int ug_remove (const char *file_utf8); int ug_unlink (const char *file_utf8); #else # define ug_rename rename # define ug_remove remove # define ug_unlink unlink #endif #ifdef __cplusplus } #endif #endif // UG_STDIO_H uget-2.2.2/uglib/UgInfo.c0000664000175000017500000001712413470304403012044 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include // ---------------------------------------------------------------------------- // UgRegistry for UgInfo static UgRegistry* ug_info_registry; UgRegistry* ug_info_get_registry(void) { return ug_info_registry; } void ug_info_set_registry(UgRegistry* registry) { ug_info_registry = registry; } // ---------------------------------------------------------------------------- // UgInfo UgInfo* ug_info_new(int allocated_length, int cache_length) { UgInfo* info; #ifdef HAVE_GLIB info = g_slice_alloc(sizeof(UgInfo)); #else info = ug_malloc(sizeof(UgInfo)); #endif // HAVE_GLIB ug_info_init(info, allocated_length, cache_length); return info; } void ug_info_ref(UgInfo* info) { info->ref_count++; } void ug_info_unref(UgInfo* info) { if (--info->ref_count == 0) { ug_info_final(info); #ifdef HAVE_GLIB g_slice_free1(sizeof(UgInfo), info); #else ug_free(info); #endif // HAVE_GLIB } } void ug_info_init(UgInfo* info, int allocated_length, int cache_length) { int index; ug_array_init(info, sizeof(UgPair), allocated_length + cache_length); info->length = cache_length; info->cache_length = cache_length; info->ref_count = 1; // clear cache for (index = 0; index < info->length; index++) { info->at[index].key = NULL; info->at[index].data = NULL; } } void ug_info_final(UgInfo* info) { UgPair* cur; UgPair* end; for (cur = info->at, end = cur + info->length; cur < end; cur++) { if (cur->key == NULL) continue; if (cur->data) ug_data_free(cur->data); } ug_array_clear(info); } UgPair* ug_info_find(UgInfo* info, const UgDataInfo* key, int* index) { UgPair* end; UgPair* cur; // find key in cache space for (cur = info->at, end = cur + info->cache_length; cur < end; cur++) { if (cur->key == key) return cur; } // find key without cache space info->at += info->cache_length; info->length -= info->cache_length; cur = ug_array_find_sorted(info, &key, ug_array_compare_pointer, index); info->at -= info->cache_length; info->length += info->cache_length; if (index) index[0] += info->cache_length; return cur; } void* ug_info_realloc(UgInfo* info, const UgDataInfo* key) { UgPair* cur; int index; cur = ug_info_find(info, key, &index); if (cur == NULL) { cur = ug_array_insert(info, index, 1); cur->key = (void*) key; cur->data = ug_data_new(key); } else if (cur->data == NULL) cur->data = ug_data_new(key); return cur->data; } void ug_info_remove(UgInfo* info, const UgDataInfo* key) { UgPair* cur; cur = ug_info_find(info, key, NULL); if (cur && cur->data) { ug_data_free(cur->data); cur->data = NULL; } } void* ug_info_set(UgInfo* info, const UgDataInfo* key, void* data) { UgPair* cur; int index; void* result; cur = ug_info_find(info, key, &index); if (cur == NULL) { cur = ug_array_insert(info, index, 1); cur->key = (void*) key; cur->data = NULL; } result = cur->data; cur->data = data; return result; } void* ug_info_get(UgInfo* info, const UgDataInfo* key) { UgPair* cur; cur = ug_info_find(info, key, NULL); if (cur == NULL) return NULL; return cur->data; } void ug_info_assign(UgInfo* info, UgInfo* src, const UgDataInfo* exclude_info) { int index; UgPair* pair; UgData* data; for (index = 0; index < src->length; index++) { pair = src->at + index; if (pair->key == NULL || pair->data == NULL) continue; if (pair->key == exclude_info) continue; data = ug_info_realloc(info, pair->key); ug_data_assign(data, pair->data); } } // UgJsonParseFunc for key/data pairs in UgInfo static UgJsonError ug_json_parse_info_reg(UgJson* json, const char* name, const char* value, void* info, void* infoRegistry) { UgRegistry* registry; UgPair* cur; if (infoRegistry) registry = infoRegistry; else if (ug_info_registry) registry = ug_info_registry; else registry = NULL; if (registry) { if (registry->sorted == FALSE) ug_registry_sort(registry); cur = ug_registry_find(registry, name, NULL); if (cur) { ug_json_push(json, ug_json_parse_entry, ug_info_realloc(info, cur->data), (void*)((UgDataInfo*)cur->data)->entry); return UG_JSON_ERROR_NONE; } } if (json->type >= UG_JSON_OBJECT) ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_CUSTOM; } // ---------------- // JSON parser/writer that used with UG_ENTRY_CUSTOM. // JSON parser for UgInfo pointer. UgJsonError ug_json_parse_info_ptr(UgJson* json, const char* name, const char* value, void** pinfo, void* none) { UgInfo* info = *pinfo; // UgInfo's type is UG_JSON_OBJECT if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_TYPE_NOT_MATCH; } // confirm that target UgInfo is empty. This can avoid parsing UgInfo repeatedly. if (info->length == info->cache_length) ug_json_push(json, ug_json_parse_info_reg, info, NULL); return UG_JSON_ERROR_NONE; } // JSON writer for UgInfo pointer. void ug_json_write_info_ptr(UgJson* json, UgInfo** pinfo) { UgInfo* info = *pinfo; UgPair* cur; UgPair* end; ug_json_write_object_head(json); for (cur = info->at, end = cur + info->length; cur < end; cur++) { if (cur->data == NULL || ((UgDataInfo*)cur->key)->entry == NULL) continue; ug_json_write_string(json, ((UgDataInfo*)cur->key)->name); ug_json_write_object_head(json); ug_json_write_entry(json, cur->data, ((UgDataInfo*)cur->key)->entry); ug_json_write_object_tail(json); } ug_json_write_object_tail(json); } // JSON parser for UgInfo. UgJsonError ug_json_parse_info(UgJson* json, const char* name, const char* value, void* info, void* none) { return ug_json_parse_info_ptr(json, name, value, &info, none); } // JSON writer for UgInfo. void ug_json_write_info(UgJson* json, UgInfo* info) { ug_json_write_info_ptr(json, &info); } uget-2.2.2/uglib/UgThread.c0000664000175000017500000000533513470304403012361 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #if defined _WIN32 || defined _WIN64 #include #include // _beginthreadex int ug_thread_create (UgThread* thread, UgThreadFunc func, void* data) { *thread = _beginthreadex (NULL, 0, // stack size (void*) func, data, 0, NULL); if (*thread) return UG_THREAD_OK; return 1; } int ug_thread_join (UgThread* thread) { DWORD result; result = WaitForSingleObject ((HANDLE) *thread, INFINITE); if (result == WAIT_FAILED || result == WAIT_TIMEOUT) return 1; return UG_THREAD_OK; } void ug_thread_unjoin (UgThread* thread) { // free resource after thread exit CloseHandle ((HANDLE) *thread); } UgThread ug_thread_self (void) { return GetCurrentThreadId (); } void ug_mutex_init (UgMutex* mutex) { *mutex = ug_malloc (sizeof (CRITICAL_SECTION)); InitializeCriticalSection (*mutex); } void ug_mutex_clear (UgMutex* mutex) { DeleteCriticalSection (*mutex); ug_free (*mutex); } void ug_mutex_lock (UgMutex* mutex) { EnterCriticalSection (*mutex); } void ug_mutex_unlock (UgMutex* mutex) { LeaveCriticalSection (*mutex); } #endif // _WIN32 || _WIN64 uget-2.2.2/uglib/UgBuffer.c0000664000175000017500000001024313470304403012355 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include #include void ug_buffer_init_external(UgBuffer* buffer, char* exbuf, int length) { buffer->beg = exbuf; buffer->cur = exbuf; buffer->end = exbuf + length; buffer->more = ug_buffer_restart; } void ug_buffer_init(UgBuffer* buffer, int length) { buffer->beg = ug_malloc(length); buffer->cur = buffer->beg; buffer->end = buffer->beg + length; buffer->more = ug_buffer_expand; } void ug_buffer_clear(UgBuffer* buffer, int free_buffer) { if (free_buffer) ug_free(buffer->beg); buffer->beg = NULL; buffer->cur = NULL; buffer->end = NULL; } void ug_buffer_set_size(UgBuffer* buffer, int length) { char* oldbeg; oldbeg = buffer->beg; buffer->beg = ug_realloc(buffer->beg, length); buffer->cur = buffer->beg + (buffer->cur - oldbeg); buffer->end = buffer->beg + length; } char* ug_buffer_alloc(UgBuffer* buffer, int length) { char* result; int buffer_len; if (buffer->end < buffer->cur + length) { buffer_len = buffer->end - buffer->beg; if (buffer_len < length) buffer_len = length * 2; else buffer_len *= 2; ug_buffer_set_size(buffer, buffer_len); } result = buffer->cur; buffer->cur += length; return result; } // UgBuffer.more() default function for external buffer. int ug_buffer_restart(UgBuffer* buffer) { buffer->cur = buffer->beg; return 1; } // UgBuffer.more() default function for internal buffer. int ug_buffer_expand(UgBuffer* buffer) { int length; length = (buffer->end - buffer->beg) * 2; if (length < 1024) length = 1024; ug_buffer_set_size(buffer, length); return 1; } void ug_buffer_fill(UgBuffer* buffer, char ch, int count) { while (count--) { if (buffer->cur == buffer->end) buffer->more(buffer); *buffer->cur++ = ch; } } int ug_buffer_write(UgBuffer* buffer, const char* string, int length) { const char* end; if (length == -1) length = strlen(string); end = string + length; while (string < end && string[0]) { if (buffer->cur == buffer->end) buffer->more(buffer); *buffer->cur++ = *(uint8_t*)string++; } return length; } void ug_buffer_write_data(UgBuffer* buffer, const char* binary, int length) { const char* end; end = binary + length; while (binary < end) { if (buffer->cur == buffer->end) buffer->more(buffer); *buffer->cur++ = *binary++; } } #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) // C99 or C++ inline function in UgBuffer.h #else void ug_buffer_write_char(UgBuffer* buffer, char ch) { if ((buffer)->cur >= (buffer)->end) (buffer)->more(buffer); *(buffer)->cur++ = (char)(ch); } #endif // __STDC_VERSION__ uget-2.2.2/uglib/UgJsonrpcCurl.h0000664000175000017500000000462313470304403013422 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_JSONRPC_CURL_H #define UG_JSONRPC_CURL_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgJsonrpcCurl UgJsonrpcCurl; // ---------------------------------------------------------------------------- // UgJsonrpcCurl: JSON-RPC by curl (client only) struct UgJsonrpcCurl { UgJson json; UgJsonrpc rpc; UgBuffer buffer; char* url; void* curl; void* slist; long response; int receive_size; }; void ug_jsonrpc_curl_init (UgJsonrpcCurl* jrcurl); void ug_jsonrpc_curl_final (UgJsonrpcCurl* jrcurl); // bool void ug_jsonrpc_curl_set_url (UgJsonrpcCurl* jrhttp, const char* url); int ug_jsonrpc_curl_send (UgJsonrpcCurl* jrcurl); int ug_jsonrpc_curl_receive (UgJsonrpcCurl* jrcurl); #ifdef __cplusplus } #endif #endif // UG_JSONRPC_CURL_H uget-2.2.2/uglib/Makefile.am0000664000175000017500000000244413470304403012544 00000000000000## To enable LFS (Large File Support) in 32bit platform ## add `getconf LFS_CFLAGS` to CFLAGS ## add `getconf LFS_LDFLAGS` to LDFLAGS AUTOMAKE_OPTIONS = no-dependencies ## static library --- # lib_LIBRARIES = libuglib.a noinst_LIBRARIES = libuglib.a libuglib_a_CPPFLAGS = -I$(top_srcdir)/uglib libuglib_a_CFLAGS = @PTHREAD_CFLAGS@ @LFS_CFLAGS@ @CURL_CFLAGS@ @GLIB_CFLAGS@ libuglib_a_SOURCES = \ UgStdio.c \ UgString.c \ UgThread.c \ UgSocket.c \ UgUtil.c \ UgFileUtil.c \ UgArray.c \ UgList.c \ UgSLink.c \ UgOption.c \ UgUri.c \ UgNode.c \ UgData.c \ UgInfo.c \ UgRegistry.c \ UgValue.c \ UgEntry.c \ UgBuffer.c \ UgJson.c \ UgJson-custom.c \ UgJsonFile.c \ UgJsonrpc.c \ UgJsonrpcSocket.c \ UgJsonrpcCurl.c \ UgHtml.c \ UgHtmlEntry.c \ UgHtmlFilter.c noinst_HEADERS = \ UgDefine.h \ UgStdio.h \ UgString.h \ UgThread.h \ UgSocket.h \ UgUtil.h \ UgFileUtil.h \ UgArray.h \ UgList.h \ UgSLink.h \ UgOption.h \ UgUri.h \ UgNode.h \ UgData.h \ UgInfo.h \ UgRegistry.h \ UgValue.h \ UgEntry.h \ UgBuffer.h \ UgJson.h \ UgJson-custom.h \ UgJsonFile.h \ UgJsonrpc.h \ UgJsonrpcSocket.h \ UgJsonrpcCurl.h \ UgHtml.h \ UgHtmlEntry.h \ UgHtmlFilter.h EXTRA_DIST = \ Android.mk \ CMakeLists.txt uget-2.2.2/uglib/UgSLink.h0000664000175000017500000000575013470304403012200 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_SLINK_H #define UG_SLINK_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgSLink UgSLink; typedef struct UgSLinks UgSLinks; // ---------------------------------------------------------------------------- // UgSLink : for Singly-Linked List struct UgSLink { void* data; UgSLink* next; }; // ---------------------------------------------------------------------------- // UgSLinks : array of UgSLink #define UG_SLINKS_MEMBERS \ UG_ARRAY_MEMBERS (UgSLink); \ int n_links; \ UgSLink* used; \ UgSLink* freed \ struct UgSLinks { UG_SLINKS_MEMBERS; /* // ------ UgArray members ------ UgSLink* at; int length; int allocated; int element_size // ------ UgSLinks members ------ int n_links; UgSLink* used; UgSLink* freed; */ }; void ug_slinks_init (UgSLinks* slinks, int allocated_len); void ug_slinks_final (UgSLinks* slinks); void ug_slinks_add (UgSLinks* slinks, void* data); void ug_slinks_remove (UgSLinks* slinks, void* data, UgSLink* prev); void ug_slinks_foreach (UgSLinks* ilinks, UgForeachFunc func, void* user_data); // return NULL if not found. UgSLink* ug_slinks_find (UgSLinks* slinks, void* data, UgSLink** prev); #define ug_slinks_index(slinks, link) ((link) - (slinks)->at) #ifdef __cplusplus } #endif #endif // End of UG_SLINK_H uget-2.2.2/uglib/UgJson-custom.h0000664000175000017500000001202413470304403013371 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ // JSON parser and writer for custom type #ifndef UG_JSON_CUSTOM_H #define UG_JSON_CUSTOM_H #include #include #include #ifdef __cplusplus extern "C" { #endif // ---------------------------------------------------------------------------- // parse and write JSON number as JSON string // below 4 functions can parse JSON number and JSON string. UgJsonError ug_json_parse_int_string(UgJson* json, const char* name, const char* value, void* dest, void* data); UgJsonError ug_json_parse_uint_string(UgJson* json, const char* name, const char* value, void* dest, void* data); UgJsonError ug_json_parse_int64_string(UgJson* json, const char* name, const char* value, void* dest, void* data); UgJsonError ug_json_parse_double_string(UgJson* json, const char* name, const char* value, void* dest, void* data); void ug_json_write_int_string(UgJson* json, int* value); void ug_json_write_uint_string(UgJson* json, unsigned int* value); void ug_json_write_int64_string(UgJson* json, int64_t* value); void ug_json_write_double_string(UgJson* json, double* value); // ---------------------------------------------------------------------------- // parse and write JSON number for C types - uint8_t, int16_t, and int32_t UgJsonError ug_json_parse_uint8(UgJson* json, const char* name, const char* value, void* dest, void* data); UgJsonError ug_json_parse_int16(UgJson* json, const char* name, const char* value, void* dest, void* data); UgJsonError ug_json_parse_int32(UgJson* json, const char* name, const char* value, void* dest, void* data); void ug_json_write_uint8(UgJson* json, uint8_t* value); void ug_json_write_int16(UgJson* json, int16_t* value); void ug_json_write_int32(UgJson* json, int32_t* value); // ---------------------------------------------------------------------------- // parse string "true" and "false" to integer (boolean). // write integer (boolean) to string "true" and "false". UgJsonError ug_json_parse_bool_string(UgJson* json, const char* name, const char* value, void* dest, void* data); void ug_json_write_bool_string(UgJson* json, int* value); // ---------------------------------------------------------------------------- // UgJsonParseFunc and UgJsonWriteFunc for time_t UgJsonError ug_json_parse_time_t(UgJson* json, const char* name, const char* value, void* dest, void* none); void ug_json_write_time_t(UgJson* json, void* src); // ---------------------------------------------------------------------------- // UgJson parse by UgValue: convert UgValue to UgEntry // e.g. // ug_json_begin_parse(json); // ug_json_push(json, ug_json_parse_entry, dest, entry); // ug_json_parse_by_value(json, value); // ug_json_end_parse(json); void ug_json_parse_by_value(UgJson* json, UgValue* value); #ifdef __cplusplus } #endif // __cplusplus #endif // UG_JSON_CUSTOM_H uget-2.2.2/uglib/UgNode.c0000664000175000017500000001077313470304403012041 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GLIB #include // g_slice_xxx #endif // HAVE_GLIB #include #include #include UgNode* ug_node_new (void) { #ifdef HAVE_GLIB return g_slice_alloc0 (sizeof (UgNode)); #else return ug_malloc0 (sizeof (UgNode)); #endif } void ug_node_free (UgNode* link) { #ifdef HAVE_GLIB g_slice_free1 (sizeof (UgNode), link); #else ug_free (link); #endif // HAVE_GLIB } void ug_node_init (UgNode* node) { node->data = NULL; node->next = NULL; node->prev = NULL; node->parent = NULL; node->children = NULL; node->last = NULL; node->n_children = 0; } void ug_node_reverse (UgNode* node) { UgNode* temp; temp = node->last; node->last = node->children; node->children = temp; // warning: node->children is pointing to last now. for (node = temp; node; node = temp) { temp = node->prev; node->prev = node->next; node->next = temp; } } void ug_node_prepend (UgNode* parent, UgNode* node) { if (parent->children) parent->children->prev = node; else // if (parent->last) parent->last = node; node->parent = parent; node->next = parent->children; parent->children = node; parent->n_children++; } void ug_node_append (UgNode* parent, UgNode* node) { if (parent->last) parent->last->next = node; else // if (parent->children) parent->children = node; node->parent = parent; node->prev = parent->last; parent->last = node; parent->n_children++; } void ug_node_insert (UgNode* parent, UgNode *sibling, UgNode* node) { if (sibling == NULL) { ug_node_append (parent, node); return; } if (sibling == parent->children) { ug_node_prepend (parent, node); return; } // if (sibling->prev) sibling->prev->next = node; node->parent = parent; node->next = sibling; node->prev = sibling->prev; sibling->prev = node; parent->n_children++; } void ug_node_remove (UgNode* parent, UgNode* node) { if (parent->last == node) parent->last = node->prev; if (parent->children == node) parent->children = node->next; if (node->next) node->next->prev = node->prev; if (node->prev) node->prev->next = node->next; node->next = NULL; node->prev = NULL; node->parent = NULL; parent->n_children--; } void ug_node_unlink (UgNode* node) { if (node->parent) ug_node_remove (node->parent, node); else { if (node->prev) { node->prev->next = node->next; node->prev = NULL; } if (node->next) { node->next->prev = node->prev; node->next = NULL; } } while (node->children) ug_node_remove (node, node->children); } UgNode* ug_node_nth_child (UgNode* node, int nth) { if (nth >= 0) { for (node = node->children; node; node = node->next, nth--) { if (nth == 0) return node; } } return NULL; } int ug_node_child_position (UgNode* node, UgNode* child) { int position = 0; for (node = node->children; node; node = node->next, position++) { if (node == child) return position; } return -1; } uget-2.2.2/uglib/UgRegistry.h0000664000175000017500000000730413470304403012765 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_REGISTRY_H #define UG_REGISTRY_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgPair UgPair; typedef struct UgRegistry UgRegistry; // ---------------------------------------------------------------------------- // UgPair: key-data pair that is used by UgRegistry and UgInfo struct UgPair { void* key; void* data; }; /* ---------------------------------------------------------------------------- UgRegistry: store UgTypeInfo and it's name and search UgTypeInfo by name. key pointer to UgTypeInfo.name data pointer to UgTypeInfo */ // ---------------------------------------------------------------------------- // UgRegistry functions void ug_registry_init(UgRegistry* reg); void ug_registry_final(UgRegistry* reg); void ug_registry_add(UgRegistry* reg, const void* type_info); void ug_registry_remove(UgRegistry* reg, const void* type_info); UgPair* ug_registry_find(UgRegistry* reg, const char* type_name, int* index); void ug_registry_sort(UgRegistry* reg); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // UgRegistry structure struct UgRegistry { UG_ARRAY_MEMBERS(UgPair); /* // ------ UgArray members ------ UgPair* at; int length; int allocated; int element_size; */ int sorted; #ifdef __cplusplus inline void init(void) { ug_registry_init(this); } inline void final(void) { ug_registry_final(this); } inline void add(const void* typeInfo) { ug_registry_add(this, typeInfo); } inline void remove(const void* typeInfo) { ug_registry_remove(this, typeInfo); } inline UgPair* find(const char* typeName, int* index = NULL) { return ug_registry_find(this, typeName, index); } #endif // __cplusplus }; // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This two is for directly use only. You can NOT derived it. typedef struct UgPair Pair; typedef struct UgRegistry Registry; }; // namespace Ug #endif // __cplusplus #endif // UG_REGISTRY_H uget-2.2.2/uglib/UgList.h0000664000175000017500000001412513470304403012067 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_LIST_H #define UG_LIST_H // uintptr_t is an unsigned int that is guaranteed to be the same size as a pointer. #include // uintptr_t, intptr_t #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct UgLink UgLink; typedef struct UgList UgList; // ---------------------------------------------------------------------------- // UgLink #define UG_LINK_MEMBERS(LinkType, DataType, DataName) \ DataType* DataName; \ LinkType* next; \ LinkType* prev #define UG_LINK_INT_MEMBERS(LinkType, DataName) \ intptr_t DataName; \ LinkType* next; \ LinkType* prev #define UG_LINK_UINT_MEMBERS(LinkType, DataName) \ uintptr_t DataName; \ LinkType* next; \ LinkType* prev struct UgLink { UG_LINK_MEMBERS (UgLink, void, data); // void* data; // uintptr_t size // UgLink* next; // head // UgLink* prev; // tail }; UgLink* ug_link_new (void); void ug_link_free (UgLink* link); // ---------------------------------------------------------------------------- // UgList is used by UgEntry with UG_ENTRY_LIST. // UgList doesn't support UG_ENTRY_INT64, UG_ENTRY_DOUBLE, and UG_ENTRY_OBJECT #define UG_LIST_MEMBERS(LinkType) \ uintptr_t size; \ LinkType* head; \ LinkType* tail struct UgList { UG_LIST_MEMBERS (UgLink); // uintptr_t size; // UgLink* head; // UgLink* tail; }; // if all links in list were created by ug_link_new(), // ug_list_clear (list, TRUE) can free them. void ug_list_init (UgList* list); void ug_list_clear (UgList* list, int free_links); void ug_list_foreach (UgList* list, UgForeachFunc func, void* data); void ug_list_foreach_link (UgList* list, UgForeachFunc func, void* data); void ug_list_prepend (UgList* list, UgLink* link); void ug_list_append (UgList* list, UgLink* link); void ug_list_insert (UgList* list, UgLink* sibling, UgLink* link); void ug_list_remove (UgList* list, UgLink* link); int ug_list_position(UgList* list, UgLink* link); // ---------------------------------------------------------------------------- // UgJsonParseFunc for JSON array elements UgJsonError ug_json_parse_list_bool (UgJson* json, const char* name, const char* value, void* list, void* none); UgJsonError ug_json_parse_list_int (UgJson* json, const char* name, const char* value, void* list, void* none); UgJsonError ug_json_parse_list_uint (UgJson* json, const char* name, const char* value, void* list, void* none); UgJsonError ug_json_parse_list_string (UgJson* json, const char* name, const char* value, void* list, void* none); // ---------------------------------------------------------------------------- // write JSON array elements // If you use these functions in UgEntry, UgEntry.type must be UG_ENTRY_ARRAY void ug_json_write_list_bool (UgJson* json, UgList* list); void ug_json_write_list_int (UgJson* json, UgList* list); void ug_json_write_list_uint (UgJson* json, UgList* list); void ug_json_write_list_string (UgJson* json, UgList* list); #ifdef __cplusplus } #endif // ---------------------------------------------------------------------------- // C++11 standard-layout #ifdef __cplusplus namespace Ug { // This one is for directly use only. You can NOT derived it. typedef struct UgLink Link; // This one is for derived use only. No data members here. // Your derived struct/class must be C++11 standard-layout struct ListMethod { inline void init (void) { ug_list_init ((UgList*) this); } inline void clear (bool freeLinks = false) { ug_list_clear ((UgList*) this, (int)freeLinks); } inline void foreach (UgForeachFunc func, void* data) { ug_list_foreach ((UgList*) this, func, data); } inline void prepend (UgLink* link) { ug_list_prepend ((UgList*) this, link); } inline void append (UgLink* link) { ug_list_append ((UgList*) this, link); } inline void insert (UgLink* sibling, UgLink* link) { ug_list_insert ((UgList*) this, sibling, link); } inline void remove (UgLink* link) { ug_list_remove ((UgList*) this, link); } }; // This one is for directly use only. You can NOT derived it. struct List : ListMethod, UgList { inline List (void) { ug_list_init (this); } }; }; // namespace Ug #endif // __cplusplus #endif // UG_LIST_H uget-2.2.2/uglib/UgJsonrpc.c0000664000175000017500000003733713470304403012577 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifdef DEBUG #include #endif // DEBUG #include #include #include // ---------------------------------------------------------------------------- // UgJsonrpcError: JSON-RPC error object const UgEntry UgJsonrpcErrorEntry[] = { {"code", offsetof(UgJsonrpcError, code), UG_ENTRY_INT, NULL, NULL}, {"message", offsetof(UgJsonrpcError, message), UG_ENTRY_STRING, NULL, NULL}, {"data", offsetof(UgJsonrpcError, data), UG_ENTRY_CUSTOM, ug_json_parse_value, ug_json_write_value}, {NULL}, }; void ug_jsonrpc_error_init(UgJsonrpcError* error) { memset(error, 0, sizeof(UgJsonrpcError)); } void ug_jsonrpc_error_clear(UgJsonrpcError* error) { // error ug_free(error->message); error->message = NULL; error->code = 0; ug_value_clear(&error->data); } // ---------------------------------------------------------------------------- // UgJsonrpcObject const UgEntry UgJsonrpcObjectEntry[] = { // {"jsonrpc", offsetof(UgJsonrpcObject, jsonrpc), UG_ENTRY_STRING, // NULL, NULL}, {"id", offsetof(UgJsonrpcObject, id), UG_ENTRY_CUSTOM, ug_json_parse_value, ug_json_write_value}, {"method", offsetof(UgJsonrpcObject, method), UG_ENTRY_STRING, NULL, UG_ENTRY_NO_NULL}, {"params", offsetof(UgJsonrpcObject, params), UG_ENTRY_CUSTOM, ug_json_parse_value, ug_json_write_value}, {"result", offsetof(UgJsonrpcObject, result), UG_ENTRY_CUSTOM, ug_json_parse_value, ug_json_write_value}, {"error", offsetof(UgJsonrpcObject, error), UG_ENTRY_OBJECT, (void*)UgJsonrpcErrorEntry, NULL}, {NULL}, }; UgJsonrpcObject* ug_jsonrpc_object_new(void) { UgJsonrpcObject* jobj; jobj = ug_malloc0(sizeof(UgJsonrpcObject)); return jobj; } void ug_jsonrpc_object_free(UgJsonrpcObject* jobj) { // check NULL for uget_aria2_unref() if (jobj) { ug_jsonrpc_object_clear(jobj); ug_free(jobj); } } void ug_jsonrpc_object_init(UgJsonrpcObject* jobj) { memset(jobj, 0, sizeof(UgJsonrpcObject)); } void ug_jsonrpc_object_clear(UgJsonrpcObject* jobj) { if (jobj == NULL) return; // jsonrpc // ug_free(jobj->jsonrpc); // jobj->jsonrpc = NULL; // id ug_value_clear(&jobj->id); // method ug_free(jobj->method); jobj->method = NULL; jobj->method_static = NULL; // params ug_value_clear(&jobj->params); // result ug_value_clear(&jobj->result); // error ug_jsonrpc_error_clear(&jobj->error); } void ug_jsonrpc_object_clear_request(UgJsonrpcObject* jobj) { ug_free(jobj->method); jobj->method = NULL; jobj->method_static = NULL; ug_value_clear(&jobj->params); } void ug_jsonrpc_object_clear_response(UgJsonrpcObject* jobj) { ug_value_clear(&jobj->result); ug_jsonrpc_error_clear(&jobj->error); } void ug_json_write_rpc_object(UgJson* json, UgJsonrpcObject* jobj) { ug_json_write_object_head(json); // jsonrpc ug_json_write_string(json, "jsonrpc"); ug_json_write_string(json, "2.0"); // ug_json_write_string(json, (jobj->jsonrpc) ? jobj->jsonrpc : "2.0"); // id if (jobj->id.type != UG_VALUE_NONE) { if (jobj->id.name == NULL) ug_json_write_string(json, "id"); ug_json_write_value(json, &jobj->id); } if (jobj->result.type == UG_VALUE_NONE && jobj->error.code == 0) { if (jobj->method || jobj->method_static) { ug_json_write_string(json, "method"); ug_json_write_string(json, (jobj->method_static)? jobj->method_static : jobj->method); if (jobj->params.type != UG_VALUE_NONE) { if (jobj->params.name == NULL) ug_json_write_string(json, "params"); ug_json_write_value(json, &jobj->params); } } } else if (jobj->result.type != UG_VALUE_NONE) { if (jobj->result.name == NULL) ug_json_write_string(json, "result"); ug_json_write_value(json, &jobj->result); } else { ug_json_write_string(json, "error"); ug_json_write_object_head(json); ug_json_write_entry(json, &jobj->error, UgJsonrpcErrorEntry); ug_json_write_object_tail(json); } ug_json_write_object_tail(json); } // ---------------------------------------------------------------------------- // UgJsonrpcArray: a UgJsonrpcObject array //void ug_jsonrpc_array_init(UgJsonrpcArray* joarray, int allocated_len); void ug_jsonrpc_array_clear(UgJsonrpcArray* joarray, int free_objects) { if (free_objects) { ug_array_foreach_ptr(joarray, (UgForeachFunc) ug_jsonrpc_object_clear, NULL); } ug_array_clear(joarray); } UgJsonrpcObject* ug_jsonrpc_array_find(UgJsonrpcArray* joarray, UgValue* id, int* index) { UgJsonrpcObject** cur; UgJsonrpcObject** end; UgJsonrpcObject* result = NULL; cur = joarray->at; end = cur + joarray->length; if (id->type == UG_VALUE_INT) { for (; cur < end; cur++) { // "cur[0] != NULL" for uget_aria2_match_response() if (cur[0] != NULL && cur[0]->id.type == UG_VALUE_INT && cur[0]->id.c.integer == id->c.integer) { result = *cur; break; } } } else if (id->type == UG_VALUE_STRING) { for (; cur < end; cur++) { if (cur[0]->id.type == UG_VALUE_STRING && strcmp(cur[0]->id.c.string, id->c.string) == 0) { result = *cur; break; } } } if (result && index) index[0] = cur - joarray->at; return result; } UgJsonrpcObject* ug_jsonrpc_array_alloc(UgJsonrpcArray* joarray) { UgJsonrpcObject** jobj; jobj = ug_array_alloc(joarray, 1); *jobj = ug_jsonrpc_object_new(); return *jobj; } UgJsonError ug_json_parse_rpc_array(UgJson* json, const char* name, const char* value, void* jrarray, void* none) { UgJsonrpcArray* array; UgJsonrpcObject* object; array = (UgJsonrpcArray*) jrarray; if (json->type != UG_JSON_OBJECT) { // if (json->type == UG_JSON_ARRAY) // ug_json_push(json, ug_json_parse_unknown, NULL, NULL); return UG_JSON_ERROR_RPC_INVALID; } object = ug_jsonrpc_array_alloc(array); ug_json_push(json, ug_json_parse_entry, object, (void*)UgJsonrpcObjectEntry); return UG_JSON_ERROR_NONE; } void ug_json_write_rpc_array(UgJson* json, UgJsonrpcArray* objects, int noArrayIfPossible) { UgJsonrpcObject** cur; UgJsonrpcObject** end; if (noArrayIfPossible == FALSE || objects->length > 1) ug_json_write_array_head(json); end = objects->at + objects->length; cur = objects->at; for (; cur < end; cur++) ug_json_write_rpc_object(json, *cur); if (noArrayIfPossible == FALSE || objects->length > 1) ug_json_write_array_tail(json); } // ---------------------------------------------------------------------------- // UgJsonrpc: JSON-RPC void ug_jsonrpc_init(UgJsonrpc* jrpc, UgJson* json, UgBuffer* buffer) { jrpc->json = json; jrpc->buffer = buffer; jrpc->data.id.previous = 0; jrpc->data.id.current = 0; } void ug_jsonrpc_clear(UgJsonrpc* jrpc) { } // ------------------------------------ // client API : set response == NULL if this is notify request int ug_jsonrpc_call(UgJsonrpc* jrpc, UgJsonrpcObject* request, UgJsonrpcObject* response) { int n; // if (jrpc->send.func == NULL || jrpc->receive.func == NULL) // return -1; jrpc->error = 0; // write --- start --- ug_json_begin_write(jrpc->json, 0, jrpc->buffer); // notify does NOT have id if (request->id.type != UG_VALUE_NONE) ug_value_clear(&request->id); if (response) { request->id.type = UG_VALUE_INT; request->id.c.integer = jrpc->data.id.current++; } ug_json_write_rpc_object(jrpc->json, request); ug_json_end_write(jrpc->json); // write --- end --- #ifdef DEBUG printf("\n%.*s\n", jrpc->buffer->cur - jrpc->buffer->beg, jrpc->buffer->beg); #endif // DEBUG // parser --- start --- ug_json_begin_parse(jrpc->json); if (response == NULL) { ug_json_push(jrpc->json, ug_json_parse_unknown, NULL, NULL); } else { ug_json_push(jrpc->json, ug_json_parse_entry, response, (void*)UgJsonrpcObjectEntry); ug_json_push(jrpc->json, ug_json_parse_object, NULL, NULL); } // send request n = jrpc->send.func(jrpc->send.data); if (n == -1) return -1; // notify does NOT have id. // If no new id assigned, you will not get any response. if (jrpc->data.id.previous == jrpc->data.id.current) return 0; jrpc->data.id.previous = jrpc->data.id.current; n = jrpc->receive.func(jrpc->receive.data); if (n == -1) return -1; n = ug_json_end_parse(jrpc->json); if (n < 0 || jrpc->error == 0) jrpc->error = n; // parser --- end --- return 0; // no error } int ug_jsonrpc_call_batch(UgJsonrpc* jrpc, UgJsonrpcArray* request, UgJsonrpcArray* response) { UgJsonrpcObject** cur; UgJsonrpcObject** end; int n; // if (jrpc->send.func == NULL || jrpc->receive.func == NULL) // return -1; jrpc->error = 0; if (request->length == 0) return 0; // write --- start --- ug_json_begin_write(jrpc->json, 0, jrpc->buffer); ug_json_write_array_head(jrpc->json); cur = request->at; end = request->at + request->length; for (; cur < end; cur++) { if (cur[0] == NULL) continue; // notify does NOT have id if (cur[0]->id.type != UG_VALUE_NONE) { ug_value_clear(&cur[0]->id); cur[0]->id.type = UG_VALUE_INT; cur[0]->id.c.integer = jrpc->data.id.current++; } ug_json_write_rpc_object(jrpc->json, cur[0]); } ug_json_write_array_tail(jrpc->json); ug_json_end_write(jrpc->json); // write --- end --- #ifdef DEBUG printf("\n%.*s\n", jrpc->buffer->cur - jrpc->buffer->beg, jrpc->buffer->beg); #endif // parser --- start --- ug_json_begin_parse(jrpc->json); if (response == NULL) ug_json_push(jrpc->json, ug_json_parse_unknown, NULL, NULL); else { ug_json_push(jrpc->json, ug_json_parse_rpc_array, response, NULL); ug_json_push(jrpc->json, ug_json_parse_array, NULL, NULL); } // send request n = jrpc->send.func(jrpc->send.data); if (n == -1) return -1; // notify does NOT have id. // If no new id assigned, you will not get any response. if (jrpc->data.id.previous == jrpc->data.id.current) return 0; jrpc->data.id.previous = jrpc->data.id.current; n = jrpc->receive.func(jrpc->receive.data); if (n == -1) return -1; n = ug_json_end_parse(jrpc->json); if (n < 0 || jrpc->error == 0) jrpc->error = n; // parser --- end --- return 0; // no error } // ------------------------------------ // server API int ug_jsonrpc_receive(UgJsonrpc* jrpc, UgJsonrpcObject* jr_object, UgJsonrpcArray* jr_array) { int n; int type; UgJsonrpcObject* jres; type = -1; jrpc->error = 0; jrpc->data.request.object = jr_object; jrpc->data.request.array = jr_array; // parser --- start --- ug_json_begin_parse(jrpc->json); ug_json_push(jrpc->json, ug_json_parse_rpc_request, jrpc, &type); // receive request n = jrpc->receive.func(jrpc->receive.data); if (n <= 0) { ug_json_end_parse(jrpc->json); return n; } n = ug_json_end_parse(jrpc->json); if (n < 0 || jrpc->error == 0) jrpc->error = n; // parser --- end --- if (jrpc->error == UG_JSON_ERROR_UNCOMPLETED) { // {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null} jres = ug_jsonrpc_object_new(); // "id": null jres->id.type = UG_VALUE_STRING; jres->id.c.string = NULL; // "error": {"code": -32700, "message": "Parse error"} jres->error.code = -32700; jres->error.message = "Parse error"; // send response to client ug_jsonrpc_response(jrpc, jres); // clear response jres->error.message = NULL; ug_jsonrpc_object_free(jres); return -1; } if (type < UG_JSON_OBJECT) { // {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null} jres = ug_jsonrpc_object_new(); // "id": null jres->id.type = UG_VALUE_STRING; jres->id.c.string = NULL; // "error": {"code": -32600, "message": "Invalid Request"} jres->error.code = -32600; jres->error.message = "Invalid Request"; // send response to client ug_jsonrpc_response(jrpc, jres); // clear response jres->error.message = NULL; ug_jsonrpc_object_free(jres); return -1; } return type; } int ug_jsonrpc_response(UgJsonrpc* jrpc, UgJsonrpcObject* response) { int n; // if (jrpc->send.func == NULL || jrpc->receive.func == NULL) // return -1; jrpc->error = 0; // write --- start --- ug_json_begin_write(jrpc->json, 0, jrpc->buffer); ug_json_write_rpc_object(jrpc->json, response); ug_json_end_write(jrpc->json); // write --- end --- // send responses n = jrpc->send.func(jrpc->send.data); if (n == -1) return -1; return n; } int ug_jsonrpc_response_batch(UgJsonrpc* jrpc, UgJsonrpcArray* responses) { UgJsonrpcObject** cur; UgJsonrpcObject** end; int n; // if (jrpc->send.func == NULL || jrpc->receive.func == NULL) // return -1; jrpc->error = 0; if (responses->length == 0) return 0; // write --- start --- ug_json_begin_write(jrpc->json, 0, jrpc->buffer); ug_json_write_array_head(jrpc->json); cur = responses->at; end = responses->at + responses->length; for (n = 0; cur < end; cur++) { // don't output NULL object if (cur[0] == NULL) continue; // output object and increase count ug_json_write_rpc_object(jrpc->json, cur[0]); n++; } ug_json_write_array_tail(jrpc->json); ug_json_end_write(jrpc->json); // write --- end --- // if no object outputted, don't send response if (n == 0) return 0; // send responses n = jrpc->send.func(jrpc->send.data); if (n == -1) return -1; return n; } UgJsonError ug_json_parse_rpc_request(UgJson* json, const char* name, const char* value, void* jsonrpc, void* type) { UgJsonrpc* jrpc = jsonrpc; switch (json->type) { case UG_JSON_OBJECT: *(int*)type = UG_JSON_OBJECT; if (jrpc->data.request.object == NULL) break; ug_json_push(json, ug_json_parse_entry, jrpc->data.request.object, (void*)UgJsonrpcObjectEntry); return ug_json_parse_entry(json, name, value, jrpc->data.request.object, (void*)UgJsonrpcObjectEntry); case UG_JSON_ARRAY: *(int*)type = UG_JSON_ARRAY; if (jrpc->data.request.array == NULL) break; ug_json_push(json, ug_json_parse_rpc_array, jrpc->data.request.array, NULL); return ug_json_parse_rpc_array(json, name, value, jrpc->data.request.array, NULL); default: *(int*)type = json->type; return UG_JSON_ERROR_RPC_INVALID; } return UG_JSON_ERROR_NONE; } uget-2.2.2/uglib/UgHtml.h0000664000175000017500000001262013470304403012056 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #ifndef UG_HTML_H #define UG_HTML_H #include #ifdef __cplusplus extern "C" { #endif typedef struct UgHtml UgHtml; typedef struct UgHtmlParser UgHtmlParser; typedef enum { UG_HTML_ERROR_NONE = 0, UG_HTML_ERROR_BAD_ELEMENT = -1, UG_HTML_ERROR_BAD_ENTITY = -2, UG_HTML_ERROR_BAD_ATTRIBUTE = -3, UG_HTML_ERROR_UNKNOWN_ENTITY = 1, } UgHtmlError; // ---------------------------------------------------------------------------- // UgHtml : simple and uncompleted parser. struct UgHtml { // buffer is used by parser & writer struct { char* at; int length; int allocated; } buf; // stack of parser // index 0, 2, 4, 6... : UgHtmlParser* parser // index 1, 3, 5, 7... : void* user_data UgArrayPtr stack; // attribute name & value for callback UgArrayPtr attr_names; UgArrayPtr attr_values; const char* element_name; int name_beg_pos; int name_end_pos; int entity; uint8_t error; uint8_t state; uint8_t tag_state; uint8_t equ; }; UgHtml* ug_html_new (void); void ug_html_free (UgHtml* uhtml); void ug_html_init (UgHtml* uhtml); void ug_html_final (UgHtml* uhtml); void ug_html_push (UgHtml* uhtml, const UgHtmlParser* parser, void* dest, void* data); void ug_html_pop (UgHtml* uhtml); // use ug_html_push() to push UgHtmlParser before you call thus function. int ug_html_parse_file (UgHtml* uhtml, const char* file_utf8); void ug_html_begin_parse (UgHtml* uhtml); UgHtmlError ug_html_end_parse (UgHtml* uhtml); UgHtmlError ug_html_parse (UgHtml* uhtml, const char* buffer, int buffer_len); // ---------------------------------------------------------------------------- // UgHtmlParser typedef void (*UgHtmlParserStartElementFunc) (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest, void* data); typedef void (*UgHtmlParserEndElementFunc) (UgHtml* uhtml, const char* element_name, void* dest, void* data); typedef void (*UgHtmlParserTextFunc) (UgHtml* uhtml, const char* text, int text_len, void* dest, void* data); // This one is similar to GMarkupParser struct UgHtmlParser { /* Called for open tags */ UgHtmlParserStartElementFunc start_element; // void (*start_element) (UgHtml* uhtml, // const char* element_name, // const char** attribute_names, // const char** attribute_values, // void* dest, // void* data); /* Called for close tags */ UgHtmlParserEndElementFunc end_element; // void (*end_element) (UgHtml* uhtml, // const char* element_name, // void* dest, // void* data); /* Called for character data */ /* text is not null-terminated */ UgHtmlParserTextFunc text; // void (*text) (UgHtml* uhtml, // const char* text, // int text_len, // void* dest, // void* data); }; #ifdef __cplusplus } #endif #endif // UG_HTML_H uget-2.2.2/uglib/UgHtmlFilter.c0000664000175000017500000001667513470304403013235 00000000000000/* * * Copyright (C) 2012-2019 by C.H. Huang * plushuang.tw@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * --- * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU Lesser General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include #include #include static UgHtmlParser default_parser; static UgHtmlParser script_parser; static UgHtmlParser head_parser; UgHtmlFilter* ug_html_filter_new (void) { UgHtmlFilter* filter; filter = ug_malloc (sizeof (UgHtmlFilter)); ug_html_init ((UgHtml*) filter); filter->base_href = NULL; filter->charset = NULL; ug_list_init (&filter->tags); ug_html_push ((UgHtml*)filter, &default_parser, NULL, NULL); return (UgHtmlFilter*) filter; } void ug_html_filter_free (UgHtmlFilter* filter) { ug_free (filter->base_href); ug_free (filter->charset); ug_list_foreach (&filter->tags, (UgForeachFunc) ug_html_filter_tag_unref, NULL); ug_list_clear (&filter->tags, FALSE); ug_free (filter); } void ug_html_filter_add_tag (UgHtmlFilter* filter, UgHtmlFilterTag* tag) { ug_list_prepend (&filter->tags, (UgLink*) tag); ug_html_filter_tag_ref (tag); tag->filter = filter; } int ug_html_filter_parse_file (UgHtmlFilter* filter, const char* file_utf8) { UgHtml* uhtml; uhtml = (UgHtml*) filter; ug_html_push (uhtml, &default_parser, NULL, NULL); return ug_html_parse_file (uhtml, file_utf8); } // ---------------------------------------------------------------------------- // UgHtmlFilterTag UgHtmlFilterTag* ug_html_filter_tag_new (char* element_name, char* attr_name) { UgHtmlFilterTag* tag; tag = ug_malloc0 (sizeof (UgHtmlFilterTag)); tag->self = tag; tag->tag_name = ug_strdup (element_name); tag->attr_name = ug_strdup (attr_name); ug_list_init (&tag->attr_values); tag->ref_count = 1; return tag; } void ug_html_filter_tag_ref (UgHtmlFilterTag* tag) { tag->ref_count++; } void ug_html_filter_tag_unref (UgHtmlFilterTag* tag) { tag->ref_count--; if (tag->ref_count == 0) { ug_free (tag->tag_name); ug_free (tag->attr_name); ug_list_foreach (&tag->attr_values, (UgForeachFunc) ug_free, NULL); ug_list_clear (&tag->attr_values, TRUE); ug_free (tag); } } // ---------------------------------------------------------------------------- // default parser static void cb_start_element (UgHtml* uhtml, const char* element_name, const char** attribute_names, const char** attribute_values, void* dest) { UgHtmlFilter* filter = (UgHtmlFilter*) uhtml; UgHtmlFilterTag* tag; UgLink* link; UgLink* strlink; if (strcasecmp (element_name, "script") == 0) { ug_html_push (uhtml, &script_parser, NULL, NULL); return; } if (strcasecmp (element_name, "head") == 0) { ug_html_push (uhtml, &head_parser, NULL, NULL); return; } // filter tag for (link = filter->tags.head; link; link = link->next) { tag = link->data; if (strcasecmp (element_name, tag->tag_name) != 0) continue; for (; *attribute_names; attribute_names++, attribute_values++) { if (strcasecmp (*attribute_names, tag->attr_name) != 0) continue; if (tag->callback) tag->callback (tag, *attribute_values, tag->callback_data); else { strlink = ug_link_new (); strlink->data = ug_strdup (*attribute_values); ug_list_prepend (&tag->attr_values, strlink); } } } } static UgHtmlParser default_parser = { (void*) cb_start_element, (void*) NULL, (void*) NULL, }; // ---------------------------------------------------------------------------- // parser -