poe

Уређивач .po фајлова
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 270f884152a572d74dc24709a68c5278e296ef3d
родитељ ee87d9d97269086554ccd990cb1a5b645ea1d267
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Tue,  6 Jul 2021 21:22:57 +0200

WIP search support; TODO: revise u32_draw_string wrt tabs

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mconfig.def.h | 4++++
Mconfig.h | 4++++
Mdraw.c | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mdraw.h | 9+++++++++
Mpo.h | 8++++----
Mpoe.1.in | 2+-
Mpoe.c | 459+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mtest/sr.po | 365++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
измењених датотека: 8, додавања: 710(+), брисања: 252(-)

diff --git a/config.def.h b/config.def.h @@ -39,6 +39,10 @@ #define MSGSTR_BG TB_DEFAULT #define PROMPT_FG TB_YELLOW | TB_BOLD #define PROMPT_BG TB_MAGENTA +#define SEARCH_FG TB_BLACK +#define SEARCH_BG TB_WHITE +#define SEARCH_EDIT_FG TB_WHITE | TB_BOLD +#define SEARCH_EDIT_BG TB_BLACK #define SHADOW_FG TB_BLACK #define SHADOW_BG TB_BLACK | TB_BOLD #define TITLE_FG TB_BLACK diff --git a/config.h b/config.h @@ -39,6 +39,10 @@ #define MSGSTR_BG TB_DEFAULT #define PROMPT_FG TB_YELLOW | TB_BOLD #define PROMPT_BG TB_MAGENTA +#define SEARCH_FG TB_BLACK +#define SEARCH_BG TB_WHITE +#define SEARCH_EDIT_FG TB_WHITE | TB_BOLD +#define SEARCH_EDIT_BG TB_BLACK #define SHADOW_FG TB_BLACK #define SHADOW_BG TB_BLACK | TB_BOLD #define TITLE_FG TB_BLACK diff --git a/draw.c b/draw.c @@ -82,32 +82,36 @@ void init_drawstate(struct DrawState* state, char* error, char* filename, char* prompt) { - state->error = error; - state->filename = filename; - state->input_buffer = NULL; - state->input_column = 0; - state->input_first_shown_column = 0; - state->input_first_shown_row = 0; - state->input_rows_count = 0; - state->input_display_column = 0; - state->saved_column = -1; - state->info_buffer = NULL; - state->info_first_shown_column = 0; - state->info_first_shown_row = 0; - state->info_rows_count = 0; - state->prompt = prompt; - state->prompt_callback = NULL; - state->running = 1; - state->dirty = 0; - state->in_prompt = 0; - state->show_help = 0; - state->show_edit = 0; - state->edit_info_focused = 0; - state->msgid_number = state->msgid_count > 0 ? 1 : 0; - state->fuzzy_count = 0; - state->untranslated_count = 0; - state->msgstr_index = 0; - state->first_shown_msgid = state->msgid_number; + state->error = error; + state->filename = filename; + state->search = NULL; + state->input_buffer = NULL; + state->input_column = 0; + state->input_first_shown_column = 0; + state->input_first_shown_row = 0; + state->input_rows_count = 0; + state->input_display_column = 0; + state->saved_column = -1; + state->info_buffer = NULL; + state->info_first_shown_column = 0; + state->info_first_shown_row = 0; + state->info_rows_count = 0; + state->search_input_column = 0; + state->search_input_first_shown_column = 0; + state->search_input_display_column = 0; + state->prompt = prompt; + state->prompt_callback = NULL; + state->running = 1; + state->dirty = 0; + state->in_prompt = 0; + state->show_help = 0; + state->show_edit = 0; + state->edit_info_focused = 0; + state->msgid_number = state->msgid_count > 0 ? 1 : 0; + state->fuzzy_count = 0; + state->untranslated_count = 0; + state->msgstr_index = 0; + state->first_shown_msgid = state->msgid_number; } void @@ -117,6 +121,9 @@ free_drawstate(struct DrawState* state) struct PoEntry* current_entry = NULL; size_t i = 0; + if (state->search) + free(state->search); + if (state->input_buffer) { for (i = 0; i < state->input_rows_count; i++) @@ -282,15 +289,17 @@ u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg, { if (*ps == '\t') { - for (int i = 0; i < TAB_SIZE - (col % TAB_SIZE); i++) - tb_change_cell(x+col+i+padding_left, y, ' ', + int i = 0; + for (i = 0; i < TAB_SIZE - (col % TAB_SIZE) + && col+i < max_cols-padding_right; i++) + tb_change_cell(x+padding_left+col+i, y, ' ', fg, bg); - col += TAB_SIZE - (col % TAB_SIZE); + col += i; ps++; } else { - tb_change_cell(x+col+padding_left, y, *ps, fg, bg); + tb_change_cell(x+padding_left+col, y, *ps, fg, bg); ps++; col++; } @@ -380,7 +389,7 @@ draw_editbox(const struct DrawState* state) curline->bg == 0 ? bg : curline->bg, curline->text + state->info_first_shown_column, - w-3, w-3, 1, 1, LEFT); + w-2, w-2, 1, 1, LEFT); } if (state->info_first_shown_row > 0) @@ -407,15 +416,15 @@ draw_editbox(const struct DrawState* state) u32_draw_string(startx+1, endy-h/2-1+i, fg, bg, curline->text + state->input_first_shown_column, - w-3, w-3, 1, 1, LEFT); + w-2, w-2, 1, 1, LEFT); } if (state->edit_info_focused) tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR); else tb_set_cursor(startx+2+state->input_display_column - - state->input_first_shown_column, endy-h/2-1 + - state->input_row - + state->input_first_shown_column, + endy-h/2-1 + state->input_row - state->input_first_shown_row); char sbuf[MAXBUFLINE]; @@ -446,6 +455,36 @@ draw_editbox(const struct DrawState* state) } const struct DrawState* +draw_search(const struct DrawState* state) +{ + int startx, endx, starty, endy; + int w = SEARCH_WIDTH; + int h = SEARCH_HEIGHT; + int maxx = state->maxx; + int maxy = state->maxy; + size_t len = u32_strlen(state->search); + + startx = w > maxx ? 0 : (maxx - w) / 2; + endx = w > maxx ? maxx-1 : maxx-startx; + + starty = maxy-1-h; + endy = maxy-1; + + draw_box(startx, endx, starty, endy, SEARCH_FG, SEARCH_BG); + draw_rect(startx+1, endx-1, starty+1, endy-2, SEARCH_EDIT_FG, + SEARCH_EDIT_BG); + if (len > state->search_input_first_shown_column) + u32_draw_string(startx+1, starty+1, + SEARCH_EDIT_FG, SEARCH_EDIT_BG, state->search + + state->search_input_first_shown_column, + w-3, w-3, 0, 0, LEFT); + tb_set_cursor(startx+1+state->search_input_display_column - + state->search_input_first_shown_column, + starty+1); + return state; +} + +const struct DrawState* draw_status(const struct DrawState* state) { if (!state) @@ -579,6 +618,10 @@ draw(const struct DrawState* state) if (!draw_editbox(state)) return NULL; + if (state->show_search) + if (!draw_search(state)) + return NULL; + if (!draw_status(state)) return NULL; diff --git a/draw.h b/draw.h @@ -14,7 +14,10 @@ #define EDIT_HEIGHT 20 #define HELP_WIDTH 50 #define HELP_HEIGHT 21 +#define SEARCH_WIDTH 15 +#define SEARCH_HEIGHT 4 #define TAB_SIZE 8 +#define MAXSEARCH (255+1) typedef enum { LEFT, @@ -33,6 +36,7 @@ struct DrawState { char* error; char* prompt; char* filename; + uint32_t* search; struct BufferLine* input_buffer; /* edit box */ int input_column; int input_row; @@ -47,6 +51,9 @@ struct DrawState { int info_first_shown_row; int info_rows_count; int info_rows_maxlen; + int search_input_column; + int search_input_first_shown_column; + int search_input_display_column; struct PoEntry* entries; void (*prompt_callback)(struct DrawState*, struct tb_event*); int running; @@ -56,6 +63,7 @@ struct DrawState { int show_help; int show_edit; int edit_info_focused; + int show_search; int maxx; int maxy; size_t msgid_number; @@ -97,6 +105,7 @@ void u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t const Alignment align); const struct DrawState* draw_help(const struct DrawState* state); const struct DrawState* draw_editbox(const struct DrawState* state); +const struct DrawState* draw_search(const struct DrawState* state); const struct DrawState* draw_status(const struct DrawState* state); const struct DrawState* draw_list_visible(const struct DrawState* state); const struct DrawState* draw(const struct DrawState* state); diff --git a/po.h b/po.h @@ -3,10 +3,10 @@ #include <stdint.h> #include <stdlib.h> -#define MSGSTR_MAX 4096 -#define MAXCOMMENTLINE 512 -#define ALLOC_DELTA 10 -#define PO_DETECTION_LINES 24 +#define MSGSTR_MAX 4096 +#define MAXCOMMENTLINE 512 +#define ALLOC_DELTA 10 +#define PO_DETECTION_LINES 24 #define LOAD_PARSE_ERR(e) (LOAD_ERR_PARSE_PREFIX + (e)) diff --git a/poe.1.in b/poe.1.in @@ -151,7 +151,7 @@ _ .SH "KNOWN LIMITATIONS" . .IP \(bu 4 -This project is currently (Jun 2021) still a work in progress. +This project is currently (July 2021) still a work in progress. . .IP \(bu CJK characters are unsupported/problematic. This is a limitation of termbox diff --git a/poe.c b/poe.c @@ -33,6 +33,18 @@ struct BufferLine* load_info(struct DrawState* state); struct BufferLine* load_msgstr(struct DrawState* state); void save_msgstr(struct DrawState* state); void cancel_msgstr(struct DrawState* state); +void show_search(struct DrawState* state); +void hide_search(struct DrawState* state); +void cancel_search(struct DrawState* state); +void move_search_start(struct DrawState* state); +void move_search_left(struct DrawState* state); +void move_search_right(struct DrawState* state); +void move_search_end(struct DrawState* state); +void insert_search_char(struct DrawState* state, uint32_t ch); +void erase_search_backwards(struct DrawState* state); +void erase_search_forward(struct DrawState* state); +void erase_search_to_start(struct DrawState* state); +void erase_search_to_end(struct DrawState* state); void next_untranslated(struct DrawState* state); void next_fuzzy(struct DrawState* state); void move_up(struct DrawState* state); @@ -50,15 +62,20 @@ void move_list_page_down(struct DrawState* state); void next_plural(struct DrawState* state); void prev_plural(struct DrawState* state); void toggle_fuzzy(struct DrawState* state); -size_t display_length(const struct DrawState* state, const size_t max_index); -size_t input_length(const struct DrawState* state, const size_t max_index); +size_t display_length(const struct DrawState* state, uint32_t* buffer, + const size_t max_index); +size_t input_length(const struct DrawState* state, uint32_t* buffer, + const size_t max_index); void insert_char(struct DrawState* state, uint32_t ch); +void erase_backwards(struct DrawState* state); +void erase_forward(struct DrawState* state); void erase_to_start(struct DrawState* state); void erase_to_end(struct DrawState* state); struct DrawState* insert_line(struct DrawState* state); struct DrawState* join_lines(struct DrawState* state, size_t first_line); void handle_editbox_key_event(struct tb_event* ev, struct DrawState* state); void handle_key_event(struct tb_event* ev, struct DrawState* state); +void handle_search_key_event(struct tb_event* ev, struct DrawState* state); int print_error(const int code, const char* msg, ...) @@ -435,11 +452,198 @@ cancel_msgstr(struct DrawState* state) } void +show_search(struct DrawState* state) +{ + state->show_search = 1; + state->search_input_column = 0; + state->search_input_display_column = 0; + state->search_input_first_shown_column = 0; + if (!state->search) + state->search = calloc(MAXSEARCH, sizeof(uint32_t)); + state->search[0] = 0; + tb_set_cursor((state->maxx-SEARCH_WIDTH+2)/2, + state->maxy-1-SEARCH_HEIGHT+1); +} + +void +hide_search(struct DrawState* state) +{ + state->show_search = 0; + tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR); +} + +void +cancel_search(struct DrawState* state) +{ + state->show_search = 0; + state->search[0] = 0; + tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR); +} + +void +move_search_start(struct DrawState* state) +{ + state->search_input_column = 0; + state->search_input_display_column = 0; + state->search_input_first_shown_column = 0; +} + +void +move_search_left(struct DrawState* state) +{ + if (state->search_input_column == 0) + return; + + if (state->search[state->search_input_column-1] == '\t') + state->search_input_display_column = display_length(state, + state->search, state->search_input_column-1); + else + state->search_input_display_column--; + state->search_input_column--; + + if (state->search_input_display_column < + state->search_input_first_shown_column) + state->search_input_first_shown_column = + state->search_input_display_column; +} + +void +move_search_right(struct DrawState* state) +{ + size_t len = u32_strlen(state->search); + if (state->search_input_column == len) + return; + + if (state->search[state->search_input_column] == '\t') + state->search_input_display_column = display_length(state, + state->search, state->search_input_column+1); + else + state->search_input_display_column++; + state->search_input_column++; + + if (state->search_input_display_column - + state->search_input_first_shown_column > SEARCH_WIDTH-3) + state->search_input_first_shown_column = + state->search_input_display_column - SEARCH_WIDTH+3; +} + +void +move_search_end(struct DrawState* state) +{ + size_t len = u32_strlen(state->search); + state->search_input_column = len; + size_t dlen = display_length(state, state->search, + state->search_input_column); + state->search_input_display_column = dlen; + if (dlen > SEARCH_WIDTH-3) + state->search_input_first_shown_column = dlen - SEARCH_WIDTH+3; + else + state->search_input_first_shown_column = 0; +} + +void +insert_search_char(struct DrawState* state, uint32_t ch) +{ + size_t len = u32_strlen(state->search); + if (state->search_input_column < MAXSEARCH-1) + { + size_t i = len; + int add_null = state->search[state->search_input_column] == 0; + while (i < MAXSEARCH-2 && i > state->search_input_column) + { + state->search[i] = state->search[i-1]; + i--; + } + state->search[state->search_input_column++] = ch; + if (state->search_input_column == MAXSEARCH) + state->search_input_column = MAXSEARCH-1; + state->search_input_display_column = display_length(state, + state->search, + state->search_input_column); + if (add_null) + state->search[state->search_input_column] = 0; + } + if (state->search_input_display_column - + state->search_input_first_shown_column > SEARCH_WIDTH-3) + state->search_input_first_shown_column = + state->search_input_display_column - SEARCH_WIDTH+3; +} + +void +erase_search_backwards(struct DrawState* state) +{ + if (state->search_input_column > 0) + { + size_t i = state->search_input_column; + do + { + state->search[i-1] = state->search[i]; + i++; + } + while (state->search[i]); + state->search[i-1] = 0; + state->search_input_column--; + if (state->search_input_column < + state->search_input_first_shown_column) + { + if (state->search_input_column > SEARCH_WIDTH-4) + state->search_input_first_shown_column = + state->search_input_column + - SEARCH_WIDTH+4; + else + state->search_input_first_shown_column = 0; + } + state->search_input_display_column = display_length(state, + state->search, + state->search_input_column); + } +} + +void +erase_search_forward(struct DrawState* state) +{ + if (state->search[state->search_input_column]) + { + size_t i = state->search_input_column; + while (i < MAXSEARCH-2 && state->search[i+1]) + { + state->search[i] = state->search[i+1]; + i++; + } + state->search[i] = 0; + } +} + +void +erase_search_to_start(struct DrawState* state) +{ + size_t i = state->search_input_column; + size_t len = u32_strlen(state->search); + do + { + state->search[i-state->search_input_column] = state->search[i]; + i++; + } + while (state->search[i]); + state->search[len-state->search_input_column] = 0; + move_search_start(state); +} + +void +erase_search_to_end(struct DrawState* state) +{ + state->search[state->search_input_column] = 0; + move_search_end(state); +} + +void next_untranslated(struct DrawState* state) { if (state->msgid_count == 0) return; + state->error[0] = 0; + struct PoEntry* current = NULL; for (size_t e = state->msgid_number; e < state->msgid_count; e++) { @@ -490,6 +694,8 @@ next_fuzzy(struct DrawState* state) if (state->msgid_count == 0) return; + state->error[0] = 0; + struct PoEntry* current = NULL; for (size_t e = state->msgid_number; e < state->msgid_count; e++) { @@ -550,19 +756,24 @@ move_up(struct DrawState* state) if (state->saved_column == -1) state->saved_column = state->input_display_column; size_t dlen = display_length(state, state->input_buffer[ - state->input_row].length); + state->input_row].text, + state->input_buffer[state->input_row].length); if (dlen < state->saved_column) state->input_display_column = dlen; else state->input_display_column = state->saved_column; - state->input_column = input_length(state, state->input_display_column); + state->input_column = input_length(state, state->input_buffer[ + state->input_row].text, + state->input_display_column); if (state->input_first_shown_column > state->input_display_column) state->input_first_shown_column = state->input_display_column; if (state->input_first_shown_column + EDIT_WIDTH-5 < state->input_display_column) state->input_first_shown_column = state->input_display_column - EDIT_WIDTH+5; - state->input_display_column = display_length(state, state->input_column); + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, + state->input_column); } void @@ -585,19 +796,24 @@ move_down(struct DrawState* state) if (state->saved_column == -1) state->saved_column = state->input_display_column; size_t dlen = display_length(state, state->input_buffer[ - state->input_row].length); + state->input_row].text, + state->input_buffer[state->input_row].length); if (dlen < state->saved_column) state->input_display_column = dlen; else state->input_display_column = state->saved_column; - state->input_column = input_length(state, state->input_display_column); + state->input_column = input_length(state, state->input_buffer[ + state->input_row].text, + state->input_display_column); if (state->input_first_shown_column > state->input_display_column) state->input_first_shown_column = state->input_display_column; if (state->input_first_shown_column + EDIT_WIDTH-5 < state->input_display_column) state->input_first_shown_column = state->input_display_column - EDIT_WIDTH+5; - state->input_display_column = display_length(state, state->input_column); + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, + state->input_column); } void @@ -630,7 +846,8 @@ move_left(struct DrawState* state) if (state->input_buffer[state->input_row].text[ state->input_column-1] == '\t') - state->input_display_column = display_length(state, + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, state->input_column-1); else state->input_display_column--; @@ -657,16 +874,17 @@ move_right(struct DrawState* state) if (state->input_buffer[state->input_row].text[ state->input_column] == '\t') - state->input_display_column = display_length(state, + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, state->input_column+1); else state->input_display_column++; state->input_column++; if (state->input_display_column - state->input_first_shown_column - > EDIT_WIDTH-5) + > EDIT_WIDTH-3) state->input_first_shown_column = state->input_display_column - - EDIT_WIDTH+5; + - EDIT_WIDTH+3; } void @@ -683,10 +901,11 @@ move_end(struct DrawState* state) size_t len = state->input_buffer[state->input_row].length; state->input_column = len; - size_t dlen = display_length(state, state->input_column); + size_t dlen = display_length(state, state->input_buffer[ + state->input_row].text, state->input_column); state->input_display_column = dlen; - if (dlen > EDIT_WIDTH-5) - state->input_first_shown_column = dlen - EDIT_WIDTH+5; + if (dlen > EDIT_WIDTH-3) + state->input_first_shown_column = dlen - EDIT_WIDTH+3; else state->input_first_shown_column = 0; } @@ -806,19 +1025,19 @@ toggle_fuzzy(struct DrawState* state) * max_index = the input index up to which the length is calculated */ size_t -display_length(const struct DrawState* state, const size_t max_index) +display_length(const struct DrawState* state, uint32_t* buffer, + const size_t max_index) { size_t len = 0; - size_t i = 0; - uint32_t* pbufline = state->input_buffer[state->input_row].text; - while (*pbufline && i < max_index) + uint32_t* pbuf = buffer; + + for (size_t i = 0; *pbuf && i < max_index; i++) { - if (*pbufline == '\t') + pbuf = buffer + i; + if (*pbuf == '\t') len += TAB_SIZE - (len % TAB_SIZE); else len++; - pbufline++; - i++; } return len; @@ -828,19 +1047,21 @@ display_length(const struct DrawState* state, const size_t max_index) * max_index = the display index up to which the length is calculated */ size_t -input_length(const struct DrawState* state, const size_t max_index) +input_length(const struct DrawState* state, uint32_t* buffer, + const size_t max_index) { size_t len = 0; + uint32_t* pbuf = buffer; size_t i = 0; - uint32_t* pbufline = state->input_buffer[state->input_row].text; - while (*pbufline && len < max_index) + + for (i = 0; *pbuf && len < max_index; i++) { - if (*pbufline == '\t') - len += TAB_SIZE - (len % TAB_SIZE); + pbuf = buffer + i; + if (*pbuf == '\t') + len += MIN(TAB_SIZE - (len % TAB_SIZE), + max_index - len); else len++; - pbufline++; - i++; } return i; @@ -866,7 +1087,8 @@ insert_char(struct DrawState* state, uint32_t ch) buffer_line->length++; if (state->input_column == MAXBUFLINE) state->input_column = MAXBUFLINE-1; - state->input_display_column = display_length(state, + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, state->input_column); if (add_null) buffer_line->text[state->input_column] = 0; @@ -879,6 +1101,71 @@ insert_char(struct DrawState* state, uint32_t ch) } void +erase_backwards(struct DrawState* state) +{ + struct BufferLine* buffer_line = &state->input_buffer[state->input_row]; + + if (state->input_column > 0) + { + size_t i = state->input_column; + do + { + buffer_line->text[i-1] = buffer_line->text[i]; + i++; + } + while (buffer_line->text[i]); + buffer_line->text[i-1] = 0; + buffer_line->length--; + state->input_column--; + if (state->input_column < + state->input_first_shown_column) + { + if (state->input_column > EDIT_WIDTH-6) + state->input_first_shown_column = + state->input_column + - EDIT_WIDTH+6; + else + state->input_first_shown_column = 0; + } + state->input_display_column = display_length(state, + state->input_buffer[ + state->input_row].text, + state->input_column); + } + else if (state->input_row > 0) + if (!join_lines(state, state->input_row-1)) + { + strcpy(state->error, errors[ERR_CANT_ALLOC]); + state->running = 0; + } +} + +void +erase_forward(struct DrawState* state) +{ + struct BufferLine* buffer_line = &state->input_buffer[state->input_row]; + + if (buffer_line->text[state->input_column]) + { + size_t i = state->input_column; + while (i < MAXBUFLINE-2 && buffer_line->text[i+1]) + { + buffer_line->text[i] = buffer_line->text[i+1]; + i++; + } + buffer_line->text[i] = 0; + buffer_line->length--; + state->dirty = 1; + } + else if (state->input_row < state->input_rows_count-1) + if (!join_lines(state, state->input_row)) + { + strcpy(state->error, errors[ERR_CANT_ALLOC]); + state->running = 0; + } +} + +void erase_to_start(struct DrawState* state) { if (state->edit_info_focused) @@ -963,7 +1250,8 @@ join_lines(struct DrawState* state, size_t first_line) return NULL; state->input_column = state->input_buffer[first_line].length; - state->input_display_column = display_length(state, + state->input_display_column = display_length(state, + state->input_buffer[state->input_row].text, state->input_column); u32_strncat(state->input_buffer[first_line].text, state->input_buffer[ first_line+1].text, MAXBUFLINE); @@ -998,8 +1286,6 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state) if (state->msgid_count < 1) return; - struct BufferLine* buffer_line = &state->input_buffer[state->input_row]; - if (state->error[0]) state->error[0] = 0; @@ -1018,39 +1304,7 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state) else if ((ev->key == TB_KEY_BACKSPACE || ev->key == TB_KEY_BACKSPACE2) && !state->edit_info_focused) - { - if (state->input_column > 0) - { - size_t i = state->input_column; - do - { - buffer_line->text[i-1] = buffer_line->text[i]; - i++; - } - while (buffer_line->text[i]); - buffer_line->text[i-1] = 0; - buffer_line->length--; - state->input_column--; - if (state->input_column < - state->input_first_shown_column) - { - if (state->input_column > EDIT_WIDTH-6) - state->input_first_shown_column = - state->input_column - - EDIT_WIDTH+6; - else - state->input_first_shown_column = 0; - } - state->input_display_column = display_length(state, - state->input_column); - } - else if (state->input_row > 0) - if (!join_lines(state, state->input_row-1)) - { - strcpy(state->error, errors[ERR_CANT_ALLOC]); - state->running = 0; - } - } + erase_backwards(state); else if (ev->key == TB_KEY_CTRL_K) erase_to_end(state); else if (ev->key == TB_KEY_CTRL_N) @@ -1070,26 +1324,7 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state) else if (ev->key == TB_KEY_CTRL_Z) toggle_fuzzy(state); else if (ev->key == TB_KEY_DELETE && !state->edit_info_focused) - { - if (buffer_line->text[state->input_column]) - { - size_t i = state->input_column; - while (i < MAXBUFLINE-2 && buffer_line->text[i+1]) - { - buffer_line->text[i] = buffer_line->text[i+1]; - i++; - } - buffer_line->text[i] = 0; - buffer_line->length--; - state->dirty = 1; - } - else if (state->input_row < state->input_rows_count-1) - if (!join_lines(state, state->input_row)) - { - strcpy(state->error, errors[ERR_CANT_ALLOC]); - state->running = 0; - } - } + erase_forward(state); else if (ev->key == TB_KEY_END || ev->key == TB_KEY_CTRL_E) move_end(state); @@ -1184,20 +1419,22 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) if (state->show_edit) handle_editbox_key_event(ev, state); + else if (state->show_search) + handle_search_key_event(ev, state); else if (ev->key == TB_KEY_ESC) { + if (state->error[0]) + state->error[0] = 0; if (state->in_prompt) { state->in_prompt = 0; state->prompt[0] = 0; return; } - if (state->error[0]) - state->error[0] = 0; - if (!(state->show_help || state->show_edit)) - strcpy(state->error, errors[ERR_EXIT_KEY]); - if (state->show_help) + else if (state->show_help) state->show_help = 0; + else + strcpy(state->error, errors[ERR_EXIT_KEY]); } else if ((ev->ch == 'y' || ev->ch == 'n') && state->in_prompt) { @@ -1218,6 +1455,7 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) } else state->running = 0; + state->error[0] = 0; } else if (state->show_help) strcpy(state->error, errors[ERR_DLG_OPEN]); @@ -1295,6 +1533,8 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) state->show_help = 1; state->error[0] = 0; } + else if (ev->key == TB_KEY_F7 || ev->ch == '/') + show_search(state); else if (ev->key == TB_KEY_F8 || ev->ch == 'u') next_untranslated(state); else if (ev->key == TB_KEY_F9 || ev->ch == 'F') @@ -1305,6 +1545,43 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) strcpy(state->error, errors[ERR_UNKNOWN_KEY]); } +void +handle_search_key_event(struct tb_event* ev, struct DrawState* state) +{ + if (!state) + return; + + if (ev->key == TB_KEY_ARROW_LEFT ) + move_search_left(state); + else if (ev->key == TB_KEY_ARROW_RIGHT) + move_search_right(state); + else if ((ev->key == TB_KEY_BACKSPACE + || ev->key == TB_KEY_BACKSPACE2)) + erase_search_backwards(state); + else if (ev->key == TB_KEY_CTRL_K) + erase_search_to_end(state); + else if (ev->key == TB_KEY_CTRL_U) + erase_search_to_start(state); + else if (ev->key == TB_KEY_DELETE) + erase_search_forward(state); + else if (ev->key == TB_KEY_END + || ev->key == TB_KEY_CTRL_E) + move_search_end(state); + else if (ev->key == TB_KEY_ENTER) + hide_search(state); + else if (ev->key == TB_KEY_ESC) + cancel_search(state); + else if (ev->key == TB_KEY_HOME + || ev->key == TB_KEY_CTRL_A) + move_search_start(state); + else if (ev->key == TB_KEY_SPACE) + insert_search_char(state, ' '); + else if (ev->key == TB_KEY_TAB) + insert_search_char(state, '\t'); + else + insert_search_char(state, ev->ch); +} + int main(int argc, char** argv) { diff --git a/test/sr.po b/test/sr.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: neomutt 20210205\n" "Report-Msgid-Bugs-To: neomutt-devel@neomutt.org\n" "POT-Creation-Date: 2021-06-19 23:57+0100\n" -"PO-Revision-Date: 2021-06-21 08:12+0200\n" +"PO-Revision-Date: 2021-07-06 14:33+0200\n" "Last-Translator: Страхиња Радић <contact@strahinja.org>\n" "Language-Team: Serbian <sr@li.org>\n" "Language: sr\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.0\n" +"X-Generator: poe v0.4.1-alpha-10-gee87d9d\n" #. L10N: prompt to add a new alias #: alias/alias.c:397 @@ -2075,18 +2075,24 @@ msgstr " („?“ за списак): " #: handler.c:94 #, c-format -msgid "[-- Type: %s/%s%s%s, Encoding: %s, Size: %s --]\n" -msgstr "[-- Врста: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n" +msgid "" +"[-- Type: %s/%s%s%s, Encoding: %s, Size: %s --]\n" +msgstr "" +"[-- Врста: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n" #: handler.c:100 #, c-format -msgid "[-- Alternative Type #%d: %s/%s%s%s, Encoding: %s, Size: %s --]\n" -msgstr "[-- Алтернативна врста #%d: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n" +msgid "" +"[-- Alternative Type #%d: %s/%s%s%s, Encoding: %s, Size: %s --]\n" +msgstr "" +"[-- Алтернативна врста #%d: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n" #: handler.c:554 #, c-format -msgid "[-- Autoview using %s --]\n" -msgstr "[-- Аутопреглед преко %s --]\n" +msgid "" +"[-- Autoview using %s --]\n" +msgstr "" +"[-- Аутопреглед преко %s --]\n" #: handler.c:555 #, c-format @@ -2099,17 +2105,23 @@ msgstr "Не може се креирати филтер" #: handler.c:589 #, c-format -msgid "[-- Can't run %s. --]\n" -msgstr "[-- Не може се покренути %s. --]\n" +msgid "" +"[-- Can't run %s. --]\n" +msgstr "" +"[-- Не може се покренути %s. --]\n" #: handler.c:615 handler.c:636 #, c-format -msgid "[-- Autoview stderr of %s --]\n" -msgstr "[-- Аутопреглед stderr-а наредбе %s --]\n" +msgid "" +"[-- Autoview stderr of %s --]\n" +msgstr "" +"[-- Аутопреглед stderr-а наредбе %s --]\n" #: handler.c:767 -msgid "[-- Error: message/external-body has no access-type parameter --]\n" -msgstr "[-- Грешка: message/external-body нема параметар access-type --]\n" +msgid "" +"[-- Error: message/external-body has no access-type parameter --]\n" +msgstr "" +"[-- Грешка: message/external-body нема параметар access-type --]\n" #. L10N: If the translation of this string is a multi line string, then #. each line should start with "[-- " and end with " --]". @@ -2160,11 +2172,16 @@ msgstr[2] "" #. mutt_str_pretty_size() in mutt/string.c. #: handler.c:834 #, c-format -msgid "[-- This %s/%s attachment (size %s byte) has been deleted --]\n" -msgid_plural "[-- This %s/%s attachment (size %s bytes) has been deleted --]\n" -msgstr[0] "[-- Овај %s/%s прилог (величине %s бајт) је обрисан --]\n" -msgstr[1] "[-- Овај %s/%s прилог (величине %s бајта) је обрисан --]\n" -msgstr[2] "[-- Овај %s/%s прилог (величине %s бајтова) је обрисан --]\n" +msgid "" +"[-- This %s/%s attachment (size %s byte) has been deleted --]\n" +msgid_plural "" +"[-- This %s/%s attachment (size %s bytes) has been deleted --]\n" +msgstr[0] "" +"[-- Овај %s/%s прилог (величине %s бајт) је обрисан --]\n" +msgstr[1] "" +"[-- Овај %s/%s прилог (величине %s бајта) је обрисан --]\n" +msgstr[2] "" +"[-- Овај %s/%s прилог (величине %s бајтова) је обрисан --]\n" #. L10N: If the translation of this string is a multi line string, then #. each line should start with "[-- " and end with " --]". @@ -2186,13 +2203,17 @@ msgstr "" #. The first "%s/%s" is a MIME type, e.g. "text/plain". #: handler.c:860 #, c-format -msgid "[-- This %s/%s attachment has been deleted --]\n" -msgstr "[-- Овај %s/%s прилог је обрисан --]\n" +msgid "" +"[-- This %s/%s attachment has been deleted --]\n" +msgstr "" +"[-- Овај %s/%s прилог је обрисан --]\n" #: handler.c:870 #, c-format -msgid "[-- name: %s --]\n" -msgstr "[-- назив: %s --]\n" +msgid "" +"[-- name: %s --]\n" +msgstr "" +"[-- назив: %s --]\n" #. L10N: If the translation of this string is a multi line string, then #. each line should start with "[-- " and end with " --]". @@ -2223,19 +2244,25 @@ msgstr "" "[-- а наведени access-type %s није подржан --]\n" #: handler.c:1102 -msgid "[-- Error: Could not display any parts of Multipart/Alternative --]\n" -msgstr "[-- Грешка: Не може се приказати ниједан од делова Multipart/Alternative --]\n" +msgid "" +"[-- Error: Could not display any parts of Multipart/Alternative --]\n" +msgstr "" +"[-- Грешка: Не може се приказати ниједан од делова Multipart/Alternative --]\n" #. L10N: %s is the attachment description, filename or form_name. #: handler.c:1245 #, c-format -msgid "[-- Attachment #%d: %s --]\n" -msgstr "[-- Прилог #%d: %s --]\n" +msgid "" +"[-- Attachment #%d: %s --]\n" +msgstr "" +"[-- Прилог #%d: %s --]\n" #: handler.c:1251 #, c-format -msgid "[-- Attachment #%d --]\n" -msgstr "[-- Прилог #%d --]\n" +msgid "" +"[-- Attachment #%d --]\n" +msgstr "" +"[-- Прилог #%d --]\n" #: handler.c:1270 msgid "One or more parts of this message could not be displayed" @@ -2260,35 +2287,47 @@ msgstr "Грешка: multipart/signed нема протокол" #. L10N: %s expands to a keystroke/key binding, e.g. 'v'. #: handler.c:1761 #, c-format -msgid "[-- This is an attachment (use '%s' to view this part) --]\n" -msgstr "[-- Ово је прилог (користите ‘%s’ да прегледате овај део) --]\n" +msgid "" +"[-- This is an attachment (use '%s' to view this part) --]\n" +msgstr "" +"[-- Ово је прилог (користите ‘%s’ да прегледате овај део) --]\n" #. L10N: %s/%s is a MIME type, e.g. "text/plain". #. The last %s expands to a keystroke/key binding, e.g. 'v'. #: handler.c:1768 #, c-format -msgid "[-- %s/%s is unsupported (use '%s' to view this part) --]\n" -msgstr "[-- %s/%s није подржан (користите „%s“ да прегледате овај део) --]\n" +msgid "" +"[-- %s/%s is unsupported (use '%s' to view this part) --]\n" +msgstr "" +"[-- %s/%s није подржан (користите „%s“ да прегледате овај део) --]\n" #: handler.c:1776 -msgid "[-- This is an attachment (need 'view-attachments' bound to key) --]\n" -msgstr "[-- Ово је прилог (потребно је „view-attachments“ доделити тастеру) --]\n" +msgid "" +"[-- This is an attachment (need 'view-attachments' bound to key) --]\n" +msgstr "" +"[-- Ово је прилог (потребно је „view-attachments“ доделити тастеру) --]\n" #. L10N: %s/%s is a MIME type, e.g. "text/plain". #: handler.c:1782 #, c-format -msgid "[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n" -msgstr "[-- %s/%s није подржан (потребно је „view-attachments“ доделити тастеру) --]\n" +msgid "" +"[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n" +msgstr "" +"[-- %s/%s није подржан (потребно је „view-attachments“ доделити тастеру) --]\n" #: handler.c:1791 -msgid "[-- This is an attachment --]\n" -msgstr "[-- Ово је прилог --]\n" +msgid "" +"[-- This is an attachment --]\n" +msgstr "" +"[-- Ово је прилог --]\n" #. L10N: %s/%s is a MIME type, e.g. "text/plain". #: handler.c:1796 #, c-format -msgid "[-- %s/%s is unsupported --]\n" -msgstr "[-- %s/%s није подржан --]\n" +msgid "" +"[-- %s/%s is unsupported --]\n" +msgstr "" +"[-- %s/%s није подржан --]\n" #: hcache/config.c:86 #, c-format @@ -3271,8 +3310,10 @@ msgid " neomutt [-n] [-e <command>] [-F <config>] -z [-f <mailbox>]" msgstr " neomutt [-n] [-e <наредба>] [-F <конфиг>] -z [-f <сандуче>]" #: main.c:179 -msgid " neomutt -v[v]\n" -msgstr " neomutt -v[v]\n" +msgid "" +" neomutt -v[v]\n" +msgstr "" +" neomutt -v[v]\n" #. L10N: Try to limit to 80 columns. If more space is needed add an indented line #: main.c:182 @@ -3658,13 +3699,17 @@ msgstr "Нема довољно подизраза за шаблон" #: mutt/signal.c:68 mutt/signal.c:70 mutt/signal.c:72 #, c-format -msgid "Caught signal %d (%s) ... Exiting\n" -msgstr "Ухваћен сигнал %d (%s) ... Излазак\n" +msgid "" +"Caught signal %d (%s) ... Exiting\n" +msgstr "" +"Ухваћен сигнал %d (%s) ... Излазак\n" #: mutt/signal.c:74 #, c-format -msgid "Caught signal %d ... Exiting\n" -msgstr "Ухваћен сигнал %d ... Излазак\n" +msgid "" +"Caught signal %d ... Exiting\n" +msgstr "" +"Ухваћен сигнал %d ... Излазак\n" #: mutt_attach.c:143 mutt_attach.c:278 msgid "Can't match 'nametemplate', continue?" @@ -3921,8 +3966,10 @@ msgstr " (текуће време: %c)" #: ncrypt/crypt.c:86 #, c-format -msgid "[-- %s output follows%s --]\n" -msgstr "[-- Излаз %s је у наставку%s --]\n" +msgid "" +"[-- %s output follows%s --]\n" +msgstr "" +"[-- Излаз %s је у наставку%s --]\n" #. L10N: Due to the implementation details (e.g. some passwords are managed #. by gpg-agent) we can't know whether we forgot zero, 1, 12, ... @@ -3965,8 +4012,10 @@ msgid "S/MIME messages with no hints on content are unsupported" msgstr "S/MIME поруке без назнака садржаја нису подржане" #: ncrypt/crypt.c:899 -msgid "Trying to extract PGP keys...\n" -msgstr "Покушај извлачења PGP кључева...\n" +msgid "" +"Trying to extract PGP keys...\n" +msgstr "" +"Покушај извлачења PGP кључева...\n" #: ncrypt/crypt.c:926 msgid "Trying to extract S/MIME certificates..." @@ -4063,8 +4112,10 @@ msgstr "тајни кључ ‘%s’ није пронађен: %s" #: ncrypt/crypt_gpgme.c:1016 #, c-format -msgid "ambiguous specification of secret key '%s'\n" -msgstr "двосмислена спецификација тајног кључа „%s“\n" +msgid "" +"ambiguous specification of secret key '%s'\n" +msgstr "" +"двосмислена спецификација тајног кључа „%s“\n" #: ncrypt/crypt_gpgme.c:1032 #, c-format @@ -4091,36 +4142,48 @@ msgid "$pgp_sign_as unset and no default key specified in ~/.gnupg/gpg.conf" msgstr "$pgp_sign_as није постављен а ниједан подразумевани кључ није задат у ~/.gnupg/gpg.conf" #: ncrypt/crypt_gpgme.c:1495 -msgid "Warning: One of the keys has been revoked\n" -msgstr "Упозорење: Један од кључева је повучен\n" +msgid "" +"Warning: One of the keys has been revoked\n" +msgstr "" +"Упозорење: Један од кључева је повучен\n" #: ncrypt/crypt_gpgme.c:1505 msgid "Warning: The key used to create the signature expired at: " msgstr "Упозорење: Кључ уз помоћ кога је креиран потпис је истекао дана: " #: ncrypt/crypt_gpgme.c:1511 -msgid "Warning: At least one certification key has expired\n" -msgstr "Упозорење: Бар један сертификациони кључ је истекао\n" +msgid "" +"Warning: At least one certification key has expired\n" +msgstr "" +"Упозорење: Бар један сертификациони кључ је истекао\n" #: ncrypt/crypt_gpgme.c:1525 msgid "Warning: The signature expired at: " msgstr "Упозорење: Потпис је истекао дана: " #: ncrypt/crypt_gpgme.c:1532 -msgid "Can't verify due to a missing key or certificate\n" -msgstr "Не може се верификовати због недостатка кључа или сертификата\n" +msgid "" +"Can't verify due to a missing key or certificate\n" +msgstr "" +"Не може се верификовати због недостатка кључа или сертификата\n" #: ncrypt/crypt_gpgme.c:1537 -msgid "The CRL is not available\n" -msgstr "CRL није доступан\n" +msgid "" +"The CRL is not available\n" +msgstr "" +"CRL није доступан\n" #: ncrypt/crypt_gpgme.c:1543 -msgid "Available CRL is too old\n" -msgstr "Доступни CRL је престар\n" +msgid "" +"Available CRL is too old\n" +msgstr "" +"Доступни CRL је престар\n" #: ncrypt/crypt_gpgme.c:1548 -msgid "A policy requirement was not met\n" -msgstr "Није испуњен услов полисе\n" +msgid "" +"A policy requirement was not met\n" +msgstr "" +"Није испуњен услов полисе\n" #: ncrypt/crypt_gpgme.c:1557 msgid "A system error occurred" @@ -4139,16 +4202,22 @@ msgid "Fingerprint: " msgstr "Отисак: " #: ncrypt/crypt_gpgme.c:1678 -msgid "WARNING: We have NO indication whether the key belongs to the person named as shown above\n" -msgstr "УПОЗОРЕЊЕ: НЕ постоје индиције да кључ припада наведеној особи\n" +msgid "" +"WARNING: We have NO indication whether the key belongs to the person named as shown above\n" +msgstr "" +"УПОЗОРЕЊЕ: НЕ постоје индиције да кључ припада наведеној особи\n" #: ncrypt/crypt_gpgme.c:1685 -msgid "WARNING: The key does NOT BELONG to the person named as shown above\n" -msgstr "УПОЗОРЕЊЕ: Кључ НЕ ПРИПАДА наведеној особи\n" +msgid "" +"WARNING: The key does NOT BELONG to the person named as shown above\n" +msgstr "" +"УПОЗОРЕЊЕ: Кључ НЕ ПРИПАДА наведеној особи\n" #: ncrypt/crypt_gpgme.c:1689 -msgid "WARNING: It is NOT certain that the key belongs to the person named as shown above\n" -msgstr "УПОЗОРЕЊЕ: НИЈЕ извесно да кључ припада наведеној особи\n" +msgid "" +"WARNING: It is NOT certain that the key belongs to the person named as shown above\n" +msgstr "" +"УПОЗОРЕЊЕ: НИЈЕ извесно да кључ припада наведеној особи\n" #: ncrypt/crypt_gpgme.c:1725 ncrypt/crypt_gpgme.c:1730 ncrypt/dlggpgme.c:94 msgid "aka: " @@ -4170,8 +4239,10 @@ msgstr "креиран: " #: ncrypt/crypt_gpgme.c:1838 #, c-format -msgid "Error getting key information for KeyID %s: %s\n" -msgstr "Грешка приликом добављања података о кључу за ИБКључа %s: %s\n" +msgid "" +"Error getting key information for KeyID %s: %s\n" +msgstr "" +"Грешка приликом добављања података о кључу за ИБКључа %s: %s\n" #: ncrypt/crypt_gpgme.c:1845 ncrypt/crypt_gpgme.c:1860 msgid "Good signature from:" @@ -4192,22 +4263,30 @@ msgid " expires: " msgstr " истиче: " #: ncrypt/crypt_gpgme.c:1929 ncrypt/crypt_gpgme.c:2162 ncrypt/crypt_gpgme.c:2956 -msgid "[-- Begin signature information --]\n" -msgstr "[-- Почетак информација о потпису --]\n" +msgid "" +"[-- Begin signature information --]\n" +msgstr "" +"[-- Почетак информација о потпису --]\n" #: ncrypt/crypt_gpgme.c:1940 #, c-format -msgid "Error: verification failed: %s\n" -msgstr "Грешка: верификација неуспешна: %s\n" +msgid "" +"Error: verification failed: %s\n" +msgstr "" +"Грешка: верификација неуспешна: %s\n" #: ncrypt/crypt_gpgme.c:1991 #, c-format -msgid "*** Begin Notation (signature by: %s) ***\n" -msgstr "*** Почетак нотације (потпис од: %s) ***\n" +msgid "" +"*** Begin Notation (signature by: %s) ***\n" +msgstr "" +"*** Почетак нотације (потпис од: %s) ***\n" #: ncrypt/crypt_gpgme.c:2010 -msgid "*** End Notation ***\n" -msgstr "*** Крај нотације ***\n" +msgid "" +"*** End Notation ***\n" +msgstr "" +"*** Крај нотације ***\n" #: ncrypt/crypt_gpgme.c:2018 ncrypt/crypt_gpgme.c:2176 ncrypt/crypt_gpgme.c:2966 msgid "" @@ -4233,16 +4312,20 @@ msgstr "Грешка приликом увоза кључа: %s" #: ncrypt/crypt_gpgme.c:2930 #, c-format -msgid "Error: decryption/verification failed: %s\n" -msgstr "Грешка: неуспешно дешифровање/верификација: %s\n" +msgid "" +"Error: decryption/verification failed: %s\n" +msgstr "" +"Грешка: неуспешно дешифровање/верификација: %s\n" #: ncrypt/crypt_gpgme.c:2937 ncrypt/crypt_gpgme.c:3136 ncrypt/pgp.c:731 ncrypt/pgp.c:1281 msgid "PGP message successfully decrypted" msgstr "PGP порука успешно дешифрована" #: ncrypt/crypt_gpgme.c:2978 -msgid "Error: copy data failed\n" -msgstr "Грешка: неуспешно копирање података\n" +msgid "" +"Error: copy data failed\n" +msgstr "" +"Грешка: неуспешно копирање података\n" #: ncrypt/crypt_gpgme.c:2991 ncrypt/pgp.c:678 msgid "" @@ -4253,8 +4336,10 @@ msgstr "" "\n" #: ncrypt/crypt_gpgme.c:2993 ncrypt/pgp.c:680 -msgid "[-- BEGIN PGP PUBLIC KEY BLOCK --]\n" -msgstr "[-- ПОЧЕТАК PGP БЛОКА ЈАВНОГ КЉУЧА --]\n" +msgid "" +"[-- BEGIN PGP PUBLIC KEY BLOCK --]\n" +msgstr "" +"[-- ПОЧЕТАК PGP БЛОКА ЈАВНОГ КЉУЧА --]\n" #: ncrypt/crypt_gpgme.c:2995 ncrypt/pgp.c:682 msgid "" @@ -4265,16 +4350,22 @@ msgstr "" "\n" #: ncrypt/crypt_gpgme.c:3022 ncrypt/pgp.c:720 -msgid "[-- END PGP MESSAGE --]\n" -msgstr "[-- КРАЈ PGP ПОРУКЕ --]\n" +msgid "" +"[-- END PGP MESSAGE --]\n" +msgstr "" +"[-- КРАЈ PGP ПОРУКЕ --]\n" #: ncrypt/crypt_gpgme.c:3024 ncrypt/pgp.c:734 -msgid "[-- END PGP PUBLIC KEY BLOCK --]\n" -msgstr "[-- КРАЈ PGP БЛОКА ЈАВНОГ КЉУЧА --]\n" +msgid "" +"[-- END PGP PUBLIC KEY BLOCK --]\n" +msgstr "" +"[-- КРАЈ PGP БЛОКА ЈАВНОГ КЉУЧА --]\n" #: ncrypt/crypt_gpgme.c:3026 ncrypt/pgp.c:736 -msgid "[-- END PGP SIGNED MESSAGE --]\n" -msgstr "[-- КРАЈ PGP ПОТПИСАНЕ ПОРУКЕ --]\n" +msgid "" +"[-- END PGP SIGNED MESSAGE --]\n" +msgstr "" +"[-- КРАЈ PGP ПОТПИСАНЕ ПОРУКЕ --]\n" #: ncrypt/crypt_gpgme.c:3047 ncrypt/pgp.c:769 msgid "" @@ -4285,8 +4376,10 @@ msgstr "" "\n" #: ncrypt/crypt_gpgme.c:3075 ncrypt/crypt_gpgme.c:3175 ncrypt/pgp.c:1226 -msgid "[-- Error: could not create temporary file --]\n" -msgstr "[-- Грешка: не може се креирати привремена датотека --]\n" +msgid "" +"[-- Error: could not create temporary file --]\n" +msgstr "" +"[-- Грешка: не може се креирати привремена датотека --]\n" #: ncrypt/crypt_gpgme.c:3089 msgid "" @@ -4305,12 +4398,16 @@ msgstr "" "\n" #: ncrypt/crypt_gpgme.c:3131 -msgid "[-- End of PGP/MIME signed and encrypted data --]\n" -msgstr "[-- Крај података потписаних и шифрованих преко PGP/MIME-а --]\n" +msgid "" +"[-- End of PGP/MIME signed and encrypted data --]\n" +msgstr "" +"[-- Крај података потписаних и шифрованих преко PGP/MIME-а --]\n" #: ncrypt/crypt_gpgme.c:3132 ncrypt/pgp.c:1276 -msgid "[-- End of PGP/MIME encrypted data --]\n" -msgstr "[-- Крај података шифрованих преко PGP/MIME-а --]\n" +msgid "" +"[-- End of PGP/MIME encrypted data --]\n" +msgstr "" +"[-- Крај података шифрованих преко PGP/MIME-а --]\n" #: ncrypt/crypt_gpgme.c:3144 ncrypt/pgp.c:669 ncrypt/pgp.c:722 ncrypt/pgp.c:1285 postpone.c:687 msgid "Could not decrypt PGP message" @@ -4333,12 +4430,16 @@ msgstr "" "\n" #: ncrypt/crypt_gpgme.c:3237 -msgid "[-- End of S/MIME signed data --]\n" -msgstr "[-- Крај података потписаних преко S/MIME-а --]\n" +msgid "" +"[-- End of S/MIME signed data --]\n" +msgstr "" +"[-- Крај података потписаних преко S/MIME-а --]\n" #: ncrypt/crypt_gpgme.c:3238 -msgid "[-- End of S/MIME encrypted data --]\n" -msgstr "[-- Крај података шифрованих преко S/MIME-а --]\n" +msgid "" +"[-- End of S/MIME encrypted data --]\n" +msgstr "" +"[-- Крај података шифрованих преко S/MIME-а --]\n" #: ncrypt/crypt_gpgme.c:3421 ncrypt/crypt_gpgme.c:3472 #, c-format @@ -4529,11 +4630,16 @@ msgstr "[Неисправно]" #. L10N: This is printed after "Key Type: " and looks like this: PGP, 2048 bit RSA #: ncrypt/dlggpgme.c:665 ncrypt/dlggpgme.c:806 #, c-format -msgid "%s, %lu bit %s\n" -msgid_plural "%s, %lu bit %s\n" -msgstr[0] "%s, %lu-битни %s\n" -msgstr[1] "%s, %lu-битни %s\n" -msgstr[2] "%s, %lu-битни %s\n" +msgid "" +"%s, %lu bit %s\n" +msgid_plural "" +"%s, %lu bit %s\n" +msgstr[0] "" +"%s, %lu-битни %s\n" +msgstr[1] "" +"%s, %lu-битни %s\n" +msgstr[2] "" +"%s, %lu-битни %s\n" #. L10N: value in Key Usage: field #: ncrypt/dlggpgme.c:673 ncrypt/dlggpgme.c:813 @@ -4575,12 +4681,16 @@ msgstr "Прикупљање података..." #: ncrypt/dlggpgme.c:868 #, c-format -msgid "Error finding issuer key: %s\n" -msgstr "Грешка приликом потраге за кључем издавача: %s\n" +msgid "" +"Error finding issuer key: %s\n" +msgstr "" +"Грешка приликом потраге за кључем издавача: %s\n" #: ncrypt/dlggpgme.c:877 -msgid "Error: certification chain too long - stopping here\n" -msgstr "Грешка: ланац сертификовања је предугачак — стајем\n" +msgid "" +"Error: certification chain too long - stopping here\n" +msgstr "" +"Грешка: ланац сертификовања је предугачак — стајем\n" #: ncrypt/dlggpgme.c:888 ncrypt/dlgpgp.c:628 #, c-format @@ -4736,8 +4846,10 @@ msgid "Enter PGP passphrase:" msgstr "Унесите PGP приступну фразу:" #: ncrypt/pgp.c:598 -msgid "[-- Error: unable to create PGP subprocess --]\n" -msgstr "[-- Грешка: не може се креирати PGP потпроцес --]\n" +msgid "" +"[-- Error: unable to create PGP subprocess --]\n" +msgstr "" +"[-- Грешка: не може се креирати PGP потпроцес --]\n" #: ncrypt/pgp.c:645 ncrypt/pgp.c:931 ncrypt/pgp.c:1091 msgid "" @@ -4915,16 +5027,22 @@ msgstr "" "\n" #: ncrypt/smime.c:1904 ncrypt/smime.c:1917 -msgid "[-- Error: unable to create OpenSSL subprocess --]\n" -msgstr "[-- Грешка: не може се креирати OpenSSL потпроцес --]\n" +msgid "" +"[-- Error: unable to create OpenSSL subprocess --]\n" +msgstr "" +"[-- Грешка: не може се креирати OpenSSL потпроцес --]\n" #: ncrypt/smime.c:1953 -msgid "[-- The following data is S/MIME encrypted --]\n" -msgstr "[-- Следећи подаци су шифровани преко S/MIME-а --]\n" +msgid "" +"[-- The following data is S/MIME encrypted --]\n" +msgstr "" +"[-- Следећи подаци су шифровани преко S/MIME-а --]\n" #: ncrypt/smime.c:1956 -msgid "[-- The following data is S/MIME signed --]\n" -msgstr "[-- Следећи подаци су потписани преко S/MIME-а --]\n" +msgid "" +"[-- The following data is S/MIME signed --]\n" +msgstr "" +"[-- Следећи подаци су потписани преко S/MIME-а --]\n" #: ncrypt/smime.c:2049 msgid "" @@ -7061,8 +7179,10 @@ msgstr "Поставите променљиву hostname на исправну #: remailer.c:923 #, c-format -msgid "Error sending message, child exited %d\n" -msgstr "Грешка приликом слања поруке, подређени процес је изашао %d\n" +msgid "" +"Error sending message, child exited %d\n" +msgstr "" +"Грешка приликом слања поруке, подређени процес је изашао %d\n" #: remailer.c:927 msgid "Error sending message" @@ -7407,3 +7527,4 @@ msgstr "Подразумеване опције:" #: version.c:514 msgid "Compile options:" msgstr "Опције за компајлирање:" +