aboutsummaryrefslogtreecommitdiffstats
path: root/po/sr.po
diff options
context:
space:
mode:
authorМирослав Николић <miroslavnikolic@rocketmail.com>2012-02-14 17:42:01 +0800
committerМирослав Николић <miroslavnikolic@rocketmail.com>2012-02-14 17:44:12 +0800
commit8c9a2609082a460a444565ee35a12f4b1645dc7a (patch)
tree707d6d35e2f892e73aa71b8b7e92dfcbb57e97b8 /po/sr.po
parent86e3ff6896aeb036697648ed80e4e9fc099be83a (diff)
downloadgsoc2013-evolution-8c9a2609082a460a444565ee35a12f4b1645dc7a.tar.gz
gsoc2013-evolution-8c9a2609082a460a444565ee35a12f4b1645dc7a.tar.zst
gsoc2013-evolution-8c9a2609082a460a444565ee35a12f4b1645dc7a.zip
Updated Serbian translation
Diffstat (limited to 'po/sr.po')
-rw-r--r--po/sr.po318
1 files changed, 41 insertions, 277 deletions
diff --git a/po/sr.po b/po/sr.po
index 60ca36489a..5844c847aa 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: evolution\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=evolut"
"ion&keywords=I18N+L10N&component=Miscellaneous\n"
-"POT-Creation-Date: 2012-02-07 17:44+0000\n"
-"PO-Revision-Date: 2012-02-10 21:50+0200\n"
+"POT-Creation-Date: 2012-02-13 14:41+0000\n"
+"PO-Revision-Date: 2012-02-14 10:37+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n"
@@ -2156,7 +2156,6 @@ msgstr ""
"календар који прихвата заказивање."
#: ../calendar/calendar.error.xml.h:79
-#| msgid "Cannot save event"
msgid "Cannot save task"
msgstr "Не могу да сачувам задатак"
@@ -2333,7 +2332,6 @@ msgid "Occurs"
msgstr "Дешавања"
#: ../calendar/gui/caltypes.xml.h:21
-#| msgid "is less than"
msgid "Less Than"
msgstr "Мање од"
@@ -2342,7 +2340,6 @@ msgid "Exactly"
msgstr "Тачно"
#: ../calendar/gui/caltypes.xml.h:23
-#| msgid "Korean"
msgid "More Than"
msgstr "Више од"
@@ -3755,7 +3752,6 @@ msgid "Task cannot be fully edited, because you are not the organizer"
msgstr "Задатак није могуће потпуно уредити, зато што нисте организатор"
#: ../calendar/gui/dialogs/task-page.c:297
-#| msgid "Task cannot be edited, because the selected task list is read only"
msgid ""
"Task cannot be edited, because the selected task list does not support "
"assigned tasks"
@@ -7556,7 +7552,6 @@ msgstr "Подесите налоге е-поште"
#: ../data/org.gnome.evolution.addressbook.gschema.xml.in.h:1
#: ../modules/addressbook/apps_evolution_addressbook.schemas.in.h:21
-#| msgid "Calendar information"
msgid "Enable address formatting"
msgstr "Укљчивање обликовања адресе"
@@ -7648,7 +7643,6 @@ msgid "Show maps"
msgstr "Прикажи мапе"
#: ../data/org.gnome.evolution.addressbook.gschema.xml.in.h:16
-#| msgid "Whether to show maps in preview pane."
msgid "Whether to show maps in preview pane"
msgstr "Да ли да прикаже мапе у површи за преглед"
@@ -7666,9 +7660,6 @@ msgid "Primary address book"
msgstr "Примарни адресар"
#: ../data/org.gnome.evolution.addressbook.gschema.xml.in.h:18
-#| msgid ""
-#| "The UID of the selected (or \"primary\") address book in the sidebar of "
-#| "the \"Contacts\" view."
msgid ""
"The UID of the selected (or \"primary\") address book in the sidebar of the "
"\"Contacts\" view"
@@ -7716,7 +7707,6 @@ msgid "Birthday and anniversary reminder value"
msgstr "Вредности подсетника на рођендане и годишњице"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:4
-#| msgid "Number of units for determining a birthday or anniversary reminder."
msgid "Number of units for determining a birthday or anniversary reminder"
msgstr "Број јединица за одређивање подсетника на рођендане или годишњице"
@@ -7726,15 +7716,11 @@ msgid "Birthday and anniversary reminder units"
msgstr "Јединице подсетника на рођендане и годишњице"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:6
-#| msgid ""
-#| "Units for a birthday or anniversary reminder, \"minutes\", \"hours\" or "
-#| "\"days\"."
msgid ""
"Units for a birthday or anniversary reminder, \"minutes\", \"hours\" or "
"\"days\""
msgstr ""
-"Јединице за подсетник на рођендане или годишњице, „минути“, „сати“ или "
-"„дани“"
+"Јединице за подсетник на рођендане или годишњице, „минути“, „сати“ или „дани“"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:7
#: ../modules/calendar/apps_evolution_calendar.schemas.in.h:63
@@ -7742,9 +7728,6 @@ msgid "Compress weekends in month view"
msgstr "Сажми викенде у месечни преглед"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:8
-#| msgid ""
-#| "Whether to compress weekends in the month view, which puts Saturday and "
-#| "Sunday in the space of one weekday."
msgid ""
"Whether to compress weekends in the month view, which puts Saturday and "
"Sunday in the space of one weekday"
@@ -7758,8 +7741,6 @@ msgid "Ask for confirmation when deleting items"
msgstr "Тражи потврду за брисање ставки"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:10
-#| msgid ""
-#| "Whether to ask for confirmation when deleting an appointment or task."
msgid "Whether to ask for confirmation when deleting an appointment or task"
msgstr "Да ли да тражи потврду за брисање заказивања или задатка"
@@ -7769,8 +7750,6 @@ msgid "Confirm expunge"
msgstr "Потврди пражњење"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:12
-#| msgid ""
-#| "Whether to ask for confirmation when expunging appointments and tasks."
msgid "Whether to ask for confirmation when expunging appointments and tasks"
msgstr "Да ли да тражи потврду при избацивањузаказивања или задатка"
@@ -7780,9 +7759,6 @@ msgid "Month view vertical pane position"
msgstr "Позиција усправне површи Месечног прегледа"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:14
-#| msgid ""
-#| "Position of the vertical pane, between the calendar lists and the date "
-#| "navigator calendar."
msgid ""
"Position of the vertical pane, between the calendar lists and the date "
"navigator calendar"
@@ -7796,7 +7772,6 @@ msgid "Workday end hour"
msgstr "Час којим се завршава радни дан"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:16
-#| msgid "Hour the workday ends on, in twenty four hour format, 0 to 23."
msgid "Hour the workday ends on, in twenty four hour format, 0 to 23"
msgstr ""
"Сат којим се завршава радна недеља, у двадесетчетворочасовном облику, од 0 "
@@ -7839,9 +7814,6 @@ msgid "The second timezone for a Day View"
msgstr "Друга временска зона у Дневном прегледу"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:24
-#| msgid ""
-#| "Shows the second time zone in a Day View, if set. Value is similar to one "
-#| "used in a 'timezone' key."
msgid ""
"Shows the second time zone in a Day View, if set. Value is similar to one "
"used in a 'timezone' key"
@@ -7855,19 +7827,14 @@ msgid "Recently used second time zones in a Day View"
msgstr "Недавно коришћене друге временске зоне у Дневном прегледу"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:26
-#| msgid "List of recently used second time zones in a Day View."
msgid "List of recently used second time zones in a Day View"
msgstr "Списак недавно коришћених других временских зона у Дневном прегледу"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:27
-#| msgid "Maximum number of recently used timezones to remember."
msgid "Maximum number of recently used timezones to remember"
msgstr "Највећи број недавно коришћених временских зона за памћење"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:28
-#| msgid ""
-#| "Maximum number of recently used timezones to remember in a "
-#| "'day_second_zones' list."
msgid ""
"Maximum number of recently used timezones to remember in a 'day-second-"
"zones' list"
@@ -7881,7 +7848,6 @@ msgid "Default reminder value"
msgstr "Подразумевана вредност подсетника"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:30
-#| msgid "Number of units for determining a default reminder."
msgid "Number of units for determining a default reminder"
msgstr "Број јединица за одређивање подразумеваног подсетника"
@@ -7891,7 +7857,6 @@ msgid "Default reminder units"
msgstr "Подразумеване јединице подсетника"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:32
-#| msgid "Units for a default reminder, \"minutes\", \"hours\" or \"days\"."
msgid "Units for a default reminder, \"minutes\", \"hours\" or \"days\""
msgstr "Јединице за подразумевани подсетник, „минути“, „сати“ или „дани“"
@@ -7964,7 +7929,6 @@ msgid "Hide completed tasks"
msgstr "Сакриј завршене задатке"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:46
-#| msgid "Whether to hide completed tasks in the tasks view."
msgid "Whether to hide completed tasks in the tasks view"
msgstr "Да ли да сакрије завршене задатке у прегледу задатака"
@@ -7974,9 +7938,6 @@ msgid "Hide task units"
msgstr "Сакриј јединице задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:48
-#| msgid ""
-#| "Units for determining when to hide tasks, \"minutes\", \"hours\" or \"days"
-#| "\"."
msgid ""
"Units for determining when to hide tasks, \"minutes\", \"hours\" or \"days\""
msgstr ""
@@ -7988,7 +7949,6 @@ msgid "Hide task value"
msgstr "Сакриј вредност задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:50
-#| msgid "Number of units for determining when to hide tasks."
msgid "Number of units for determining when to hide tasks"
msgstr "Број јединица за одређивање када сакрити задатке"
@@ -7998,9 +7958,6 @@ msgid "Horizontal pane position"
msgstr "Позиција положене површи"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:52
-#| msgid ""
-#| "Position of the horizontal pane, between the date navigator calendar and "
-#| "the task list when not in the month view, in pixels."
msgid ""
"Position of the horizontal pane, between the date navigator calendar and the "
"task list when not in the month view, in pixels"
@@ -8014,7 +7971,6 @@ msgid "Last reminder time"
msgstr "Последње време подсетника"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:54
-#| msgid "Time the last reminder ran, in time_t."
msgid "Time the last reminder ran, in time_t"
msgstr "Време последњег покретања подсетника, у „time_t“"
@@ -8024,7 +7980,6 @@ msgid "Marcus Bains Line Color - Day View"
msgstr "Боја Маркус Бејнс линије - Дневни преглед"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:56
-#| msgid "Color to draw the Marcus Bains line in the Day View."
msgid "Color to draw the Marcus Bains line in the Day View"
msgstr "Боја за исцртавање Маркус Бејнс линије у Дневном прегледу"
@@ -8034,8 +7989,6 @@ msgid "Marcus Bains Line Color - Time bar"
msgstr "Боја Маркус Бејнс линије - трака времена"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:58
-#| msgid ""
-#| "Color to draw the Marcus Bains Line in the Time bar (empty for default)."
msgid "Color to draw the Marcus Bains Line in the Time bar (empty for default)"
msgstr ""
"Боја за исцртавање Маркус Бејнс линије у траци времена (подразумевано је "
@@ -8047,9 +8000,6 @@ msgid "Marcus Bains Line"
msgstr "Маркус Бејнс линија"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:60
-#| msgid ""
-#| "Whether to draw the Marcus Bains Line (line at current time) in the "
-#| "calendar."
msgid ""
"Whether to draw the Marcus Bains Line (line at current time) in the calendar"
msgstr "Да ли да у календару исцрта Маркус Бејнс линију (на тренутно време)"
@@ -8060,7 +8010,6 @@ msgid "Memo preview pane position (horizontal)"
msgstr "Позиција прегледа белешки (вертикално)"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:62
-#| msgid "Position of the task preview pane when oriented horizontally."
msgid "Position of the task preview pane when oriented horizontally"
msgstr "Позиција прегледа задатака када је постављено хоризонтално"
@@ -8070,19 +8019,14 @@ msgid "Memo layout style"
msgstr "Стил размештаја белешке"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:64
-#| msgid ""
-#| "The layout style determines where to place the preview pane in relation "
-#| "to the memo list. \"0\" (Classic View) places the preview pane below the "
-#| "memo list. \"1\" (Vertical View) places the preview pane next to the memo "
-#| "list."
msgid ""
"The layout style determines where to place the preview pane in relation to "
"the memo list. \"0\" (Classic View) places the preview pane below the memo "
"list. \"1\" (Vertical View) places the preview pane next to the memo list"
msgstr ""
-"Стил размештаја утврђује положај прегледа у односу на списак белешки. „0“ "
-"(класичан преглед) поставља преглед испод списка белешки. „1“ (вертикалан "
-"преглед) поставља преглед поред списка белешки"
+"Стил размештаја утврђује положај прегледа у односу на списак белешки. "
+"„0“ (класичан преглед) поставља преглед испод списка белешки. "
+"„1“ (вертикалан преглед) поставља преглед поред списка белешки"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:65
#: ../modules/calendar/apps_evolution_calendar.schemas.in.h:54
@@ -8090,7 +8034,6 @@ msgid "Memo preview pane position (vertical)"
msgstr "Позиција прегледа белешке (вертикално)"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:66
-#| msgid "Position of the memo preview pane when oriented vertically."
msgid "Position of the memo preview pane when oriented vertically"
msgstr "Позиција прегледа бечешки када је постављено вертикално"
@@ -8100,9 +8043,6 @@ msgid "Month view horizontal pane position"
msgstr "Позиција положене површи Месечног прегледа"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:68
-#| msgid ""
-#| "Position of the horizontal pane, between the view and the date navigator "
-#| "calendar and task list in the month view, in pixels."
msgid ""
"Position of the horizontal pane, between the view and the date navigator "
"calendar and task list in the month view, in pixels"
@@ -8111,12 +8051,10 @@ msgstr ""
"задатака у месечном прегледу, у пикселима"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:69
-#| msgid "Whether to scroll a Month View by a week, not by a month."
msgid "Scroll Month View by a week, not by a month"
msgstr "Да ли да прикаже Месечни преглед по недељама, уместо месецима"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:70
-#| msgid "Whether to scroll a Month View by a week, not by a month."
msgid "Whether to scroll a Month View by a week, not by a month"
msgstr "Да ли да прикаже Месечни преглед по недељама, уместо месецима"
@@ -8126,7 +8064,6 @@ msgid "Reminder programs"
msgstr "Програми подсетника"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:72
-#| msgid "Programs that are allowed to be run by reminders."
msgid "Programs that are allowed to be run by reminders"
msgstr "Програми који могу бити покренути подсетницима"
@@ -8136,7 +8073,6 @@ msgid "Show display reminders in notification tray"
msgstr "Приказује подсетнике у обавештајној зони"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:74
-#| msgid "Whether or not to use the notification tray for display reminders."
msgid "Whether or not to use the notification tray for display reminders"
msgstr "Да ли да користи обавештајну зону за приказивање подсетника"
@@ -8146,9 +8082,6 @@ msgid "Primary calendar"
msgstr "Примарни календар"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:76
-#| msgid ""
-#| "The UID of the selected (or \"primary\") calendar in the sidebar of the "
-#| "\"Calendar\" view."
msgid ""
"The UID of the selected (or \"primary\") calendar in the sidebar of the "
"\"Calendar\" view"
@@ -8162,9 +8095,6 @@ msgid "Primary memo list"
msgstr "Примарни списак белешки"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:78
-#| msgid ""
-#| "The UID of the selected (or \"primary\") memo list in the sidebar of the "
-#| "\"Memos\" view."
msgid ""
"The UID of the selected (or \"primary\") memo list in the sidebar of the "
"\"Memos\" view"
@@ -8177,9 +8107,6 @@ msgid "Primary task list"
msgstr "Примарни списак задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:80
-#| msgid ""
-#| "The UID of the selected (or \"primary\") task list in the sidebar of the "
-#| "\"Tasks\" view."
msgid ""
"The UID of the selected (or \"primary\") task list in the sidebar of the "
"\"Tasks\" view"
@@ -8193,9 +8120,6 @@ msgstr "Модел адреса за слободно/заузето време"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:83
#, no-c-format
-#| msgid ""
-#| "The URL template to use as a free/busy data fallback, %u is replaced by "
-#| "the user part of the mail address and %d is replaced by the domain."
msgid ""
"The URL template to use as a free/busy data fallback, %u is replaced by the "
"user part of the mail address and %d is replaced by the domain"
@@ -8209,25 +8133,20 @@ msgid "Recurrent Events in Italic"
msgstr "Догађаји понављања искошеним словима"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:85
-#| msgid ""
-#| "Show days with recurrent events in italic font in bottom left calendar."
msgid "Show days with recurrent events in italic font in bottom left calendar"
msgstr ""
"Приказује дане са догађајима који се понављају искошеним словним ликом у "
"доњем левом календару"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:86
-#| msgid "Delete the selected calendar"
msgid "List of selected calendars"
msgstr "Обришите изабране календаре"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:87
-#| msgid "List of available calendars:"
msgid "List of calendars to load"
msgstr "Списак доступних календара"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:88
-#| msgid "Delete the selected memo list"
msgid "List of selected memo lists"
msgstr "Списак изабраних спискова белешки"
@@ -8236,7 +8155,6 @@ msgid "List of memo lists to load"
msgstr "Списак спискова белешки за учитавање"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:90
-#| msgid "Delete the selected task list"
msgid "List of selected task lists"
msgstr "Списак изабраних спискова задатака"
@@ -8250,8 +8168,6 @@ msgid "Show appointment end times in week and month views"
msgstr "Приказује времена заказаног завршетка у недељним и месечним прегледима"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:93
-#| msgid ""
-#| "Whether to display the end time of events in the week and month views."
msgid "Whether to display the end time of events in the week and month views"
msgstr ""
"Да ли да прикаже времена завршетка догађаја у недељним и месечним прегледима"
@@ -8262,7 +8178,6 @@ msgid "Show the memo preview pane"
msgstr "Приказује преглед белешки"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:95
-#| msgid "If \"true\", show the memo preview pane in the main window."
msgid "If \"true\", show the memo preview pane in the main window"
msgstr "Уколико је „тачно“, у главном прозору приказује преглед белешки"
@@ -8272,7 +8187,6 @@ msgid "Show the task preview pane"
msgstr "Приказује преглед задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:97
-#| msgid "If \"true\", show the task preview pane in the main window."
msgid "If \"true\", show the task preview pane in the main window"
msgstr "Уколико је „тачно“, у главном прозору приказује преглед задатака"
@@ -8284,17 +8198,14 @@ msgstr ""
"претраживачу датума"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:99
-#| msgid "Whether to show week numbers in various places in the Calendar."
msgid "Whether to show week numbers in various places in the Calendar"
msgstr "Да ли да покаже бројеве недеља на разним местима у календару"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:100
-#| msgid "Vertical pane position"
msgid "Vertical position for the tag pane"
msgstr "Усправан положај за површ ознаке"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:101
-#| msgid "T_asks due today:"
msgid "Highlight tasks due today"
msgstr "Истицање задатака у току дана"
@@ -8302,8 +8213,8 @@ msgstr "Истицање задатака у току дана"
msgid ""
"Whether highlight tasks due today with a special color (task-due-today-color)"
msgstr ""
-"Да ли ће задаци у току дана бити истакнути посебном бојом "
-"(боја-задатка-у-току-дана)"
+"Да ли ће задаци у току дана бити истакнути посебном бојом (боја-задатка-у-"
+"току-дана)"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:103
#: ../modules/calendar/apps_evolution_calendar.schemas.in.h:87
@@ -8311,7 +8222,6 @@ msgid "Tasks due today color"
msgstr "Боја задатка за данас"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:104
-#| msgid "Background color of tasks that are due today, in \"#rrggbb\" format."
msgid ""
"Background color of tasks that are due today, in \"#rrggbb\" format. Used "
"together with task-due-today-highlight"
@@ -8330,19 +8240,14 @@ msgid "Task layout style"
msgstr "Стил размештаја"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:107
-#| msgid ""
-#| "The layout style determines where to place the preview pane in relation "
-#| "to the task list. \"0\" (Classic View) places the preview pane below the "
-#| "task list. \"1\" (Vertical View) places the preview pane next to the task "
-#| "list."
msgid ""
"The layout style determines where to place the preview pane in relation to "
"the task list. \"0\" (Classic View) places the preview pane below the task "
"list. \"1\" (Vertical View) places the preview pane next to the task list"
msgstr ""
-"Стил размештаја утврђује положај прегледа у односу на списак задатака. „0“ "
-"(класичан преглед) поставља преглед испод списка задатака. „1“ (вертикалан "
-"преглед) поставља преглед поред списка задатака"
+"Стил размештаја утврђује положај прегледа у односу на списак задатака. "
+"„0“ (класичан преглед) поставља преглед испод списка задатака. "
+"„1“ (вертикалан преглед) поставља преглед поред списка задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:108
#: ../modules/calendar/apps_evolution_calendar.schemas.in.h:61
@@ -8350,12 +8255,10 @@ msgid "Task preview pane position (vertical)"
msgstr "Позиција прегледа задатака (вертикално)"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:109
-#| msgid "Position of the task preview pane when oriented vertically."
msgid "Position of the task preview pane when oriented vertically"
msgstr "Позиција прегледа задатака када је постављено вертикално"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:110
-#| msgid "_Overdue tasks:"
msgid "Highlight overdue tasks"
msgstr "Истицање неиспуњених задатака"
@@ -8363,8 +8266,8 @@ msgstr "Истицање неиспуњених задатака"
msgid ""
"Whether highlight overdue tasks with a special color (task-overdue-color)"
msgstr ""
-"Да ли ће неиспуњени задаци бити истакнути посебном бојом "
-"(боја-неиспуњеног-задатка)"
+"Да ли ће неиспуњени задаци бити истакнути посебном бојом (боја-неиспуњеног-"
+"задатка)"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:112
#: ../modules/calendar/apps_evolution_calendar.schemas.in.h:89
@@ -8372,7 +8275,6 @@ msgid "Overdue tasks color"
msgstr "Боја неиспуњених задатака"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:113
-#| msgid "Background color of tasks that are overdue, in \"#rrggbb\" format."
msgid ""
"Background color of tasks that are overdue, in \"#rrggbb\" format. Used "
"together with task-overdue-highlight."
@@ -8386,7 +8288,6 @@ msgid "Time divisions"
msgstr "Подела времена"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:115
-#| msgid "Intervals shown in Day and Work Week views, in minutes."
msgid "Intervals shown in Day and Work Week views, in minutes"
msgstr "Интервали приказани у дневним и недељним прегледима, у минутима"
@@ -8396,9 +8297,6 @@ msgid "Timezone"
msgstr "Временска зона"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:117
-#| msgid ""
-#| "The default timezone to use for dates and times in the calendar, as an "
-#| "untranslated Olsen timezone database location like \"America/New York\"."
msgid ""
"The default timezone to use for dates and times in the calendar, as an "
"untranslated Olson timezone database location like \"America/New York\""
@@ -8412,8 +8310,6 @@ msgid "Twenty four hour time format"
msgstr "24-часовни облик времена"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:119
-#| msgid ""
-#| "Whether to show times in twenty four hour format instead of using am/pm."
msgid "Whether to show times in twenty four hour format instead of using am/pm"
msgstr "Да ли да прикаже време у двадесеточасовном формату, уместо am/pm"
@@ -8423,7 +8319,6 @@ msgid "Birthday and anniversary reminder"
msgstr "Подсетник на рођендане и годишњице"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:121
-#| msgid "Whether to set a reminder for birthdays and anniversaries."
msgid "Whether to set a reminder for birthdays and anniversaries"
msgstr "Да ли да постави подсетник на рођендане и годишњице"
@@ -8433,7 +8328,6 @@ msgid "Default appointment reminder"
msgstr "Подразумевани подсетник за заказивање"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:123
-#| msgid "Whether to set a default reminder for appointments."
msgid "Whether to set a default reminder for appointments"
msgstr "Да ли да постави подразумевани подсетник за заказивања"
@@ -8443,8 +8337,6 @@ msgid "Use system timezone"
msgstr "Користи временску зону система"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:125
-#| msgid ""
-#| "Use the system timezone instead of the timezone selected in Evolution."
msgid "Use the system timezone instead of the timezone selected in Evolution"
msgstr "Користи временску зону система уместо оне која је изабрана у Еволуцији"
@@ -8454,7 +8346,6 @@ msgid "Week start"
msgstr "Почетак недеље"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:127
-#| msgid "Weekday the week starts on, from Sunday (0) to Saturday (6)."
msgid "Weekday the week starts on, from Sunday (0) to Saturday (6)"
msgstr "Дан којим почиње недеља, од недеље (0) до суботе (6)"
@@ -8464,7 +8355,6 @@ msgid "Work days"
msgstr "Радни дани"
#: ../data/org.gnome.evolution.calendar.gschema.xml.in.h:129
-#| msgid "Days on which the start and end of work hours should be indicated."
msgid "Days on which the start and end of work hours should be indicated"
msgstr "Потребно је означити дане којима почињу и завршавају се радни часови"
@@ -8497,7 +8387,6 @@ msgstr ""
"нивоом подешавања (на пример „2.6.0“)."
#: ../data/org.gnome.evolution.gschema.xml.in.h:5
-#| msgid "Enable and disable plugins"
msgid "List of disabled plugins"
msgstr "Списак искључених прикључака"
@@ -8506,12 +8395,10 @@ msgid "The list of disabled plugins in Evolution"
msgstr "Списак искључених прикључака у Еволуцији"
#: ../data/org.gnome.evolution.gschema.xml.in.h:7
-#| msgid "Default window X coordinate"
msgid "The window's X coordinate"
msgstr "Водоравна координата прозора"
#: ../data/org.gnome.evolution.gschema.xml.in.h:8
-#| msgid "Default window Y coordinate"
msgid "The window's Y coordinate"
msgstr "Усправна координата прозора"
@@ -8520,12 +8407,10 @@ msgid "The window's width in pixels"
msgstr "Ширина прозора у тачкама"
#: ../data/org.gnome.evolution.gschema.xml.in.h:10
-#| msgid "Default window height"
msgid "The window's height in pixels"
msgstr "Висина прозора у тачкама"
#: ../data/org.gnome.evolution.gschema.xml.in.h:11
-#| msgid "Whether or not the window should be maximized."
msgid "Whether the window is maximized"
msgstr "Да ли ће прозор бити увећан"
@@ -8574,10 +8459,6 @@ msgid "Path where picture gallery should search for its content"
msgstr "Путања у којој галерија слика треба да тражи свој садржај."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:6
-#| msgid ""
-#| "This value can be an empty string, which means it'll use the system "
-#| "Picture folder, usually set to ~/Pictures. This folder will be also used "
-#| "when the set path is not pointing to the existent folder."
msgid ""
"This value can be an empty string, which means it'll use the system Picture "
"folder, usually set to ~/Pictures. This folder will be also used when the "
@@ -8618,14 +8499,10 @@ msgid "Recognize emoticons in text and replace them with images."
msgstr "Препознаје смајлиће у тексту и замењује их сликама."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:13
-#| msgid "Attribute message."
msgid "Attribute message"
msgstr "Приложена порука"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:14
-#| msgid ""
-#| "The text that is inserted when replying to a message, attributing the "
-#| "message to the original author."
msgid ""
"The text that is inserted when replying to a message, attributing the "
"message to the original author"
@@ -8634,14 +8511,10 @@ msgstr ""
"оригиналном аутору"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:15
-#| msgid "Forward message."
msgid "Forward message"
msgstr "Прослеђује поруку"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:16
-#| msgid ""
-#| "The text that is inserted when forwarding a message, saying that the "
-#| "forwarded message follows."
msgid ""
"The text that is inserted when forwarding a message, saying that the "
"forwarded message follows"
@@ -8650,14 +8523,10 @@ msgstr ""
"прослеђена порука следи"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:17
-#| msgid "Original message."
msgid "Original message"
msgstr "Оригинална порука"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:18
-#| msgid ""
-#| "The text that is inserted when replying to a message (top posting), "
-#| "saying that the original message follows."
msgid ""
"The text that is inserted when replying to a message (top posting), saying "
"that the original message follows"
@@ -8809,7 +8678,6 @@ msgstr ""
"менија „Преглед“ након избора налога дописне листе."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:41
-#| msgid "_Keep signature above the original message on replying"
msgid "Digitally sign replies when the original message is signed"
msgstr "Дигитално потписује одговоре када је потписана оригинална порука"
@@ -9113,13 +8981,15 @@ msgstr "Означава поруку виђеном после наведено
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:87
#: ../mail/evolution-mail.schemas.in.h:90
-msgid "Timeout for marking message as seen"
-msgstr "Време за означавање поруке као виђене"
+#| msgid "Timeout for marking message as seen"
+msgid "Timeout for marking messages as seen"
+msgstr "Време за означавање порука као виђеним"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:88
#: ../mail/evolution-mail.schemas.in.h:91
-msgid "Timeout for marking message as seen."
-msgstr "Време за које ће поруке бит означавање као виђене."
+#| msgid "Timeout for marking message as seen."
+msgid "Timeout in milliseconds for marking messages as seen."
+msgstr "Време у милисекундама за које ће поруке бити означене као виђеним."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:89
#: ../mail/evolution-mail.schemas.in.h:87
@@ -9134,9 +9004,6 @@ msgid ""
msgstr "Приказује е-адресу пошиљаоца у посебној колони у списку порука."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:91
-#| msgid ""
-#| "Determines whether to use the same fonts for both \"From\" and \"Subject"
-#| "\" lines in the \"Messages\" column in vertical view."
msgid ""
"Determines whether to use the same fonts for both \"From\" and \"Subject\" "
"lines in the \"Messages\" column in vertical view"
@@ -9165,7 +9032,6 @@ msgstr "Приказује обрисане поруке (као прецрта
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:95
#: ../mail/evolution-mail.schemas.in.h:96
-#| msgid "All local folders"
msgid "Enable local folders"
msgstr "Укључује локалне фасцикле"
@@ -9213,9 +9079,6 @@ msgid "State of message headers in paned view"
msgstr "Стање заглавља поруке у прегледу површи"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:104
-#| msgid ""
-#| "Describes whether message headers in paned view should be collapsed or "
-#| "expanded by default. \"0\" = expanded \"1\" = collapsed"
msgid ""
"Describes whether message headers in paned view should be collapsed or "
"expanded by default. \"0\" = expanded and \"1\" = collapsed"
@@ -9360,9 +9223,6 @@ msgid "Default value for thread expand state"
msgstr "Подразумевана вредност за раширену расправу"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:126
-#| msgid ""
-#| "This setting specifies whether the threads should be in expanded or "
-#| "collapsed state by default. Requires a restart to apply."
msgid ""
"This setting specifies whether the threads should be in expanded or "
"collapsed state by default. Evolution requires a restart."
@@ -9462,12 +9322,10 @@ msgid ""
msgstr "Поставља упит кориснику када покуша да пошаље поруку без наслова."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:141
-#| msgid "Prompt when replying to many recipients"
msgid "Prompt when emptying the trash"
msgstr "Поставља упит приликом пражњења смећа"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:142
-#| msgid "Prompt the user when he or she tries to expunge a folder."
msgid "Prompt the user when he or she tries to empty the trash."
msgstr "Поставља упит кориснику када покуша да испразни смеће."
@@ -9612,9 +9470,6 @@ msgstr ""
"одговара на поруку приказану у прозору."
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:164
-#| msgid ""
-#| "Possible values are: never - to never close browser window always - to "
-#| "always close browser window ask - (or any other value) will ask user"
msgid ""
"Possible values are: 'never' - to never close browser window, 'always' - to "
"always close browser window or 'ask' - (or any other value) will ask user."
@@ -9864,9 +9719,6 @@ msgid "Check for new messages on start"
msgstr "Врши проверу за новим порукама приликом покретања"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:202
-#| msgid ""
-#| "Whether check for new messages when Evolution is started. This includes "
-#| "also sending messages from Outbox."
msgid ""
"Whether to check for new messages when Evolution is started. This includes "
"also sending messages from Outbox."
@@ -9880,11 +9732,6 @@ msgid "Check for new messages in all active accounts"
msgstr "Врши проверу за новим порукама у свим активним налозима"
#: ../data/org.gnome.evolution.mail.gschema.xml.in.h:204
-#| msgid ""
-#| "Whether check for new messages in all active accounts regardless of the "
-#| "account \"Check for new messages every X minutes\" option when Evolution "
-#| "is started. This option is used only together with 'send_recv_on_start' "
-#| "option."
msgid ""
"Whether to check for new messages in all active accounts regardless of the "
"account \"Check for new messages every X minutes\" option when Evolution is "
@@ -9919,9 +9766,6 @@ msgstr ""
"трагати у телу поруке"
#: ../data/org.gnome.evolution.plugin.attachment-reminder.gschema.xml.in.h:2
-#| msgid ""
-#| "List of clues for the attachment reminder plugin to look for in a message "
-#| "body"
msgid ""
"List of clues for the attachment reminder plugin to look for in a message "
"body."
@@ -9930,17 +9774,14 @@ msgstr ""
"трагати у телу поруке."
#: ../data/org.gnome.evolution.plugin.autocontacts.gschema.xml.in.h:1
-#| msgid "Address Book Properties"
msgid "Address book source"
msgstr "Извор адресара"
#: ../data/org.gnome.evolution.plugin.autocontacts.gschema.xml.in.h:2
-#| msgid "Select Address book for Automatic Contacts"
msgid "Address book to use for storing automatically synced contacts"
msgstr "Адресар који ће бити коришћен за самоусаглашене контакте"
#: ../data/org.gnome.evolution.plugin.autocontacts.gschema.xml.in.h:3
-#| msgid "Automatic Contacts"
msgid "Auto sync GAIM contacts"
msgstr "Самоусклађивање ГАИМ контаката"
@@ -9949,7 +9790,6 @@ msgid "Whether GAIM contacts should be automaticall synced"
msgstr "Да ли ће ГАИМ контакти бити самостално усклађени"
#: ../data/org.gnome.evolution.plugin.autocontacts.gschema.xml.in.h:5
-#| msgid "Invalid contact."
msgid "Enable autocontacts"
msgstr "Укључује самоконтакте"
@@ -9959,7 +9799,6 @@ msgid ""
msgstr "Да ли ће контакти бити самостално додати у кориснички адресар"
#: ../data/org.gnome.evolution.plugin.autocontacts.gschema.xml.in.h:7
-#| msgid "Address Book Properties"
msgid "GAIM address book source"
msgstr "Извор ГАИМ адресара"
@@ -10016,7 +9855,6 @@ msgid "Automatically launch when a new mail is edited"
msgstr "Аутоматски покреће при уређивању нове поруке"
#: ../data/org.gnome.evolution.plugin.external-editor.gschema.xml.in.h:4
-#| msgid "Automatically launch editor when key is pressed in the mail composer"
msgid "Automatically launch editor when key is pressed in the mail composer."
msgstr ""
"Аутоматски покреће уређивач када је притиснут тастер у састављачу поруке."
@@ -10036,7 +9874,6 @@ msgstr ""
"поставити слику, иначе се ништа неће десити."
#: ../data/org.gnome.evolution.plugin.itip.gschema.xml.in.h:1
-#| msgid "_Delete Message"
msgid "Delete processed"
msgstr "Брисање обрађених"
@@ -10118,7 +9955,6 @@ msgstr ""
"обавештење сиреном."
#: ../data/org.gnome.evolution.plugin.mail-notification.gschema.xml.in.h:15
-#| msgid "FILE"
msgid "FIXME"
msgstr "ПОПРАВИМЕ"
@@ -10135,7 +9971,6 @@ msgstr ""
"сиреном."
#: ../data/org.gnome.evolution.plugin.prefer-plain.gschema.xml.in.h:1
-#| msgid "Use custom fonts for displaying mail."
msgid "Mode to use when displaying mails"
msgstr "Режим за коришћење приликом приказа поште"
@@ -10151,7 +9986,6 @@ msgstr ""
"само обичан текст"
#: ../data/org.gnome.evolution.plugin.prefer-plain.gschema.xml.in.h:3
-#| msgid "Whether to show the preview pane."
msgid "Whether to show suppressed HTML output"
msgstr "Да ли ће бити приказан потиснут ХТМЛ излаз"
@@ -10210,13 +10044,10 @@ msgid "Whether Evolution will start up in offline mode instead of online mode."
msgstr "Да ли ће се Еволуција покренути у режиму за рад ван мреже."
#: ../data/org.gnome.evolution.shell.gschema.xml.in.h:9
-#| msgid "Opening folder '%s'"
msgid "Offline folder paths"
msgstr "Путање фасцикли ван мреже"
#: ../data/org.gnome.evolution.shell.gschema.xml.in.h:10
-#| msgid ""
-#| "List of paths for the folders to be synchronized to disk for offline usage"
msgid ""
"List of paths for the folders to be synchronized to disk for offline usage."
msgstr "Списак путања фасцикли за усклађивање на диску за рад ван мреже."
@@ -10313,7 +10144,6 @@ msgid "Use only the local spam tests (no DNS)."
msgstr "Користи само локалне провере спама (без DNS-а)."
#: ../data/org.gnome.evolution.spamassassin.gschema.xml.in.h:3
-#| msgid "Failed to read output from SpamAssassin: "
msgid "Socket path for SpamAssassin"
msgstr "Путања прикључнице за Убицу спама"
@@ -10328,12 +10158,10 @@ msgid "Use SpamAssassin daemon and client (spamc/spamd)."
msgstr "Користи демона и клијента Убице спама (spamc/spamd)."
#: ../data/org.gnome.evolution.spamassassin.gschema.xml.in.h:6
-#| msgid "SpamAssassin Options"
msgid "SpamAssassin client binary"
msgstr "Извршни клијента Убице спама"
#: ../data/org.gnome.evolution.spamassassin.gschema.xml.in.h:7
-#| msgid "Use SpamAssassin daemon and client"
msgid "SpamAssassin daemon binary"
msgstr "Извршни демона Убице спама"
@@ -11165,7 +10993,6 @@ msgstr "Није пронађен налог за коришћење, просл
#: ../libemail-engine/e-mail-session.c:1274
#, c-format
-#| msgid "Use Authe_ntication"
msgid "%s authentication failed"
msgstr "Није успело %s потврђивање идентитета"
@@ -11328,7 +11155,6 @@ msgid "Autogenerated"
msgstr "Аутоматски састављено"
#: ../mail/e-mail-account-manager.c:405
-#| msgid "Use _Default"
msgid "_Restore Default"
msgstr "Поврати _подразумевано"
@@ -11384,7 +11210,6 @@ msgid "List View"
msgstr "Преглед списком"
#: ../mail/e-mail-backend.c:648
-#| msgid "Unknown action to be performed"
msgid "Unknown background operation"
msgstr "Непозната позадинска радња"
@@ -12240,7 +12065,6 @@ msgstr ""
"питајте администратора система или достављача Интернет услуга."
#: ../mail/em-account-editor.c:2933
-#| msgid "Account Search"
msgid "Account Summary"
msgstr "Сажетак налога"
@@ -12292,7 +12116,6 @@ msgid "Checking for New Messages"
msgstr "Проверање за нове поруке"
#: ../mail/em-account-editor.c:4767 ../mail/em-account-editor.c:4802
-#| msgid "Always"
msgid "Always (SSL)"
msgstr "Увек (ССЛ)"
@@ -12301,22 +12124,18 @@ msgid "When possible (TLS)"
msgstr "Када је могуће (ТЛС)"
#: ../mail/em-account-editor.c:4847
-#| msgid "Setup Google contacts with Evolution"
msgid "Setup Google con_tacts with Evolution"
msgstr "Подесите Гугл ко_нтакте са Еволуцијом"
#: ../mail/em-account-editor.c:4854
-#| msgid "Setup Google calendar with Evolution"
msgid "Setup Google ca_lendar with Evolution"
msgstr "Подесите Гугл ка_лендар са Еволуцијом"
#: ../mail/em-account-editor.c:4902
-#| msgid "Setup Yahoo calendar with Evolution"
msgid "Setup _Yahoo calendar with Evolution"
msgstr "Подесите _Јаху календар са Еволуцијом"
#: ../mail/em-account-editor.c:4927
-#| msgid "Yahoo Calendar name:"
msgid "Yahoo Calen_dar name:"
msgstr "Назив Ја_ху календара:"
@@ -12404,7 +12223,6 @@ msgid "does not exist"
msgstr "не постоји"
#: ../mail/em-filter-i18n.h:19
-#| msgid "does not end with"
msgid "does not have words"
msgstr "не садржи речи"
@@ -12445,7 +12263,6 @@ msgid "Forward to"
msgstr "Проследи"
#: ../mail/em-filter-i18n.h:31
-#| msgid "Password:"
msgid "has words"
msgstr "садржи речи"
@@ -12604,7 +12421,6 @@ msgid "Stop Processing"
msgstr "Прекини обраду"
#: ../mail/em-filter-i18n.h:77
-#| msgid "Color"
msgid "Unset Color"
msgstr "Непостављена боја"
@@ -12962,17 +12778,14 @@ msgid "No HTML stream available"
msgstr "Није доступан ХТМЛ ток."
#: ../mail/em-subscription-editor.c:854
-#| msgid "Su_bscribe"
msgid "_Subscribe"
msgstr "Пријави _се"
#: ../mail/em-subscription-editor.c:863
-#| msgid "Su_bscribe"
msgid "Su_bscribe To Shown"
msgstr "Пријави се на _приказане"
#: ../mail/em-subscription-editor.c:871
-#| msgid "Subscribe to my _alarms"
msgid "Subscribe To _All"
msgstr "Пријави се _на све"
@@ -12982,12 +12795,10 @@ msgid "_Unsubscribe"
msgstr "_Одјави се"
#: ../mail/em-subscription-editor.c:980
-#| msgid "_Unsubscribe from List"
msgid "Unsu_bscribe From Hidden"
msgstr "О_дјави се са скривених"
#: ../mail/em-subscription-editor.c:988
-#| msgid "_Unsubscribe from List"
msgid "Unsubscribe From _All"
msgstr "Одја_ви се са свих"
@@ -13082,8 +12893,8 @@ msgstr "Додај фасциклу"
#: ../mail/evolution-mail.schemas.in.h:11
msgid "Digitally sign messages when original message signed (PGP or S/MIME)"
msgstr ""
-"Дигитално потписивање порука када је оригинална порука потписана (ПГП или "
-"С/МИМЕ)"
+"Дигитално потписивање порука када је оригинална порука потписана (ПГП или С/"
+"МИМЕ)"
#: ../mail/evolution-mail.schemas.in.h:39
msgid "Composer Window default width"
@@ -13149,7 +12960,8 @@ msgstr ""
#: ../mail/evolution-mail.schemas.in.h:97
msgid "Whether to show local folders (On This Computer) in a folder tree."
-msgstr "Да ли да прикаже локалне фасцикле (На овом рачунару) у стаблу фасцикле."
+msgstr ""
+"Да ли да прикаже локалне фасцикле (На овом рачунару) у стаблу фасцикле."
#: ../mail/evolution-mail.schemas.in.h:123
msgid ""
@@ -13437,8 +13249,8 @@ msgid ""
"Exported file name will be : YYYmmDDHHMMSS_email_title Possible values : 1 "
"(: email sent date), 2 (: drag'n'drop date)"
msgstr ""
-"Извежени назив датотеке ће бити : YYYmmDDHHMMSS_email_title Могуће вредности "
-": 1 (: датум слања ел. поште), 2 (: датум превлачења и убацивања)"
+"Извежени назив датотеке ће бити : YYYmmDDHHMMSS_email_title Могуће "
+"вредности : 1 (: датум слања ел. поште), 2 (: датум превлачења и убацивања)"
#: ../mail/importers/elm-importer.c:181
msgid "Importing Elm data"
@@ -13669,8 +13481,8 @@ msgstr "Одговор групи иде само на дописну листу
#: ../mail/mail-config.ui.h:24
msgid "Digitally _sign messages when original message signed (PGP or S/MIME)"
msgstr ""
-"Дигитално _потпиши поруке када је оригинална порука потписана (ПГП или "
-"С/МИМЕ)"
+"Дигитално _потпиши поруке када је оригинална порука потписана (ПГП или С/"
+"МИМЕ)"
#: ../mail/mail-config.ui.h:26
msgid "Sig_natures"
@@ -13820,7 +13632,6 @@ msgid "_Secure HTTP Proxy:"
msgstr "_Безбедан ХТТП посредник:"
#: ../mail/mail-config.ui.h:69
-#| msgid "SOCKS proxy port"
msgid "SOC_KS Proxy:"
msgstr "Посредник СОЦКС-а:"
@@ -14246,12 +14057,10 @@ msgstr "Запа_мти лозинку"
# Create the default Person task list
# orange
#: ../mail/mail-config.ui.h:178
-#| msgid "Personal details:"
msgid "Personal Details:"
msgstr "Лични подаци:"
#: ../mail/mail-config.ui.h:187
-#| msgid "Encryption"
msgid "Encryption:"
msgstr "Шифровање:"
@@ -14261,12 +14070,10 @@ msgstr "Шифровање:"
# Note that we don't show this here, since by default a 'None' date
# is not permitted.
#: ../mail/mail-config.ui.h:188
-#| msgid "None"
msgid "none"
msgstr "ништа"
#: ../mail/mail-config.ui.h:189
-#| msgid "Label"
msgid "label"
msgstr "натпис"
@@ -15469,8 +15276,7 @@ msgid ""
"Whether addresses should be formatted according to standard in their "
"destination country."
msgstr ""
-"Да ли ће адресе бити обликоване према стандарду у државама њиховог "
-"одредишта."
+"Да ли ће адресе бити обликоване према стандарду у државама њиховог одредишта."
#. To Translators: 'Table column' is a label for configurable date/time format for table columns showing a date in message list
#: ../modules/addressbook/autocompletion-config.c:194
@@ -15479,7 +15285,6 @@ msgid "_Table column:"
msgstr "Колона _табеле:"
#: ../modules/addressbook/autocompletion-config.c:197
-#| msgid "Free/Busy information"
msgid "Address formatting"
msgstr "Обликовање адресе"
@@ -15856,12 +15661,10 @@ msgid "Supported Search Bases"
msgstr "Подржане базе за претрагу"
#: ../modules/addressbook/ldap-config.ui.h:14
-#| msgid "_Server:"
msgid "Ser_ver:"
msgstr "С_ервер:"
#: ../modules/addressbook/ldap-config.ui.h:15
-#| msgid "_Use secure connection:"
msgid "Use secure _connection:"
msgstr "_Користи сигурну везу:"
@@ -15886,7 +15689,6 @@ msgid "_Find Possible Search Bases"
msgstr "_Нађи могуће базе за претрагу"
#: ../modules/addressbook/ldap-config.ui.h:21
-#| msgid "Search _filter:"
msgid "S_earch filter:"
msgstr "_Филтер претраге:"
@@ -16462,12 +16264,10 @@ msgid "Display"
msgstr "Приказ"
#: ../modules/calendar/e-calendar-preferences.ui.h:57
-#| msgid "T_asks due today:"
msgid "Highlight t_asks due today"
msgstr "Истакни _задатке у току дана"
#: ../modules/calendar/e-calendar-preferences.ui.h:59
-#| msgid "_Overdue tasks:"
msgid "Highlight _overdue tasks"
msgstr "Истакни _неиспуњене задатке"
@@ -17293,13 +17093,12 @@ msgstr "Уређивач налога"
#: ../modules/mail/e-mail-attachment-handler.c:385
#, c-format
-#| msgid "%d attached messages"
msgid "%d attached message"
msgid_plural "%d attached messages"
msgstr[0] "%d приложена порука"
msgstr[1] "%d приложене поруке"
msgstr[2] "%d приложених порука"
-msgstr[3] "приложених порука — %d"
+msgstr[3] "Једна приложена порука"
#: ../modules/mail/e-mail-shell-backend.c:204
msgctxt "New"
@@ -17652,10 +17451,10 @@ msgstr "_Одјава са мрежног посредника"
#, c-format
msgid "%d selected, "
msgid_plural "%d selected, "
-msgstr[0] "%d изабрана,"
-msgstr[1] "%d изабране,"
-msgstr[2] "%d изабраних,"
-msgstr[3] "%d изабрана,"
+msgstr[0] "%d изабрана, "
+msgstr[1] "%d изабране, "
+msgstr[2] "%d изабраних, "
+msgstr[3] "%d изабрана, "
#: ../modules/mail/e-mail-shell-view-private.c:1034
#, c-format
@@ -17707,10 +17506,10 @@ msgstr[3] "%d послата"
#, c-format
msgid "%d unread, "
msgid_plural "%d unread, "
-msgstr[0] "%d непрочитана,"
-msgstr[1] "%d непрочитане,"
-msgstr[2] "%d непрочитаних,"
-msgstr[3] "%d непрочитана,"
+msgstr[0] "%d непрочитана, "
+msgstr[1] "%d непрочитане, "
+msgstr[2] "%d непрочитаних, "
+msgstr[3] "%d непрочитана, "
#: ../modules/mail/e-mail-shell-view-private.c:1080
#, c-format
@@ -17785,19 +17584,16 @@ msgstr "Ваша порука за %s на тему „%s“ на %s је про
#. Translators: %s is the subject of the email message.
#: ../modules/mdn/evolution-mdn.c:324
#, c-format
-#| msgid "Delivery Notification for: \"%s\""
msgid "Delivery Notification for \"%s\""
msgstr "Обавештење о пријему за „%s“"
#: ../modules/mdn/evolution-mdn.c:449
#, c-format
-#| msgid "S_end message receipts:"
msgid "Send a read receipt to '%s'"
msgstr "Пошаљи повратницу читања за „%s“"
#. name doesn't matter
#: ../modules/mdn/evolution-mdn.c:454
-#| msgid "Do _Not Send"
msgid "_Notify Sender"
msgstr "Обавести _пошиљаоца"
@@ -17949,12 +17745,10 @@ msgid "Importing Files"
msgstr "Увозим датотеке"
#: ../modules/startup-wizard/evolution-startup-wizard.c:402
-#| msgid "%s (cancelled)"
msgid "Import cancelled."
msgstr "Увожење је отказано."
#: ../modules/startup-wizard/evolution-startup-wizard.c:420
-#| msgid "Update complete\n"
msgid "Import complete."
msgstr "Увожење је завршено."
@@ -17967,12 +17761,6 @@ msgid "Welcome"
msgstr "Добродошли"
#: ../modules/startup-wizard/evolution-startup-wizard.c:505
-#| msgid ""
-#| "Welcome to Evolution. The next few screens will allow Evolution to "
-#| "connect to your email accounts, and to import files from other "
-#| "applications. \n"
-#| "\n"
-#| "Please click the \"Forward\" button to continue. "
msgid ""
"Welcome to Evolution. The next few screens will allow Evolution to connect "
"to your email accounts, and to import files from other applications."
@@ -18104,7 +17892,6 @@ msgid "Ensuring local sources"
msgstr "Налазим локалне изворе"
#: ../plugins/backup-restore/backup.c:748
-#| msgid "Evolution Back up"
msgid "Evolution Back Up"
msgstr "Резервни примерак Еволуције"
@@ -18212,12 +17999,10 @@ msgid "Back up and restore your Evolution data and settings."
msgstr "Направите резерву и вратите податке и поставке Еволуције."
#: ../plugins/backup-restore/org-gnome-backup-restore.error.xml.h:1
-#| msgid "Invalid Evolution back up file"
msgid "Invalid Evolution backup file"
msgstr "Неисправна датотека резервног примерка Еволуције"
#: ../plugins/backup-restore/org-gnome-backup-restore.error.xml.h:2
-#| msgid "Please select a valid back up file to restore."
msgid "Please select a valid backup file to restore."
msgstr "Изаберите исправну датотеку резерве за повраћај."
@@ -18239,18 +18024,11 @@ msgid "Close and Back up Evolution"
msgstr "Изаберите радњу:"
#: ../plugins/backup-restore/org-gnome-backup-restore.error.xml.h:6
-#| msgid ""
-#| "Are you sure you want to restore Evolution from the selected back up file?"
msgid ""
"Are you sure you want to restore Evolution from the selected backup file?"
msgstr "Сигурно желите да повратите Еволуцију из изабране датотеке резерве?"
#: ../plugins/backup-restore/org-gnome-backup-restore.error.xml.h:7
-#| msgid ""
-#| "To restore your data and settings, you must first close Evolution. Please "
-#| "make sure that you save any unsaved data before proceeding. This will "
-#| "delete all your current Evolution data and settings and restore them from "
-#| "your back up."
msgid ""
"To restore your data and settings, you must first close Evolution. Please "
"make sure that you save any unsaved data before proceeding. This will delete "
@@ -18428,6 +18206,7 @@ msgstr "Тражи КолДАВ календар"
#: ../plugins/caldav/caldav-source.c:240
#: ../plugins/calendar-http/calendar-http.c:107
+#: ../plugins/webdav-account-setup/webdav-contacts-source.c:257
msgid "_URL:"
msgstr "_Адреса :"
@@ -18725,9 +18504,6 @@ msgid "Command to be executed to launch the editor: "
msgstr "Наредба за извршавање ради покретања уређивача:"
#: ../plugins/external-editor/external-editor.c:115
-#| msgid ""
-#| "For Emacs use \"xemacs\"\n"
-#| "For VI use \"gvim -f\""
msgid ""
"For XEmacs use \"xemacs\"\n"
"For Vim use \"gvim -f\""
@@ -19004,7 +18780,6 @@ msgstr "Послато календару „%s“ као отказано"
#: ../plugins/itip-formatter/itip-formatter.c:1579
#: ../plugins/itip-formatter/itip-formatter.c:1972
#: ../plugins/itip-formatter/itip-formatter.c:2063
-#| msgid "Opening the calendar. Please wait..."
msgid "Saving changes to the calendar. Please wait..."
msgstr "Чувам измене у календар. Молим сачекајте..."
@@ -19035,7 +18810,6 @@ msgid "Attendee status updated"
msgstr "Статус учесника је ажуриран"
#: ../plugins/itip-formatter/itip-formatter.c:1879
-#| msgid "Object is invalid and cannot be updated\n"
msgid "The meeting is invalid and cannot be updated"
msgstr "Састанак није исправан и не може бити ажуриран"
@@ -19394,7 +19168,6 @@ msgstr "%s преко %s отказује следећи састанак:"
#: ../plugins/itip-formatter/itip-view.c:413
#, c-format
-#| msgid "%s has canceled the following meeting."
msgid "%s has canceled the following meeting:"
msgstr "%s отказује следећи састанак:"
@@ -19405,7 +19178,6 @@ msgstr "%s преко %s предлаже следеће промене саст
#: ../plugins/itip-formatter/itip-view.c:419
#, c-format
-#| msgid "%s has proposed the following meeting changes."
msgid "%s has proposed the following meeting changes:"
msgstr "%s предлаже следеће измене састанка:"
@@ -19416,7 +19188,6 @@ msgstr "%s преко %s одбија следеће промене састан
#: ../plugins/itip-formatter/itip-view.c:425
#, c-format
-#| msgid "%s has declined the following meeting changes."
msgid "%s has declined the following meeting changes:"
msgstr "%s одбија следеће измене састанка:"
@@ -20254,7 +20025,6 @@ msgid "Manual (via Actions menu)"
msgstr "Ручно (преко менија „Радње“)"
#: ../plugins/publish-calendar/publish-calendar.ui.h:9
-#| msgid "Secure FTP (SSH)"
msgid "Secure FTP (SFTP)"
msgstr "Безбедни ФТП (СФТП)"
@@ -20540,10 +20310,6 @@ msgstr "Додајте ВебДАВ контакте у Еволуцију."
msgid "WebDAV"
msgstr "ВебДАВ"
-#: ../plugins/webdav-account-setup/webdav-contacts-source.c:257
-msgid "URL:"
-msgstr "Адреса :"
-
#: ../plugins/webdav-account-setup/webdav-contacts-source.c:283
msgid "_Avoid IfMatch (needed on Apache < 2.2.8)"
msgstr "_Избегавај Ако поклапа (потребно на Апачу < 2.2.8)"
@@ -21063,7 +20829,6 @@ msgstr "Пређи на %s"
#: ../shell/e-shell-window-actions.c:2327
#, c-format
-#| msgid "Select A File"
msgid "Select view: %s"
msgstr "Изабери преглед: %s"
@@ -21609,17 +21374,14 @@ msgid "Certificate Authority Trust"
msgstr "Поверење издаваоцу уверења"
#: ../smime/gui/smime-ui.ui.h:39
-#| msgid "Trust this CA to identify websites."
msgid "Trust this CA to identify _websites."
msgstr "Веруј овом издаваоцу уверења за препознавање _веб страница."
#: ../smime/gui/smime-ui.ui.h:40
-#| msgid "Trust this CA to identify email users."
msgid "Trust this CA to identify _email users."
msgstr "Веруј овом издаваоцу уверења за препознавање _ел. адреса."
#: ../smime/gui/smime-ui.ui.h:41
-#| msgid "Trust this CA to identify software developers."
msgid "Trust this CA to identify _software developers."
msgstr "Веруј овом издаваоцу уверења за препознавање _програмера."
@@ -22025,7 +21787,6 @@ msgid "evolution calendar item"
msgstr "ставка календара еволуције"
#: ../widgets/misc/e-alert-bar.c:116
-#| msgid "Send this message"
msgid "Close this message"
msgstr "Затворите ову поруку"
@@ -22991,6 +22752,9 @@ msgstr "Изабери све"
msgid "Input Methods"
msgstr "Методи уноса"
+#~ msgid "URL:"
+#~ msgstr "Адреса :"
+
# %B = full month name, %d = month day, %Y = full year.
#~ msgid "%A, %B %d, %Y"
#~ msgstr "%A, %d %B , %Y."
ointed to by @uids back to the system. **/ void em_utils_uids_free (GPtrArray *uids) { gint i; for (i = 0; i < uids->len; i++) g_free (uids->pdata[i]); g_ptr_array_free (uids, TRUE); } static void druid_destroy_cb (gpointer user_data, GObject *deadbeef) { gtk_main_quit (); } /** * em_utils_configure_account: * @parent: parent window for the druid to be a child of. * * Displays a druid allowing the user to configure an account. If * @parent is non-NULL, then the druid will be created as a child * window of @parent's toplevel window. * * Returns %TRUE if an account has been configured or %FALSE * otherwise. **/ gboolean em_utils_configure_account (GtkWindow *parent) { EMAccountEditor *emae; EAccountList *account_list; g_return_val_if_fail (GTK_IS_WINDOW (parent), FALSE); emae = em_account_editor_new(NULL, EMAE_DRUID, "org.gnome.evolution.mail.config.accountDruid"); gtk_window_set_transient_for (GTK_WINDOW (emae->editor), parent); g_object_weak_ref((GObject *)emae->editor, (GWeakNotify) druid_destroy_cb, NULL); gtk_widget_show(emae->editor); gtk_grab_add(emae->editor); gtk_main(); account_list = e_get_account_list (); return (e_list_length ((EList *) account_list) > 0); } /** * em_utils_check_user_can_send_mail: * @parent: parent window for the druid to be a child of. * * If no accounts have been configured, the user will be given a * chance to configure an account. In the case that no accounts are * configured, a druid will be created. If @parent is non-NULL, then * the druid will be created as a child window of @parent's toplevel * window. * * Returns %TRUE if the user has an account configured (to send mail) * or %FALSE otherwise. **/ gboolean em_utils_check_user_can_send_mail (GtkWindow *parent) { EAccountList *account_list; EAccount *account; account_list = e_get_account_list (); if (e_list_length ((EList *) account_list) == 0) { if (!em_utils_configure_account (parent)) return FALSE; } if (!(account = e_get_default_account ())) return FALSE; /* Check for a transport */ if (!account->transport->url) return FALSE; return TRUE; } /* Editing Filters/Search Folders... */ static GtkWidget *filter_editor = NULL; static void em_filter_editor_response (GtkWidget *dialog, gint button, gpointer user_data) { EShellBackend *shell_backend; EMFilterContext *fc; shell_backend = E_SHELL_BACKEND (global_mail_shell_backend); if (button == GTK_RESPONSE_OK) { const gchar *data_dir; gchar *user; data_dir = e_shell_backend_get_data_dir (shell_backend); fc = g_object_get_data ((GObject *) dialog, "context"); user = g_strdup_printf ("%s/filters.xml", data_dir); rule_context_save ((RuleContext *) fc, user); g_free (user); } gtk_widget_destroy (dialog); filter_editor = NULL; } static EMFilterSource em_filter_source_element_names[] = { { "incoming", }, { "outgoing", }, { NULL } }; /** * em_utils_edit_filters: * @parent: parent window * * Opens or raises the filters editor dialog so that the user may edit * his/her filters. If @parent is non-NULL, then the dialog will be * created as a child window of @parent's toplevel window. **/ void em_utils_edit_filters (GtkWidget *parent) { EShellBackend *shell_backend; const gchar *data_dir; gchar *user, *system; EMFilterContext *fc; if (filter_editor) { gdk_window_raise (GTK_WIDGET (filter_editor)->window); return; } shell_backend = E_SHELL_BACKEND (global_mail_shell_backend); data_dir = e_shell_backend_get_data_dir (shell_backend); fc = em_filter_context_new (); user = g_build_filename (data_dir, "filters.xml", NULL); system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL); rule_context_load ((RuleContext *) fc, system, user); g_free (user); g_free (system); if (((RuleContext *) fc)->error) { GtkWidget *w = e_error_new((GtkWindow *)parent, "mail:filter-load-error", ((RuleContext *)fc)->error, NULL); em_utils_show_error_silent (w); return; } if (em_filter_source_element_names[0].name == NULL) { em_filter_source_element_names[0].name = _("Incoming"); em_filter_source_element_names[1].name = _("Outgoing"); } filter_editor = (GtkWidget *) em_filter_editor_new (fc, em_filter_source_element_names); if (parent != NULL) e_dialog_set_transient_for ((GtkWindow *) filter_editor, parent); gtk_window_set_title (GTK_WINDOW (filter_editor), _("Message Filters")); g_object_set_data_full ((GObject *) filter_editor, "context", fc, (GDestroyNotify) g_object_unref); g_signal_connect (filter_editor, "response", G_CALLBACK (em_filter_editor_response), NULL); gtk_widget_show (GTK_WIDGET (filter_editor)); } /* * Picked this from e-d-s/libedataserver/e-data. * But it allows more characters to occur in filenames, especially when saving attachment. */ void em_filename_make_safe (gchar *string) { gchar *p, *ts; gunichar c; #ifdef G_OS_WIN32 const gchar *unsafe_chars = "/\":*?<>|\\#"; #else const gchar *unsafe_chars = "/#"; #endif g_return_if_fail (string != NULL); p = string; while(p && *p) { c = g_utf8_get_char (p); ts = p; p = g_utf8_next_char (p); /* I wonder what this code is supposed to actually * achieve, and whether it does that as currently * written? */ if (!g_unichar_isprint(c) || ( c < 0xff && strchr (unsafe_chars, c&0xff ))) { while (ts<p) *ts++ = '_'; } } } /* Saving messages... */ static const gchar * emu_save_get_filename_for_part (CamelMimePart *part) { const gchar *filename; filename = camel_mime_part_get_filename (part); if (filename == NULL) { if (CAMEL_IS_MIME_MESSAGE (part)) { filename = camel_mime_message_get_subject ( CAMEL_MIME_MESSAGE (part)); if (filename == NULL) filename = _("message"); } else filename = _("attachment"); } return filename; } /** * em_utils_save_part: * @parent: parent window * @prompt: prompt string * @part: part to save * * Saves a mime part to disk (prompting the user for filename). **/ void em_utils_save_part (GtkWindow *parent, const gchar *prompt, CamelMimePart *part) { GtkWidget *file_chooser; const gchar *utf8_filename; gchar *uri = NULL, *filename; g_return_if_fail (parent == NULL || GTK_IS_WINDOW (parent)); utf8_filename = emu_save_get_filename_for_part (part); filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); em_filename_make_safe (filename); file_chooser = e_file_get_save_filesel ( parent, prompt, filename, GTK_FILE_CHOOSER_ACTION_SAVE); if (gtk_dialog_run (GTK_DIALOG (file_chooser)) != GTK_RESPONSE_OK) goto exit; uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (file_chooser)); /* XXX Would be nice to mention _why_ we can't save. */ if (!e_file_can_save (GTK_WINDOW (file_chooser), uri)) { g_warning ("Unable to save %s", uri); goto exit; } e_file_update_save_path ( gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER (file_chooser)), TRUE); mail_save_part (part, uri, NULL, NULL, FALSE); exit: gtk_widget_destroy (file_chooser); g_free (uri); g_free (filename); } /* It "assigns" to each part its unique file name, based on the appearance. parts contains CamelMimePart, returned value contains gchar *, in same order as parts; resulting list should free data and GSList itself as well. */ static GSList * get_unique_file_names (GSList *parts) { GSList *iter; GSList *file_names = NULL; if (!parts) return NULL; for (iter = parts; iter != NULL; iter = iter->next) { CamelMimePart *part = iter->data; const gchar *utf8_filename; gchar *filename; utf8_filename = emu_save_get_filename_for_part (part); filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); em_filename_make_safe (filename); file_names = g_slist_prepend (file_names, filename); } if (file_names) { GSList *sorted_file_names; gint counter = 1; const gchar *last; GCompareFunc cmp_func = (GCompareFunc) strcmp; #ifdef G_OS_WIN32 cmp_func = (GCompareFunc) g_ascii_strcasecmp; #endif /* we prepended, so reverse to make right order */ file_names = g_slist_reverse (file_names); sorted_file_names = g_slist_sort (g_slist_copy (file_names), cmp_func); last = sorted_file_names->data; for (iter = sorted_file_names->next; iter; iter = iter->next) { gchar *name = iter->data; if (name && last && cmp_func (name, last) == 0) { gchar *new_name; gchar *p = strrchr (name, '.'); GSList *i2; /* if we have an extension, then place number before it (at p is ".ext"), otherwise just append number in brackets */ if (p) new_name = g_strdup_printf ("%.*s(%d)%s", (gint) (p - name), name, counter, p); else new_name = g_strdup_printf ("%s(%d)", name, counter); /* we need to find the proper item in unsorted list and replace with new name; we should always find that item, so no check for leaks */ for (i2 = file_names; i2; i2 = i2->next) { if (i2->data == name) { g_free (name); i2->data = new_name; break; } } counter++; } else { last = name; counter = 1; } } g_slist_free (sorted_file_names); } return file_names; } void em_utils_save_parts (GtkWindow *parent, const gchar *prompt, GSList *parts) { GtkWidget *file_chooser; gchar *path_uri; GSList *iter, *file_names, *iter_file; g_return_if_fail (parent == NULL || GTK_IS_WINDOW (parent)); file_chooser = e_file_get_save_filesel ( parent, prompt, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); if (gtk_dialog_run (GTK_DIALOG (file_chooser)) != GTK_RESPONSE_OK) goto exit; path_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (file_chooser)); e_file_update_save_path (path_uri, FALSE); file_names = get_unique_file_names (parts); for (iter = parts, iter_file = file_names; iter && iter_file; iter = iter->next, iter_file = iter_file->next) { CamelMimePart *part = iter->data; gchar *uri, *filename; filename = iter_file->data; uri = g_build_path ("/", path_uri, filename, NULL); g_free (filename); iter_file->data = NULL; /* XXX Would be nice to mention _why_ we can't save. */ if (e_file_can_save (GTK_WINDOW (file_chooser), uri)) mail_save_part (part, uri, NULL, NULL, FALSE); else g_warning ("Unable to save %s", uri); g_free (uri); } g_slist_free (file_names); g_free (path_uri); exit: gtk_widget_destroy (file_chooser); } /** * em_utils_save_part_to_file: * @parent: parent window * @filename: filename to save to * @part: part to save * * Save a part's content to a specific file * Creates all needed directories and overwrites without prompting * * Returns %TRUE if saving succeeded, %FALSE otherwise **/ gboolean em_utils_save_part_to_file(GtkWindow *parent, const gchar *filename, CamelMimePart *part) { gint done; gchar *dirname; struct stat st; if (filename[0] == 0) return FALSE; dirname = g_path_get_dirname(filename); if (g_mkdir_with_parents(dirname, 0777) == -1) { GtkWidget *w = e_error_new(parent, "mail:no-create-path", filename, g_strerror(errno), NULL); g_free(dirname); em_utils_show_error_silent (w); return FALSE; } g_free(dirname); if (g_access(filename, F_OK) == 0) { if (g_access(filename, W_OK) != 0) { e_error_run(parent, E_ERROR_ASK_FILE_EXISTS_OVERWRITE, filename, NULL); return FALSE; } } if (g_stat(filename, &st) != -1 && !S_ISREG(st.st_mode)) { GtkWidget *w = e_error_new(parent, "mail:no-write-path-notfile", filename, NULL); em_utils_show_error_silent (w); return FALSE; } /* FIXME: This doesn't handle default charsets */ mail_msg_wait(mail_save_part(part, filename, emu_save_part_done, &done, FALSE)); return done; } struct _save_messages_data { CamelFolder *folder; GPtrArray *uids; }; static void emu_save_messages_response(GtkWidget *filesel, gint response, struct _save_messages_data *data) { gchar *uri; if (response == GTK_RESPONSE_OK) { uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (filesel)); if (!e_file_can_save((GtkWindow *)filesel, uri)) { g_free(uri); return; } e_file_update_save_path(gtk_file_chooser_get_current_folder_uri( GTK_FILE_CHOOSER (filesel)), TRUE); mail_save_messages(data->folder, data->uids, uri, NULL, NULL); data->uids = NULL; g_free(uri); } camel_object_unref(data->folder); if (data->uids) em_utils_uids_free(data->uids); g_free(data); gtk_widget_destroy((GtkWidget *)filesel); } /** * em_utils_save_messages: * @parent: parent window * @folder: folder containing messages to save * @uids: uids of messages to save * * Saves a group of messages to disk in mbox format (prompting the * user for filename). **/ void em_utils_save_messages (GtkWindow *parent, CamelFolder *folder, GPtrArray *uids) { struct _save_messages_data *data; GtkWidget *filesel; gchar *filename = NULL; CamelMessageInfo *info = NULL; g_return_if_fail (GTK_IS_WINDOW (parent)); g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (uids != NULL); info = camel_folder_get_message_info (folder, uids->pdata[0]); if (info) { filename = g_strdup (camel_message_info_subject (info)); e_filename_make_safe (filename); camel_message_info_free (info); } filesel = e_file_get_save_filesel (parent, _("Save Message..."), filename, GTK_FILE_CHOOSER_ACTION_SAVE); if (filename) g_free (filename); camel_object_ref(folder); data = g_malloc(sizeof(struct _save_messages_data)); data->folder = folder; data->uids = uids; g_signal_connect(filesel, "response", G_CALLBACK(emu_save_messages_response), data); gtk_widget_show((GtkWidget *)filesel); } /* ********************************************************************** */ static void emu_add_address_cb(BonoboListener *listener, const gchar *name, const CORBA_any *any, CORBA_Environment *ev, gpointer data) { gchar *type = bonobo_event_subtype(name); if (!strcmp(type, "Destroy")) gtk_widget_destroy((GtkWidget *)data); g_free(type); } /* one of email or vcard should be always NULL, never both of them */ static void emu_add_address_or_vcard (GtkWindow *parent, const gchar *email, const gchar *vcard) { GtkWidget *win; GtkWidget *control; /*GtkWidget *socket;*/ gchar *email_buf = NULL; if (email) { CamelInternetAddress *cia; cia = camel_internet_address_new (); if (camel_address_decode ((CamelAddress *) cia, email) == -1) { camel_object_unref (cia); return; } email_buf = camel_address_format ((CamelAddress *) cia); camel_object_unref (cia); } win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title((GtkWindow *)win, _("Add address")); gtk_window_set_transient_for((GtkWindow *)win, parent); gtk_window_set_position((GtkWindow *)win, GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_type_hint((GtkWindow *)win, GDK_WINDOW_TYPE_HINT_DIALOG); control = bonobo_widget_new_control("OAFIID:GNOME_Evolution_Addressbook_AddressPopup:" BASE_VERSION, CORBA_OBJECT_NIL); if (email_buf) bonobo_widget_set_property ((BonoboWidget *) control, "email", TC_CORBA_string, email_buf, NULL); else bonobo_widget_set_property ((BonoboWidget *) control, "vcard", TC_CORBA_string, vcard, NULL); g_free (email_buf); bonobo_event_source_client_add_listener(bonobo_widget_get_objref((BonoboWidget *)control), emu_add_address_cb, NULL, NULL, win); /*socket = find_socket (GTK_CONTAINER (control)); g_object_weak_ref ((GObject *) socket, (GWeakNotify) gtk_widget_destroy, win);*/ gtk_container_add((GtkContainer *)win, control); gtk_widget_show_all(win); } /** * em_utils_add_address: * @parent: * @email: * * Add address @email to the addressbook. **/ void em_utils_add_address (GtkWindow *parent, const gchar *email) { g_return_if_fail (GTK_IS_WINDOW (parent)); emu_add_address_or_vcard (parent, email, NULL); } /** * em_utils_add_vcard: * Adds whole vCard to the addressbook. **/ void em_utils_add_vcard (GtkWindow *parent, const gchar *vcard) { g_return_if_fail (GTK_IS_WINDOW (parent)); emu_add_address_or_vcard (parent, NULL, vcard); } /* ********************************************************************** */ /* Flag-for-Followup... */ /* tag-editor callback data */ struct ted_t { EMFolderView *emfv; MessageTagEditor *editor; CamelFolder *folder; GPtrArray *uids; }; static void ted_free (struct ted_t *ted) { camel_object_unref (ted->folder); em_utils_uids_free (ted->uids); g_free (ted); } static void tag_editor_response (GtkWidget *dialog, gint button, struct ted_t *ted) { CamelFolder *folder; CamelTag *tags, *t; GPtrArray *uids; gint i; if (button == GTK_RESPONSE_OK && (tags = message_tag_editor_get_tag_list (ted->editor))) { folder = ted->folder; uids = ted->uids; camel_folder_freeze (folder); for (i = 0; i < uids->len; i++) { CamelMessageInfo *mi = camel_folder_get_message_info(folder, uids->pdata[i]); if (mi) { for (t = tags; t; t = t->next) camel_message_info_set_user_tag(mi, t->name, t->value); camel_message_info_free(mi); } } camel_folder_thaw (folder); camel_tag_list_free (&tags); if (ted->emfv->preview) em_format_redraw (EM_FORMAT (ted->emfv->preview)); } gtk_widget_destroy (dialog); } /** * em_utils_flag_for_followup: * @parent: parent window * @folder: folder containing messages to flag * @uids: uids of messages to flag * * Open the Flag-for-Followup editor for the messages specified by * @folder and @uids. **/ void em_utils_flag_for_followup (GtkWindow *parent, CamelFolder *folder, GPtrArray *uids) { GtkWidget *editor; struct ted_t *ted; gint i; g_return_if_fail (GTK_IS_WINDOW (parent)); g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (uids != NULL); editor = (GtkWidget *) message_tag_followup_new (); gtk_window_set_transient_for (GTK_WINDOW (editor), parent); camel_object_ref (folder); ted = g_new (struct ted_t, 1); ted->emfv = (EMFolderView *) parent; ted->editor = MESSAGE_TAG_EDITOR (editor); ted->folder = folder; ted->uids = uids; for (i = 0; i < uids->len; i++) { CamelMessageInfo *info; info = camel_folder_get_message_info (folder, uids->pdata[i]); if (info) { message_tag_followup_append_message (MESSAGE_TAG_FOLLOWUP (editor), camel_message_info_from (info), camel_message_info_subject (info)); camel_message_info_free(info); } } /* special-case... */ if (uids->len == 1) { CamelMessageInfo *info; info = camel_folder_get_message_info (folder, uids->pdata[0]); if (info) { const CamelTag *tags = camel_message_info_user_tags(info); if (tags) message_tag_editor_set_tag_list (MESSAGE_TAG_EDITOR (editor), (CamelTag *)tags); camel_message_info_free(info); } } g_signal_connect (editor, "response", G_CALLBACK (tag_editor_response), ted); g_object_weak_ref ((GObject *) editor, (GWeakNotify) ted_free, ted); gtk_widget_show (editor); } /** * em_utils_flag_for_followup_clear: * @parent: parent window * @folder: folder containing messages to unflag * @uids: uids of messages to unflag * * Clears the Flag-for-Followup flag on the messages referenced by * @folder and @uids. **/ void em_utils_flag_for_followup_clear (GtkWindow *parent, CamelFolder *folder, GPtrArray *uids) { gint i; g_return_if_fail (GTK_IS_WINDOW (parent)); g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (uids != NULL); camel_folder_freeze (folder); for (i = 0; i < uids->len; i++) { CamelMessageInfo *mi = camel_folder_get_message_info(folder, uids->pdata[i]); if (mi) { camel_message_info_set_user_tag(mi, "follow-up", NULL); camel_message_info_set_user_tag(mi, "due-by", NULL); camel_message_info_set_user_tag(mi, "completed-on", NULL); camel_message_info_free(mi); } } camel_folder_thaw (folder); em_utils_uids_free (uids); } /** * em_utils_flag_for_followup_completed: * @parent: parent window * @folder: folder containing messages to 'complete' * @uids: uids of messages to 'complete' * * Sets the completed state (and date/time) for each message * referenced by @folder and @uids that is marked for * Flag-for-Followup. **/ void em_utils_flag_for_followup_completed (GtkWindow *parent, CamelFolder *folder, GPtrArray *uids) { gchar *now; gint i; g_return_if_fail (GTK_IS_WINDOW (parent)); g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (uids != NULL); now = camel_header_format_date (time (NULL), 0); camel_folder_freeze (folder); for (i = 0; i < uids->len; i++) { const gchar *tag; CamelMessageInfo *mi = camel_folder_get_message_info(folder, uids->pdata[i]); if (mi) { tag = camel_message_info_user_tag(mi, "follow-up"); if (tag && tag[0]) camel_message_info_set_user_tag(mi, "completed-on", now); camel_message_info_free(mi); } } camel_folder_thaw (folder); g_free (now); em_utils_uids_free (uids); } #include "camel/camel-stream-mem.h" #include "camel/camel-stream-filter.h" #include "camel/camel-mime-filter-from.h" /* This kind of sucks, because for various reasons most callers need to run synchronously in the gui thread, however this could take a long, blocking time, to run */ static gint em_utils_write_messages_to_stream(CamelFolder *folder, GPtrArray *uids, CamelStream *stream) { CamelStreamFilter *filtered_stream; CamelMimeFilterFrom *from_filter; gint i, res = 0; from_filter = camel_mime_filter_from_new(); filtered_stream = camel_stream_filter_new_with_stream(stream); camel_stream_filter_add(filtered_stream, (CamelMimeFilter *)from_filter); camel_object_unref(from_filter); for (i=0; i<uids->len; i++) { CamelMimeMessage *message; gchar *from; message = camel_folder_get_message(folder, uids->pdata[i], NULL); if (message == NULL) { res = -1; break; } /* we need to flush after each stream write since we are writing to the same stream */ from = camel_mime_message_build_mbox_from(message); if (camel_stream_write_string(stream, from) == -1 || camel_stream_flush(stream) == -1 || camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, (CamelStream *)filtered_stream) == -1 || camel_stream_flush((CamelStream *)filtered_stream) == -1) res = -1; g_free(from); camel_object_unref(message); if (res == -1) break; } camel_object_unref(filtered_stream); return res; } /* This kind of sucks, because for various reasons most callers need to run synchronously in the gui thread, however this could take a long, blocking time, to run */ static gint em_utils_read_messages_from_stream(CamelFolder *folder, CamelStream *stream) { CamelException *ex = camel_exception_new(); CamelMimeParser *mp = camel_mime_parser_new(); gint res = -1; camel_mime_parser_scan_from(mp, TRUE); camel_mime_parser_init_with_stream(mp, stream); while (camel_mime_parser_step(mp, NULL, NULL) == CAMEL_MIME_PARSER_STATE_FROM) { CamelMimeMessage *msg; /* NB: de-from filter, once written */ msg = camel_mime_message_new(); if (camel_mime_part_construct_from_parser((CamelMimePart *)msg, mp) == -1) { camel_object_unref(msg); break; } camel_folder_append_message(folder, msg, NULL, NULL, ex); camel_object_unref(msg); if (camel_exception_is_set (ex)) break; camel_mime_parser_step(mp, NULL, NULL); } camel_object_unref(mp); if (!camel_exception_is_set(ex)) res = 0; camel_exception_free(ex); return res; } /** * em_utils_selection_set_mailbox: * @data: selection data * @folder: folder containign messages to copy into the selection * @uids: uids of the messages to copy into the selection * * Creates a mailbox-format selection. * Warning: Could be BIG! * Warning: This could block the ui for an extended period. **/ void em_utils_selection_set_mailbox(GtkSelectionData *data, CamelFolder *folder, GPtrArray *uids) { CamelStream *stream; stream = camel_stream_mem_new(); if (em_utils_write_messages_to_stream(folder, uids, stream) == 0) gtk_selection_data_set(data, data->target, 8, ((CamelStreamMem *)stream)->buffer->data, ((CamelStreamMem *)stream)->buffer->len); camel_object_unref(stream); } /** * em_utils_selection_get_mailbox: * @data: selection data * @folder: * * Receive a mailbox selection/dnd * Warning: Could be BIG! * Warning: This could block the ui for an extended period. * FIXME: Exceptions? **/ void em_utils_selection_get_mailbox(GtkSelectionData *data, CamelFolder *folder) { CamelStream *stream; if (data->data == NULL || data->length == -1) return; /* TODO: a stream mem with read-only access to existing data? */ /* NB: Although copying would let us run this async ... which it should */ stream = (CamelStream *)camel_stream_mem_new_with_buffer((gchar *)data->data, data->length); em_utils_read_messages_from_stream(folder, stream); camel_object_unref(stream); } /** * em_utils_selection_get_message: * @data: * @folder: * * get a message/rfc822 data. **/ void em_utils_selection_get_message(GtkSelectionData *data, CamelFolder *folder) { CamelStream *stream; CamelException *ex; CamelMimeMessage *msg; if (data->data == NULL || data->length == -1) return; ex = camel_exception_new(); stream = (CamelStream *)camel_stream_mem_new_with_buffer((gchar *)data->data, data->length); msg = camel_mime_message_new(); if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, stream) == 0) camel_folder_append_message(folder, msg, NULL, NULL, ex); camel_object_unref(msg); camel_object_unref(stream); camel_exception_free(ex); } /** * em_utils_selection_set_uidlist: * @data: selection data * @uri: * @uids: * * Sets a "x-uid-list" format selection data. * * FIXME: be nice if this could take a folder argument rather than uri **/ void em_utils_selection_set_uidlist(GtkSelectionData *data, const gchar *uri, GPtrArray *uids) { GByteArray *array = g_byte_array_new(); gint i; /* format: "uri\0uid1\0uid2\0uid3\0...\0uidn\0" */ g_byte_array_append(array, (guchar *)uri, strlen(uri)+1); for (i=0; i<uids->len; i++) g_byte_array_append(array, uids->pdata[i], strlen(uids->pdata[i])+1); gtk_selection_data_set(data, data->target, 8, array->data, array->len); g_byte_array_free(array, TRUE); } /** * em_utils_selection_get_uidlist: * @data: selection data * @move: do we delete the messages. * * Convert a uid list into a copy/move operation. * * Warning: Could take some time to run. **/ void em_utils_selection_get_uidlist(GtkSelectionData *data, CamelFolder *dest, gint move, CamelException *ex) { /* format: "uri\0uid1\0uid2\0uid3\0...\0uidn" */ gchar *inptr, *inend; GPtrArray *uids; CamelFolder *folder; if (data == NULL || data->data == NULL || data->length == -1) return; uids = g_ptr_array_new(); inptr = (gchar *)data->data; inend = (gchar *)(data->data + data->length); while (inptr < inend) { gchar *start = inptr; while (inptr < inend && *inptr) inptr++; if (start > (gchar *)data->data) g_ptr_array_add(uids, g_strndup(start, inptr-start)); inptr++; } if (uids->len == 0) { g_ptr_array_free(uids, TRUE); return; } folder = mail_tool_uri_to_folder((gchar *)data->data, 0, ex); if (folder) { camel_folder_transfer_messages_to(folder, uids, dest, NULL, move, ex); camel_object_unref(folder); } em_utils_uids_free(uids); } /** * em_utils_selection_set_urilist: * @data: * @folder: * @uids: * * Set the selection data @data to a uri which points to a file, which is * a berkely mailbox format mailbox. The file is automatically cleaned * up when the application quits. **/ void em_utils_selection_set_urilist(GtkSelectionData *data, CamelFolder *folder, GPtrArray *uids) { gchar *tmpdir; CamelStream *fstream; gchar *uri, *file = NULL, *tmpfile; gint fd; CamelMessageInfo *info; tmpdir = e_mkdtemp("drag-n-drop-XXXXXX"); if (tmpdir == NULL) return; /* Try to get the drop filename from the message or folder */ if (uids->len == 1) { info = camel_folder_get_message_info(folder, uids->pdata[0]); if (info) { file = g_strdup(camel_message_info_subject(info)); camel_folder_free_message_info(folder, info); } } /* TODO: Handle conflicts? */ if (file == NULL) { /* Drop filename for messages from a mailbox */ file = g_strdup_printf(_("Messages from %s"), folder->name); } e_filename_make_safe(file); tmpfile = g_build_filename(tmpdir, file, NULL); g_free(tmpdir); g_free(file); fd = g_open(tmpfile, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0666); if (fd == -1) { g_free(tmpfile); return; } uri = g_filename_to_uri(tmpfile, NULL, NULL); g_free(tmpfile); fstream = camel_stream_fs_new_with_fd(fd); if (fstream) { if (em_utils_write_messages_to_stream(folder, uids, fstream) == 0) { /* terminate with \r\n to be compliant with the spec */ gchar *uri_crlf = g_strconcat(uri, "\r\n", NULL); gtk_selection_data_set(data, data->target, 8, (guchar *)uri_crlf, strlen(uri_crlf)); g_free(uri_crlf); } camel_object_unref(fstream); } else close(fd); g_free(uri); } /** * em_utils_selection_set_urilist: * @data: * @folder: * @uids: * * Get the selection data @data from a uri list which points to a * file, which is a berkely mailbox format mailbox. The file is * automatically cleaned up when the application quits. **/ void em_utils_selection_get_urilist(GtkSelectionData *data, CamelFolder *folder) { CamelStream *stream; CamelURL *url; gint fd, i, res = 0; gchar *tmp, **uris; d(printf(" * drop uri list\n")); tmp = g_strndup((gchar *)data->data, data->length); uris = g_strsplit(tmp, "\n", 0); g_free(tmp); for (i=0;res == 0 && uris[i];i++) { g_strstrip(uris[i]); if (uris[i][0] == '#') continue; url = camel_url_new(uris[i], NULL); if (url == NULL) continue; if (strcmp(url->protocol, "file") == 0 && (fd = g_open(url->path, O_RDONLY | O_BINARY, 0)) != -1) { stream = camel_stream_fs_new_with_fd(fd); if (stream) { res = em_utils_read_messages_from_stream(folder, stream); camel_object_unref(stream); } else close(fd); } camel_url_free(url); } g_strfreev(uris); } static void emu_save_part_done(CamelMimePart *part, gchar *name, gint done, gpointer data) { ((gint *)data)[0] = done; } /** * em_utils_temp_save_part: * @parent: * @part: * @mode: readonly or not. * * Save a part's content to a temporary file, and return the * filename. * * Return value: NULL if anything failed. **/ gchar * em_utils_temp_save_part(GtkWidget *parent, CamelMimePart *part, gboolean mode) { const gchar *filename; gchar *tmpdir, *path, *utf8_mfilename = NULL, *mfilename = NULL; gint done; GtkWidget *w; tmpdir = e_mkdtemp("evolution-tmp-XXXXXX"); if (tmpdir == NULL) { w = e_error_new((GtkWindow *)parent, "mail:no-create-tmp-path", g_strerror(errno), NULL); em_utils_show_error_silent (w); return NULL; } filename = camel_mime_part_get_filename (part); if (filename == NULL) { /* This is the default filename used for temporary file creation */ filename = _("Unknown"); } else { utf8_mfilename = g_strdup (filename); e_filename_make_safe (utf8_mfilename); mfilename = g_filename_from_utf8 ((const gchar *) utf8_mfilename, -1, NULL, NULL, NULL); g_free (utf8_mfilename); filename = (const gchar *) mfilename; } path = g_build_filename(tmpdir, filename, NULL); g_free(tmpdir); g_free(mfilename); /* FIXME: This doesn't handle default charsets */ if (mode) mail_msg_wait(mail_save_part(part, path, emu_save_part_done, &done, TRUE)); else mail_msg_wait(mail_save_part(part, path, emu_save_part_done, &done, FALSE)); if (!done) { /* mail_save_part should popup an error box automagically */ g_free(path); path = NULL; } return path; } /** em_utils_folder_is_templates: * @folder: folder * @uri: uri for this folder, if known * * Decides if @folder is a Templates folder. * * Returns %TRUE if this is a Drafts folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_templates (CamelFolder *folder, const gchar *uri) { CamelFolder *local_templates_folder; EAccountList *accounts; EAccount *account; EIterator *iter; gint is = FALSE; gchar *templates_uri; local_templates_folder = e_mail_shell_backend_get_folder ( global_mail_shell_backend, E_MAIL_FOLDER_TEMPLATES); if (folder == local_templates_folder) return TRUE; if (folder == NULL || uri == NULL) return FALSE; accounts = e_get_account_list (); iter = e_list_get_iterator ((EList *)accounts); while (e_iterator_is_valid (iter)) { account = (EAccount *)e_iterator_get (iter); if (account->templates_folder_uri) { templates_uri = em_uri_to_camel (account->templates_folder_uri); if (camel_store_folder_uri_equal (folder->parent_store, templates_uri, uri)) { g_free (templates_uri); is = TRUE; break; } g_free (templates_uri); } e_iterator_next (iter); } g_object_unref (iter); return is; } /** * em_utils_folder_is_drafts: * @folder: folder * @uri: uri for this folder, if known * * Decides if @folder is a Drafts folder. * * Returns %TRUE if this is a Drafts folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_drafts(CamelFolder *folder, const gchar *uri) { CamelFolder *local_drafts_folder; EAccountList *accounts; EAccount *account; EIterator *iter; gint is = FALSE; gchar *drafts_uri; local_drafts_folder = e_mail_shell_backend_get_folder ( global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); if (folder == local_drafts_folder) return TRUE; if (folder == NULL || uri == NULL) return FALSE; accounts = e_get_account_list (); iter = e_list_get_iterator((EList *)accounts); while (e_iterator_is_valid(iter)) { account = (EAccount *)e_iterator_get(iter); if (account->drafts_folder_uri) { drafts_uri = em_uri_to_camel (account->drafts_folder_uri); if (camel_store_folder_uri_equal (folder->parent_store, drafts_uri, uri)) { g_free (drafts_uri); is = TRUE; break; } g_free (drafts_uri); } e_iterator_next(iter); } g_object_unref(iter); return is; } /** * em_utils_folder_is_sent: * @folder: folder * @uri: uri for this folder, if known * * Decides if @folder is a Sent folder * * Returns %TRUE if this is a Sent folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_sent(CamelFolder *folder, const gchar *uri) { CamelFolder *local_sent_folder; EAccountList *accounts; EAccount *account; EIterator *iter; gint is = FALSE; gchar *sent_uri; local_sent_folder = e_mail_shell_backend_get_folder ( global_mail_shell_backend, E_MAIL_FOLDER_SENT); if (folder == local_sent_folder) return TRUE; if (folder == NULL || uri == NULL) return FALSE; accounts = e_get_account_list (); iter = e_list_get_iterator((EList *)accounts); while (e_iterator_is_valid(iter)) { account = (EAccount *)e_iterator_get(iter); if (account->sent_folder_uri) { sent_uri = em_uri_to_camel (account->sent_folder_uri); if (camel_store_folder_uri_equal (folder->parent_store, sent_uri, uri)) { g_free (sent_uri); is = TRUE; break; } g_free (sent_uri); } e_iterator_next(iter); } g_object_unref(iter); return is; } /** * em_utils_folder_is_outbox: * @folder: folder * @uri: uri for this folder, if known * * Decides if @folder is an Outbox folder * * Returns %TRUE if this is an Outbox folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_outbox(CamelFolder *folder, const gchar *uri) { CamelFolder *local_outbox_folder; local_outbox_folder = e_mail_shell_backend_get_folder ( global_mail_shell_backend, E_MAIL_FOLDER_OUTBOX); /* <Highlander>There can be only one.</Highlander> */ return folder == local_outbox_folder; } /** * em_utils_adjustment_page: * @adj: * @down: * * Move an adjustment up/down forward/back one page. **/ void em_utils_adjustment_page(GtkAdjustment *adj, gboolean down) { gfloat page_size = adj->page_size - adj->step_increment; if (down) { if (adj->value < adj->upper - adj->page_size - page_size) adj->value += page_size; else if (adj->upper >= adj->page_size) adj->value = adj->upper - adj->page_size; else adj->value = adj->lower; } else { if (adj->value > adj->lower + page_size) adj->value -= page_size; else adj->value = adj->lower; } gtk_adjustment_value_changed(adj); } /* ********************************************************************** */ static EProxy *emu_proxy = NULL; static GStaticMutex emu_proxy_lock = G_STATIC_MUTEX_INIT; static gpointer emu_proxy_setup (gpointer data) { if (!emu_proxy) { emu_proxy = e_proxy_new (); e_proxy_setup_proxy (emu_proxy); /* not necessary to listen for changes here */ } return NULL; } /** * em_utils_get_proxy_uri: * * Get the system proxy uri for 'pUri'. * * Return value: Must be freed when finished with. **/ gchar * em_utils_get_proxy_uri (const gchar *pUri) { gchar *uri = NULL; g_static_mutex_lock (&emu_proxy_lock); if (!emu_proxy) { mail_call_main (MAIL_CALL_p_p, (MailMainFunc)emu_proxy_setup, NULL); } if (e_proxy_require_proxy_for_uri (emu_proxy, pUri)) uri = soup_uri_to_string (e_proxy_peek_uri_for (emu_proxy, pUri), FALSE); g_static_mutex_unlock (&emu_proxy_lock); return uri; } /** * em_utils_message_to_html: * @message: * @credits: * @flags: EMFormatQuote flags * @len: * @source: * @append: Text to append, can be NULL. * * Convert a message to html, quoting if the @credits attribution * string is given. * * Return value: The html version. **/ gchar * em_utils_message_to_html(CamelMimeMessage *message, const gchar *credits, guint32 flags, gssize *len, EMFormat *source, const gchar *append) { EMFormatQuote *emfq; CamelStreamMem *mem; GByteArray *buf; gchar *text; buf = g_byte_array_new (); mem = (CamelStreamMem *) camel_stream_mem_new (); camel_stream_mem_set_byte_array (mem, buf); emfq = em_format_quote_new(credits, (CamelStream *)mem, flags); ((EMFormat *) emfq)->composer = TRUE; if (!source) { GConfClient *gconf; gchar *charset; /* FIXME: we should be getting this from the current view, not the global setting. */ gconf = gconf_client_get_default (); charset = gconf_client_get_string (gconf, "/apps/evolution/mail/display/charset", NULL); em_format_set_default_charset ((EMFormat *) emfq, charset); g_object_unref (gconf); g_free (charset); } em_format_format_clone((EMFormat *)emfq, NULL, NULL, message, source); g_object_unref (emfq); if (append && *append) camel_stream_write ((CamelStream*)mem, append, strlen (append)); camel_stream_write((CamelStream *)mem, "", 1); camel_object_unref(mem); text = (gchar *)buf->data; if (len) *len = buf->len-1; g_byte_array_free(buf, FALSE); return text; } /* ********************************************************************** */ /** * em_utils_expunge_folder: * @parent: parent window * @folder: folder to expunge * * Expunges @folder. **/ void em_utils_expunge_folder (GtkWidget *parent, CamelFolder *folder) { gchar *name; camel_object_get(folder, NULL, CAMEL_OBJECT_DESCRIPTION, &name, 0); if (!em_utils_prompt_user ((GtkWindow *) parent, "/apps/evolution/mail/prompts/expunge", "mail:ask-expunge", name, NULL)) return; mail_expunge_folder(folder, NULL, NULL); } /** * em_utils_empty_trash: * @parent: parent window * * Empties all Trash folders. **/ void em_utils_empty_trash (GtkWidget *parent) { CamelProvider *provider; EAccountList *accounts; EAccount *account; EIterator *iter; CamelException ex; if (!em_utils_prompt_user((GtkWindow *) parent, "/apps/evolution/mail/prompts/empty_trash", "mail:ask-empty-trash", NULL)) return; camel_exception_init (&ex); /* expunge all remote stores */ accounts = e_get_account_list (); iter = e_list_get_iterator ((EList *) accounts); while (e_iterator_is_valid (iter)) { account = (EAccount *) e_iterator_get (iter); /* make sure this is a valid source */ if (account->enabled && account->source->url) { provider = camel_provider_get(account->source->url, &ex); if (provider) { /* make sure this store is a remote store */ if (provider->flags & CAMEL_PROVIDER_IS_STORAGE && provider->flags & CAMEL_PROVIDER_IS_REMOTE) { mail_empty_trash (account, NULL, NULL); } } /* clear the exception for the next round */ camel_exception_clear (&ex); } e_iterator_next (iter); } g_object_unref (iter); /* Now empty the local trash folder */ mail_empty_trash (NULL, NULL, NULL); } gchar * em_utils_folder_name_from_uri (const gchar *uri) { CamelURL *url; gchar *folder_name = NULL; if (uri == NULL || (url = camel_url_new (uri, NULL)) == NULL) return NULL; if (url->fragment) folder_name = url->fragment; else if (url->path) folder_name = url->path + 1; if (folder_name == NULL) { camel_url_free (url); return NULL; } folder_name = g_strdup (folder_name); camel_url_free (url); return folder_name; } /* email: uri's are based on the account, with special cases for local * stores, vfolder and local mail. * e.g. * imap account imap://user@host/ -> email://accountid@accountid.host/ * vfolder vfolder:/storage/path#folder -> email://vfolder@local/folder * local local:/storage/path#folder -> email://local@local/folder */ gchar *em_uri_from_camel(const gchar *curi) { CamelURL *curl; EAccount *account; const gchar *uid, *path; gchar *euri, *tmp; CamelProvider *provider; CamelException ex; /* Easiest solution to code that shouldnt be calling us */ if (!strncmp(curi, "email:", 6)) return g_strdup(curi); camel_exception_init(&ex); provider = camel_provider_get(curi, &ex); if (provider == NULL) { camel_exception_clear(&ex); d(printf("em uri from camel failed '%s'\n", curi)); return g_strdup(curi); } curl = camel_url_new(curi, &ex); camel_exception_clear(&ex); if (curl == NULL) return g_strdup(curi); if (strcmp(curl->protocol, "vfolder") == 0) uid = "vfolder@local"; else if ((account = mail_config_get_account_by_source_url(curi)) == NULL) uid = "local@local"; else uid = account->uid; path = (provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH)?curl->fragment:curl->path; if (path) { if (path[0] == '/') path++; tmp = camel_url_encode(path, ";?"); euri = g_strdup_printf("email://%s/%s", uid, tmp); g_free(tmp); } else { euri = g_strdup_printf("email://%s/", uid); } d(printf("em uri from camel '%s' -> '%s'\n", curi, euri)); camel_url_free(curl); return euri; } gchar *em_uri_to_camel(const gchar *euri) { EAccountList *accounts; const EAccount *account; EAccountService *service; CamelProvider *provider; CamelURL *eurl, *curl; gchar *uid, *curi; if (strncmp(euri, "email:", 6) != 0) { d(printf("em uri to camel not euri '%s'\n", euri)); return g_strdup(euri); } eurl = camel_url_new(euri, NULL); if (eurl == NULL) return g_strdup(euri); g_return_val_if_fail (eurl->host != NULL, g_strdup(euri)); if (eurl->user != NULL) { /* Sigh, shoul'dve used mbox@local for mailboxes, not local@local */ if (strcmp(eurl->host, "local") == 0 && (strcmp(eurl->user, "local") == 0 || strcmp(eurl->user, "vfolder") == 0)) { gchar *base; if (strcmp(eurl->user, "vfolder") == 0) curl = camel_url_new("vfolder:", NULL); else curl = camel_url_new("mbox:", NULL); base = g_strdup_printf("%s/.evolution/mail/%s", g_get_home_dir(), eurl->user); #ifdef G_OS_WIN32 /* Turn backslashes into slashes to avoid URI encoding */ { gchar *p = base; while ((p = strchr (p, '\\'))) *p++ = '/'; } #endif camel_url_set_path(curl, base); g_free(base); camel_url_set_fragment(curl, eurl->path[0]=='/'?eurl->path+1:eurl->path); curi = camel_url_to_string(curl, 0); camel_url_free(curl); camel_url_free(eurl); d(printf("em uri to camel local '%s' -> '%s'\n", euri, curi)); return curi; } uid = g_strdup_printf("%s@%s", eurl->user, eurl->host); } else { uid = g_strdup(eurl->host); } accounts = e_get_account_list (); account = e_account_list_find(accounts, E_ACCOUNT_FIND_UID, uid); g_free(uid); if (account == NULL) { camel_url_free(eurl); d(printf("em uri to camel no account '%s' -> '%s'\n", euri, euri)); return g_strdup(euri); } service = account->source; if (!(provider = camel_provider_get (service->url, NULL))) return g_strdup (euri); curl = camel_url_new(service->url, NULL); if (provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH) camel_url_set_fragment(curl, eurl->path[0]=='/'?eurl->path+1:eurl->path); else camel_url_set_path(curl, eurl->path); curi = camel_url_to_string(curl, 0); camel_url_free(eurl); camel_url_free(curl); d(printf("em uri to camel '%s' -> '%s'\n", euri, curi)); return curi; } /* ********************************************************************** */ #include <libebook/e-book.h> struct _addr_node { gchar *addr; time_t stamp; gint found; }; #define EMU_ADDR_CACHE_TIME (60*30) /* in seconds */ static pthread_mutex_t emu_addr_lock = PTHREAD_MUTEX_INITIALIZER; static ESourceList *emu_addr_list; static GHashTable *emu_addr_cache; /* runs sync, in main thread */ static gpointer emu_addr_setup(gpointer dummy) { GError *err = NULL; emu_addr_cache = g_hash_table_new(g_str_hash, g_str_equal); if (!e_book_get_addressbooks(&emu_addr_list, &err)) g_error_free(err); return NULL; } static void emu_addr_cancel_book(gpointer data) { EBook *book = data; GError *err = NULL; /* we dunna care if this fails, its just the best we can try */ e_book_cancel(book, &err); g_clear_error(&err); } struct TryOpenEBookStruct { GError **error; EFlag *flag; gboolean result; }; static void try_open_e_book_cb (EBook *book, EBookStatus status, gpointer closure) { struct TryOpenEBookStruct *data = (struct TryOpenEBookStruct *)closure; if (!data) return; data->result = status == E_BOOK_ERROR_OK; if (!data->result) { g_clear_error (data->error); g_set_error (data->error, E_BOOK_ERROR, status, "EBookStatus returned %d", status); } e_flag_set (data->flag); } /** * try_open_e_book: * Tries to open address book asynchronously, but acts as synchronous. * The advantage is it checks periodically whether the camel_operation * has been canceled or not, and if so, then stops immediately, with * result FALSE. Otherwise returns same as e_book_open **/ static gboolean try_open_e_book (EBook *book, gboolean only_if_exists, GError **error) { struct TryOpenEBookStruct data; gboolean canceled = FALSE; EFlag *flag = e_flag_new (); data.error = error; data.flag = flag; data.result = FALSE; if (e_book_async_open (book, only_if_exists, try_open_e_book_cb, &data) != FALSE) { e_flag_free (flag); g_clear_error (error); g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_OTHER_ERROR, "Failed to call e_book_async_open."); return FALSE; } while (canceled = camel_operation_cancel_check (NULL), !canceled && !e_flag_is_set (flag)) { GTimeVal wait; g_get_current_time (&wait); g_time_val_add (&wait, 250000); /* waits 250ms */ e_flag_timed_wait (flag, &wait); } if (canceled) { g_clear_error (error); g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED, "Operation has been canceled."); e_book_cancel_async_op (book, NULL); /* it had been canceled, the above callback may not be called, thus setting flag here */ e_flag_set (flag); } e_flag_wait (flag); e_flag_free (flag); return data.result && (!error || !*error); } static gboolean is_local (ESourceGroup *group) { return group && e_source_group_peek_base_uri (group) && g_str_has_prefix (e_source_group_peek_base_uri (group), "file://"); } gboolean em_utils_in_addressbook (CamelInternetAddress *iaddr, gboolean local_only) { GError *err = NULL; GSList *s, *g, *addr_sources = NULL; gint stop = FALSE, found = FALSE; EBookQuery *query; const gchar *addr; struct _addr_node *node; time_t now; /* TODO: check all addresses? */ if (iaddr == NULL || !camel_internet_address_get(iaddr, 0, NULL, &addr)) return FALSE; pthread_mutex_lock(&emu_addr_lock); if (emu_addr_cache == NULL) { mail_call_main(MAIL_CALL_p_p, (MailMainFunc)emu_addr_setup, NULL); } if (emu_addr_list == NULL) { pthread_mutex_unlock(&emu_addr_lock); return FALSE; } now = time(NULL); d(printf("Checking '%s' is in addressbook", addr)); node = g_hash_table_lookup(emu_addr_cache, addr); if (node) { d(printf(" -> cached, found %s\n", node->found?"yes":"no")); if (node->stamp + EMU_ADDR_CACHE_TIME > now) { found = node->found; pthread_mutex_unlock(&emu_addr_lock); return found; } d(printf(" but expired!\n")); } else { d(printf(" -> not found in cache\n")); node = g_malloc0(sizeof(*node)); node->addr = g_strdup(addr); g_hash_table_insert(emu_addr_cache, node->addr, node); } query = e_book_query_field_test(E_CONTACT_EMAIL, E_BOOK_QUERY_IS, addr); /* FIXME: this aint threadsafe by any measure, but what can you do eh??? */ for (g = e_source_list_peek_groups(emu_addr_list);g;g=g_slist_next(g)) { if (local_only && !is_local (g->data)) continue; for (s = e_source_group_peek_sources((ESourceGroup *)g->data);s;s=g_slist_next(s)) { ESource *src = s->data; const gchar *completion = e_source_get_property (src, "completion"); if (completion && !g_ascii_strcasecmp (completion, "true")) { addr_sources = g_slist_prepend(addr_sources, src); g_object_ref(src); } } } for (s = addr_sources;!stop && !found && s;s=g_slist_next(s)) { ESource *source = s->data; GList *contacts; EBook *book; GHook *hook; d(printf(" checking '%s'\n", e_source_get_uri(source))); /* could this take a while? no way to cancel it? */ book = e_book_new(source, &err); if (book == NULL) { if (err && !g_error_matches (err, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) g_warning ("%s: Unable to create addressbook: %s", G_STRFUNC, err->message); g_clear_error(&err); continue; } g_clear_error(&err); hook = mail_cancel_hook_add(emu_addr_cancel_book, book); /* ignore errors, but cancellation errors we don't try to go further either */ if (!try_open_e_book (book, TRUE, &err) || !e_book_get_contacts(book, query, &contacts, &err)) { stop = err && g_error_matches (err, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED); mail_cancel_hook_remove(hook); g_object_unref(book); if (err && !stop) g_warning ("%s: Can't get contacts: %s", G_STRFUNC, err->message); g_clear_error(&err); continue; } mail_cancel_hook_remove(hook); if (contacts != NULL) { found = TRUE; g_list_foreach(contacts, (GFunc)g_object_unref, NULL); g_list_free(contacts); } stop = stop || camel_operation_cancel_check (NULL); d(printf(" %s\n", stop?"found":"not found")); g_object_unref(book); } g_slist_free(addr_sources); if (!stop) { node->found = found; node->stamp = now; } e_book_query_unref(query); pthread_mutex_unlock(&emu_addr_lock); return found; } CamelMimePart * em_utils_contact_photo (CamelInternetAddress *cia, gboolean local) { const gchar *addr; gint stop = FALSE, found = FALSE; GSList *s, *g, *addr_sources = NULL; GError *err = NULL; EBookQuery *query = NULL; ESource *source = NULL; GList *contacts = NULL; EContact *contact = NULL; EContactPhoto *photo = NULL; EBook *book = NULL; CamelMimePart *part; if (cia == NULL || !camel_internet_address_get(cia, 0, NULL, &addr)){ return NULL; } if (!emu_addr_list){ if (!e_book_get_addressbooks(&emu_addr_list, &err)){ g_error_free(err); return NULL; } } query = e_book_query_field_test(E_CONTACT_EMAIL, E_BOOK_QUERY_IS, addr); for (g = e_source_list_peek_groups(emu_addr_list); g; g = g_slist_next(g)) { if (local && !is_local (g->data)) continue; for (s = e_source_group_peek_sources((ESourceGroup *)g->data); s; s=g_slist_next(s)) { ESource *src = s->data; const gchar *completion = e_source_get_property (src, "completion"); if (completion && !g_ascii_strcasecmp (completion, "true")) { addr_sources = g_slist_prepend(addr_sources, src); g_object_ref(src); } } } for (s = addr_sources;!stop && !found && s;s=g_slist_next(s)) { source = s->data; book = e_book_new(source, &err); if (!book) { if (err && !g_error_matches (err, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) g_warning ("%s: Unable to create addressbook: %s", G_STRFUNC, err->message); g_clear_error (&err); continue; } g_clear_error (&err); if (!try_open_e_book (book, TRUE, &err) || !e_book_get_contacts(book, query, &contacts, &err)) { stop = err && g_error_matches (err, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED); g_object_unref(book); if (err && !stop) g_warning ("%s: Can't get contacts: %s", G_STRFUNC, err->message); g_clear_error(&err); continue; } g_clear_error (&err); if (contacts != NULL) { found = TRUE; /* Doesn't matter, we consider the first contact only*/ contact = contacts->data; photo = e_contact_get (contact, E_CONTACT_PHOTO); if (!photo) photo = e_contact_get (contact, E_CONTACT_LOGO); g_list_foreach (contacts, (GFunc)g_object_unref, NULL); g_list_free (contacts); } stop = stop || camel_operation_cancel_check (NULL); g_object_unref (source); /* Is it? */ g_object_unref(book); } g_slist_free(addr_sources); e_book_query_unref(query); if (!photo) return NULL; if (photo->type != E_CONTACT_PHOTO_TYPE_INLINED) { e_contact_photo_free (photo); return NULL; } /* Form a mime part out of the photo */ part = camel_mime_part_new(); camel_mime_part_set_content(part, (const gchar *) photo->data.inlined.data, photo->data.inlined.length, "image/jpeg"); e_contact_photo_free (photo); return part; } void em_utils_clear_get_password_canceled_accounts_flag (void) { EAccountList *accounts; accounts = e_get_account_list (); if (accounts) { EIterator *iter; for (iter = e_list_get_iterator ((EList *) accounts); e_iterator_is_valid (iter); e_iterator_next (iter)) { EAccount *account = (EAccount *) e_iterator_get (iter); if (account && account->source) account->source->get_password_canceled = FALSE; if (account && account->transport) account->transport->get_password_canceled = FALSE; } g_object_unref (iter); } } void em_utils_show_error_silent (GtkWidget *widget) { EShellBackend *shell_backend; EActivity *activity; shell_backend = E_SHELL_BACKEND (global_mail_shell_backend); activity = e_alert_activity_new_warning (widget); e_shell_backend_add_activity (shell_backend, activity); g_object_unref (activity); if (g_object_get_data (G_OBJECT (widget), "response-handled") == NULL) g_signal_connect ( widget, "response", G_CALLBACK (gtk_widget_destroy), NULL); } void em_utils_show_info_silent (GtkWidget *widget) { EShellBackend *shell_backend; EActivity *activity; shell_backend = E_SHELL_BACKEND (global_mail_shell_backend); activity = e_alert_activity_new_info (widget); e_shell_backend_add_activity (shell_backend, activity); g_object_unref (activity); if (g_object_get_data (G_OBJECT (widget), "response-handled") == NULL) g_signal_connect ( widget, "response", G_CALLBACK (gtk_widget_destroy), NULL); } gchar * em_utils_url_unescape_amp (const gchar *url) { gchar *buff; gint i, j, amps; if (!url) return NULL; amps = 0; for (i = 0; url [i]; i++) { if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0) amps++; } buff = g_strdup (url); if (!amps) return buff; for (i = 0, j = 0; url [i]; i++, j++) { buff [j] = url [i]; if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0) i += 4; } buff [j] = 0; return buff; }