=== modified file 'normal/menu_text.c' --- normal/menu_text.c 2009-11-23 20:59:24 +0000 +++ normal/menu_text.c 2009-11-27 23:58:34 +0000 @@ -39,7 +39,8 @@ static grub_uint8_t grub_color_menu_high void grub_wait_after_message (void) { - grub_printf ("\nPress any key to continue..."); + grub_putchar('\n'); + grub_printf (_("Press any key to continue...")); (void) grub_getkey (); grub_putchar ('\n'); } @@ -81,28 +82,107 @@ draw_border (void) } static void +print_spaces (int number_spaces) +{ + int i; + for (i = 0; i < number_spaces; i++) + grub_putchar(' '); +} + +static void +grub_print_ucs4 (grub_uint32_t* str, const grub_uint32_t* last_position) +{ + while (str < last_position) + { + grub_putcode(*str); + str++; + } +} + +print_message_indented(const char* msg) +{ + const int line_len = GRUB_TERM_WIDTH - 15; + + grub_uint32_t *unicode_msg; + + grub_ssize_t msg_len = grub_strlen(msg); + + unicode_msg = grub_malloc (msg_len * sizeof(*unicode_msg)); + + msg_len = grub_utf8_to_ucs4 (unicode_msg, msg_len, + (grub_uint8_t *) msg, -1, 0); + + if (! unicode_msg) + { + grub_printf("print_message_indented ERROR1: %s",msg); + return; + } + + if (msg_len < 0) + { + grub_printf("print_message_indented ERROR2: %s",msg); + grub_free (unicode_msg); + return; + } + + const grub_uint32_t* last_position = unicode_msg + msg_len; + + grub_uint32_t* current_position = unicode_msg; + + grub_uint32_t* next_new_line = unicode_msg; + + while (current_position < last_position) + { + next_new_line = (next_new_line + line_len > last_position) ? + (grub_uint32_t*)last_position : + next_new_line + line_len; + + while (*next_new_line != ' ' && next_new_line >= unicode_msg && + next_new_line != last_position) + { + next_new_line--; + } + + print_spaces(6); + grub_print_ucs4(current_position,next_new_line); + grub_putchar('\n'); + + next_new_line++; + current_position = next_new_line; + } + grub_free(unicode_msg); +} + +static void print_message (int nested, int edit) { grub_setcolorstate (GRUB_TERM_COLOR_NORMAL); - + + grub_putchar ('\n'); if (edit) { - grub_printf ("\n\ - Minimum Emacs-like screen editing is supported. TAB lists\n\ - completions. Press Ctrl-x to boot, Ctrl-c for a command-line\n\ - or ESC to return menu."); + print_message_indented(_("Minimum Emacs-like screen editing is \ +supported. TAB lists completions. Press Ctrl-x to boot, Ctrl-c for a \ +command-line or ESC to return menu.")); } else { - grub_printf (_("\n\ - Use the %C and %C keys to select which entry is highlighted.\n"), - (grub_uint32_t) GRUB_TERM_DISP_UP, (grub_uint32_t) GRUB_TERM_DISP_DOWN); - grub_printf ("\ - Press enter to boot the selected OS, \'e\' to edit the\n\ - commands before booting or \'c\' for a command-line."); + const char *msg = _("Use the %C and %C keys to select which \ +entry is highlighted."); + char* msg_translated = grub_malloc(sizeof(char) * grub_strlen(msg) + 1); + + grub_sprintf(msg_translated, msg, (grub_uint32_t) GRUB_TERM_DISP_UP, (grub_uint32_t) GRUB_TERM_DISP_DOWN); + print_message_indented(msg_translated); + + grub_free (msg_translated); + + print_message_indented(_("Press enter to boot the selected OS, \ +\'e\' to edit the commands before booting or \'c\' for a command-line.")); if (nested) - grub_printf ("\n\ - ESC to return previous menu."); + { + grub_printf ("\n "); + grub_printf(_("ESC to return previous menu.")); + } } } @@ -265,13 +345,16 @@ get_entry_number (const char *name) static void print_timeout (int timeout, int offset, int second_stage) { - /* NOTE: Do not remove the trailing space characters. - They are required to clear the line. */ - char *msg = " The highlighted entry will be booted automatically in %ds. "; + const char *msg = _("The highlighted entry will be booted automatically in %ds."); + const int msg_localized_len = grub_strlen (msg); + const int number_spaces = GRUB_TERM_WIDTH - msg_localized_len - 3; + char *msg_end = grub_strchr (msg, '%'); - grub_gotoxy (second_stage ? (msg_end - msg) : 0, GRUB_TERM_HEIGHT - 3); + grub_gotoxy (second_stage ? (msg_end - msg + 3) : 3, GRUB_TERM_HEIGHT - 3); grub_printf (second_stage ? msg_end : msg, timeout); + print_spaces (second_stage ? number_spaces : 0); + grub_gotoxy (GRUB_TERM_CURSOR_X, GRUB_TERM_FIRST_ENTRY_Y + offset); grub_refresh (); }; @@ -360,8 +443,7 @@ run_menu (grub_menu_t menu, int nested, if (timeout >= 0) { grub_gotoxy (0, GRUB_TERM_HEIGHT - 3); - grub_printf ("\ - "); + print_spaces (GRUB_TERM_WIDTH - 1); grub_env_unset ("timeout"); grub_env_unset ("fallback"); grub_gotoxy (GRUB_TERM_CURSOR_X, GRUB_TERM_FIRST_ENTRY_Y + offset); @@ -517,7 +599,9 @@ static void notify_booting (grub_menu_entry_t entry, void *userdata __attribute__((unused))) { - grub_printf (" Booting \'%s\'\n\n", entry->title); + grub_printf (" "); + grub_printf (_("Booting \'%s\'"), entry->title); + grub_printf ("\n\n"); } /* Callback invoked when a default menu entry executed because of a timeout @@ -527,7 +611,9 @@ static void notify_fallback (grub_menu_entry_t entry, void *userdata __attribute__((unused))) { - grub_printf ("\n Falling back to \'%s\'\n\n", entry->title); + grub_printf ("\n "); + grub_printf (_("Falling back to \'%s\'"), entry->title); + grub_printf ("\n\n"); grub_millisleep (DEFAULT_ENTRY_ERROR_DELAY_MS); } @@ -541,7 +627,9 @@ notify_execution_failure (void *userdata grub_print_error (); grub_errno = GRUB_ERR_NONE; } - grub_printf ("\n Failed to boot default entries.\n"); + grub_printf ("\n "); + grub_printf (_("Failed to boot default entries.")); + grub_putchar ('\n'); grub_wait_after_message (); }